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

DMA及中断

    • 中断
      • 中断配置
      • 中断函数示例
    • DMA
      • DMA通道寄存器功能
      • DMA通道初始化
      • 代码示例
    • DMA处理中断

下面是个人理解,可能有些问题(小白第一次接触底层)

中断

TC264中的中断分为软件中断和硬件中断,就不管软件中断了,暂时用不到,主要介绍硬件中断。
TC264的可触发的硬件中断在手册中可见:
TC264(手册学习笔记)DMA及中断_第1张图片
在TC264中,中断的函数名是随意点,链接对应函数是靠他的优先级的,每个优先级都各自对应一个中断向量用于向中断服务函数的跳转,从而组成一个容量为256的中断向量表。
可以理解为,中断的优先级就是一个向量数组的下表,然后这个向量数组存储的中断函数的地址,当中断被触发时,他就转跳到你的处理函数去了。

中断配置

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

  1. 中断的处理位置:在TOS设置,可选择的有CPU0/1、DMA,具体看手册。
  2. 中断的优先级:在SRPN中设置,如果是在CPU中处理,那么该为表示中断的优先级,如果用DMA处理,那么表示DMA通道的选择(0~47)。

然后就是配置中断对应的寄存器。
下面用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);

中断函数示例

IFX_INTERRUPT(uart0_tx_isr, 0, UART0_TX_INT_PRIO)
{
     
    IfxAsclin_Asc_isrTransmit(&uart0_handle);
}

IFX_INTERRUPT是一个宏,具体可以看一看他的定义。

DMA

TC264中一共有48个DMA通道,其中47优先级最高。

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

DMA通道寄存器功能

  • 状态寄存器CHSR:传输次数、中断状态等
  • 控制寄存器CHCR:
  • 地址和中断控制寄存器:
  • shadow地址寄存器:shadow存储了下一次传输源地址或者目标地址(由寄存器配置决定,具体看手册)
  • 目标地址寄存器
  • 源地址寄存器
  • 源地址和目标地址控制寄存器

因为官方给的底层库,可以直接通过结构体配置DMA通道功能,所以减小一些手册的阅读难度。

DMA通道初始化

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

代码示例

	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);

配置根据自己需求来。

DMA处理中断

具体代码就不贴出来了。
总的思路就是:

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

参考资料:

  1. https://www.cnblogs.com/uestcliming666/p/12308428.html
  2. 英飞凌的文档。

你可能感兴趣的:(单片机,嵌入式,物联网,单片机)