AURIX TC3XX系列之IR模块

一、中断简介

        什么是中断?程序运行过程中,系统外部、系统内部或者现行程序本身若出现更高优先级事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。中断提升了系统的实时性,提升了系统的工作协调能力及工作效率。

        广义的中断概念包括以下几个关键要素:

  • 中断请求(Interrupt Request,IRQ): 外部设备或系统内部产生中断时,会向计算机发送中断请求。每个中断源通常有一个唯一的IRQ号。
  • 中断向量表(Interrupt Vector Table,IVT): 计算机维护一个中断向量表,其中存储了每个可能中断的处理程序的地址。当中断发生时,计算机通过查找中断向量表找到相应中断的处理程序。
  • 中断服务程序(Interrupt Service Routine,ISR): 中断服务程序是一段特定的代码,用于处理特定中断类型。当中断发生时,控制权会转移到相应中断的ISR,执行相关操作。
  • 中断控制器(InterruptController): 中断控制器负责管理和协调各个中断源,确保按照优先级处理中断。常见的中断控制器包括 PIC(Programmable Interrupt Controller)和 APIC(Advanced Programmable Interrupt Controller)。

        TC3XX系列MCU中断采用中断路由的方式,将硬件中断源和CPU、DMA进行灵活的连接,具有较高的中断实时性

二、功能介绍

中断系统

        TC3XX的中断系统涉及到中断控制器,CPU,DMA,外设。

        中断系统框图如上图所示:主要包含以下三部分:

  • 中断请求:可以外设/外部信号/软件来触发;
  • 中断路由:根据配置的中断优先级进行中断仲裁,主要包含服务请求节点SRN,中断控制单元ICU,外设总线接口BPI。
  • 中断提供者:中断的服务对象,可以是CPU(中断服务),也可以是DMA(使能通道转换),当服务对象是DMA时,就可以解放CPU的算力,例如ADC/SPI中断触发DMA搬运。

服务请求控制寄存器SRC

        每个服务请求节点SRN对应一个中断请求。每个SRN都有一个服务请求控制寄存器SRC,可以说是IR中最重要的寄存器,调试时也时常为我们提供帮助。

  • SRPN(Service Request Priority Number):服务请求优先级,它决定了服务请求在IR中仲裁的结果;当服务提供者是DMA时,它表示的是DMA通道号;
  • SRE(Enable Bit):中断使能位,决定IR是否将该请求路由到对应的服务提供者,如果使能位没有打开,也可以通过软件轮询SRR中断状态位来执行对应服务例程;
  • TOS(Type-Of-Service Control):服务类型控制,也就是选择将服务路由到哪个ICU中,是CPU还是DMA;
  • SRR(Service Request Flag):中断标志位,该位在服务提供者响应服务的时候会自动清除,所以不需要软件去清除中断标志位,但如果没有打开SRE使用的轮询,则需要每次执行后用CLRR清除中断标志位;
  • CLRR(Clear Bits):中断标志清除位,用来清除SRR,读的话一直是0;
  • SETR(Set Bits):软件中断请求位,通过软件请求一次中断;
  • IOV(Interrupt Trigger Overflow Bit):中断溢出标志位,如果一个中断没有被接收或者清除,又进行了一次触发,则该位会置位;
  • IOVCLR(Interrupt Trigger Overflow Clear Bit):中断溢出标志清除位,清除中断溢出标志,读的话一直是0
  • SWS(SW Sticky Bit):软请求粘滞位,如果调用过SETR接口进行过软触发,则该位会置位直到清除;
  • SWSCLR(SW Sticky Clear Bit):软请求粘滞清除位,用来清除软请求粘滞位,读的话一直是0;

中断控制寄存器ICU

        每个SRN的服务请求会路由到一个ICU中,一个ICU连接一个CPU或者DMA,共7个ICU。每个ICU内部进行服务请求的仲裁,并将仲裁的结果发送到相应的服务提供者。

ICU中断控制寄存器ICR

        ICR是CPU主要的中断控制寄存器,包括全局中断使能位IE,当前CPU中断优先级CCPN,以及等待中断优先级位PIPN,RES为保留位。

  • IE(Global Interrupt Enable Bit):全局中断使能位,我们所使用的关闭所有中断操作,就是将该位置0,因为每个CPU是独立的,也有自己的ICR控制器,所以IE只控制当前核的中断开关;
  • CCPN(Current CPU Priority Number):当前CPU中断优先级,在非中断程序执行时,该位为0,进入中断时,该位会被硬件设置为所触发中断的优先级;
  • PIPN(Pending Interrupt Priority Number):等待中断优先级,表征当前CPU收到IR路由但还未处理的中断优先级;

中断向量表

        介绍中断向量表之前先介绍一下中断向量表指针BIV

  • BIV(Base Address of Interrupt Vector Table):中断向量表基址,中断向量表是存放在Flash中的连续地址,该寄存器来表示向量表基地址;
  • VSS(Vector Spacing Select):向量空间选择位,该位表征每个中断向量所占的内存空间,0表示每个中断向量占据32字节,1表示8字节,默认为32字节;

        TC3XX的中断向量表存放在PFlash(代码段)中的一段连续地址中,默认一个向量的存储空间是8 word(32字节)(Tricore 1.6可以选择32还是8 Byte, Tricore 1.3只能32 Byte),BIV指向基地址。VSS为0时,中断的向量地址为:BIV+N*32。(N表示中断优先级)。一般情况下,32字节向量空间用来放置跳转指令。另一种方式是代码量不大,通过占据连续的优先级方式,节省一次跳转,如下图,优先级2中断触发,3-5的位置也被占用了。

三、实战演练

MCAL配置

        如上图所示,配置为一类中断,中断源为TOM1_8或者TOM1_9(SR0对应通道0和通道1,以此类推),服务提供者为CPU3。

代码编写

        首先进行初始化和中断使能,初始化一般放在EcuM_AL_DriverInitOne里,中断使能可以放在相应的模块(如果在OS里配置了,那么OS初始化中断向量表时会使能中断)。伪代码如下:

IrqGtm_Init();

SRC_GTMTOM14.B.SRE = 1;

        再对中断函数进行编址,并调用中断服务函数,以Tasking为例
 

#define IFX_INTERRUPT(isr, vectabNum, prio) \
                    void __interrupt(prio) __vector_table(vectabNum) isr(void)


    #if (IRQ_GTM_TOM1_EXIST == (STD_ON))
        #if IRQ_GTM_TOM1_SR4_TOS != IRQ_TOS_DMA
            #if((IRQ_GTM_TOM1_SR4_PRIO > 0) || (IRQ_GTM_TOM1_SR4_CAT == IRQ_CAT2))
                #if((IRQ_GTM_TOM1_SR4_PRIO > 0) && (IRQ_GTM_TOM1_SR4_CAT == IRQ_CAT1))
                    #if(IRQ_GTM_TOM1_SR4_TOS==IRQ_TOS_CPU0)
                        IFX_INTERRUPT(GTMTOM1SR4_ISR, 0, IRQ_GTM_TOM1_SR4_PRIO)
                    #elif(IRQ_GTM_TOM1_SR4_TOS==IRQ_TOS_CPU1)
                        IFX_INTERRUPT(GTMTOM1SR4_ISR, 1, IRQ_GTM_TOM1_SR4_PRIO)
                    #elif(IRQ_GTM_TOM1_SR4_TOS==IRQ_TOS_CPU2)
                        IFX_INTERRUPT(GTMTOM1SR4_ISR, 2, IRQ_GTM_TOM1_SR4_PRIO)
                    #elif(IRQ_GTM_TOM1_SR4_TOS==IRQ_TOS_CPU3)
                        IFX_INTERRUPT(GTMTOM1SR4_ISR, 3, IRQ_GTM_TOM1_SR4_PRIO)
                    #endif
                #elif IRQ_GTM_TOM1_SR4_CAT == IRQ_CAT2
                    ISR(GTMTOM1SR4_ISR)
                #endif
                    {
                            ENABLE();
                            Notification_TOM1_SR4();
                    }
            #endif
        #endif  
    #endif    

 调试器调试

<think>嗯,用户想了解TC3xx系列微控制器的DMA配置和使用方法。首先,我需要回忆一下英飞凌的AURIX TC3xx系列的特点,特别是DMA部分。记得DMA在微控制器中负责外设和内存之间的数据传输,无需CPU介入,提高效率。 首先,用户可能需要基本的配置步骤,比如如何初始化DMA通道,设置源地址和目的地址,传输的数据量等。然后,触发方式也很重要,比如外设触发还是软件触发。中断处理也是常见问题,比如传输完成中断如何处理,错误处理等。 还要考虑用户可能遇到的问题,比如配置错误导致DMA不工作,优先级问题,或者数据对齐的问题。需要根据引用中的例子,比如USART的中断配置,可能DMA也有类似的中断设置,比如传输完成中断或半传输中断。 另外,参考引用中的代码结构,比如配置寄存器、初始化函数的结构,可能需要类似的步骤:时钟使能、寄存器设置、中断配置等。例如引用2中的SystemInit函数设置了RCC寄存器,可能DMA配置也需要类似的步骤,比如开启DMA时钟,配置通道参数。 用户还可能关心如何验证DMA配置是否正确,比如通过调试或状态寄存器检查。引用4提到了仿真工程属性的配置,可能涉及调试工具的使用,比如在IDE中设置断点或观察DMA传输状态。 最后,生成相关问题时,要考虑用户可能深入的问题,比如性能优化、错误排查、多通道管理,以及与其他外设(如USART、SPI)的协同工作。例如,引用1提到USART_IT_TXE中断效率更高,可能DMA与USART配合使用时如何选择触发方式。</think>### TC3xx系列微控制器DMA配置与使用方法 #### 一、DMA基础配置流程 1. **时钟使能** 在TC3xx中需先使能DMA控制器时钟,通过系统控制模块(SCU)设置。例如: ```c SCU_CMU_CLK_ENABLE(DMA_CLK); // 使能DMA时钟源 ``` 2. **通道选择与优先级** TC3xx支持多通道DMA,配置时需指定通道号及优先级。优先级通过寄存器`DMA_CHx_CTRL.PRIO`设置[^2]。 3. **数据传输配置** - **源地址与目标地址**:通过`DMA_CHx_SADR`和`DMA_CHx_DADR`寄存器设置 - **传输宽度**:支持8/16/32位,通过`DMA_CHx_ADCR.DW`配置 - **传输模式**:单次传输或循环模式(如环形缓冲区),由`DMA_CHx_CTRL.CM`控制 ```c DMA_ChannelConfig(DMA_CH0, (uint32_t)&source_buffer, (uint32_t)&dest_buffer, BUFFER_SIZE, DMA_DATA_WIDTH_32BIT); ``` #### 二、触发方式与中断 1. **触发源配置** TC3xx支持外设触发(如ADC转换完成)或软件触发,通过`DMA_CHx_TRIGSRC`寄存器选择触发源[^1]。 2. **中断配置** - 传输完成中断:通过`DMA_CHx_IE.TC`使能 - 错误中断:通过`DMA_CHx_IE.ERR`使能 ```c DMA_EnableIRQ(DMA_CH0, DMA_IRQ_TC | DMA_IRQ_ERR); // 启用完成和错误中断 NVIC_EnableIRQ(DMA0_IRQn); // 使能NVIC中断 ``` #### 三、典型问题与解决方法 1. **DMA不启动** - 检查触发源是否有效(如外设是否产生触发信号) - 验证时钟配置是否使能(通过SCU寄存器确认) - 检查通道是否被其他进程占用[^4] 2. **数据传输不完整** - 确认`DMA_CHx_TSR.TS`设置的传输长度正确 - 检查地址对齐是否符合数据宽度要求(如32位传输需4字节对齐) 3. **中断未触发** - 确认NVIC中断优先级设置 - 检查中断标志是否被清除(需手动清除TC/ERR标志) #### 四、应用示例(USART DMA传输) ```c // USART TX DMA配置 void USART_DMA_Config(void) { // 配置DMA通道为存储器到外设模式 DMA_ChannelConfig(DMA_CH1, (uint32_t)tx_buffer, (uint32_t)&USART0->TDR, TX_LENGTH, DMA_DIR_MEM_TO_PERIPH); // 设置USART触发DMA请求 USART_EnableDMA(USART0, USART_DMA_TX); } ``` > 此配置可实现高效串口数据发送,相比中断方式减少CPU负载
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值