打印
[其它产品/技术]

TC264(手册学习笔记)DMA及中断

[复制链接]
1008|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qsrg51|  楼主 | 2024-2-29 14:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
中断

TC264中的中断分为软件中断和硬件中断,就不管软件中断了,暂时用不到,主要介绍硬件中断。
TC264的可触发的硬件中断在手册中可见:

在TC264中,中断的函数名是随意点,链接对应函数是靠他的优先级的,每个优先级都各自对应一个中断向量用于向中断服务函数的跳转,从而组成一个容量为256的中断向量表。

可以理解为,中断的优先级就是一个向量数组的下表,然后这个向量数组存储的中断函数的地址,当中断被触发时,他就转跳到你的处理函数去了。


中断配置

主要配置的是中断的优先级和中断的处理位置


中断的处理位置:在TOS设置,可选择的有CPU0/1、DMA,具体看手册。

中断的优先级:在SRPN中设置,如果是在CPU中处理,那么该为表示中断的优先级,如果用DMA处理,那么表示DMA通道的选择(0~47)。

然后就是配置中断对应的寄存器。





使用特权

评论回复
沙发
qsrg51|  楼主 | 2024-2-29 14:15 | 只看该作者
下面用uart中断示例:(不得不说官方的库还是挺齐全的)
        volatile Ifx_SRC_SRCR *src;
        src = IfxAsclin_getSrcPointerTx(ascConfig.asclin);//获取对应寄存器地址

        IfxSrc_init(src, IfxSrc_Tos_cpu0, 10);

        IfxAsclin_enableTxFifoFillLevelFlag(ascConfig.asclin, TRUE);
        IfxSrc_enable(src);

使用特权

评论回复
板凳
qsrg51|  楼主 | 2024-2-29 14:15 | 只看该作者
中断函数示例
IFX_INTERRUPT(uart0_tx_isr, 0, UART0_TX_INT_PRIO)
{
    IfxAsclin_Asc_isrTransmit(&uart0_handle);
}
IFX_INTERRUPT是一个宏,具体可以看一看他的定义。

使用特权

评论回复
地板
qsrg51|  楼主 | 2024-2-29 14:15 | 只看该作者
DMA
TC264中一共有48个DMA通道,其中47优先级最高。

DMA也可以由软件和硬件触发,这里也只介绍硬件触发。(等有空了再补充软件触发)

DMA通道寄存器功能
状态寄存器CHSR:传输次数、中断状态等
控制寄存器CHCR:
地址和中断控制寄存器:
shadow地址寄存器:shadow存储了下一次传输源地址或者目标地址(由寄存器配置决定,具体看手册)
目标地址寄存器
源地址寄存器
源地址和目标地址控制寄存器
因为官方给的底层库,可以直接通过结构体配置DMA通道功能,所以减小一些手册的阅读难度。

DMA通道初始化
主要是配置DMA的优先级、处理位置、触发源以及目标、源地址。
地址的增减变化具体看手册。

使用特权

评论回复
5
qsrg51|  楼主 | 2024-2-29 14:16 | 只看该作者
代码示例
        IfxDma_Dma_Config dmaConfig;
        IfxDma_Dma_initModuleConfig(&dmaConfig, &MODULE_DMA);

        IfxDma_Dma dma;
        IfxDma_Dma_initModule(&dma, &dmaConfig);

        IfxDma_Dma_ChannelConfig cfg;
        IfxDma_Dma_initChannelConfig(&cfg, &dma);
        /*************** 源地址和目标地址 ***************/
        cfg.sourceCircularBufferEnabled = FALSE;                                                                                               
        cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none;
        cfg.sourceAddressIncrementStep = IfxDma_ChannelIncrementStep_1;                                                       

        cfg.destinationCircularBufferEnabled = TRUE;
        cfg.destinationAddressCircularRange = IfxDma_ChannelIncrementCircular_none;
        cfg.channelInterruptTypeOfService = IfxSrc_Tos_cpu0;
        IfxDma_Dma_initChannel(&dmaChn_uart, &cfg);

使用特权

评论回复
6
qsrg51|  楼主 | 2024-2-29 14:16 | 只看该作者
配置根据自己需求来。

DMA处理中断
具体代码就不贴出来了。
总的思路就是:

初始化中断,并将其初始化为DMA处理(注意初始化时候的优先级是DMA的通道)。
初始化DMA,这里是否触发中断啥的根据自己的需求来。



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

395

帖子

2

粉丝