关于F28335中断的一些理解

发布时间:2026/8/15 14:09:32
关于F28335中断的一些理解 我们知道F28335的中断采用的是3级中断机制分别是外设级中断、PIE级中断和CPU级中断如图1所示图1F28335三级中断流程框图我们知道F28335内部有16个中断线2个不可屏蔽中断和14个可屏蔽中断INT1-IN14。其中12个可屏蔽中断INT1-INT12通过PIE外部中断扩展。PIE将外设中断分成了12组分别对应着CPU的12个可屏蔽中断线INT1-INT12每一组由8个外设级中断组成。8个外设中断分别对应相应外设接口的中断引脚PIE通过一个8选1的多路选择器将8个外设中断组成一组EPWM模块是F28335的一个外设EPWM模块对应的中断所在PIE组为第三组即连接的CPU的中断线为INT3其中对应的8个外设中断只用到了六个INT3.1-INT3.6分别对应的是EPWM1-6模块的外设中断剩余两个外设中断保留。如果外设要能够成功产生中断响应就要首先经外设级中断允许然后经PIE允许然后经过CPU允许最终CPU做出响应。具体的流程就是首先外设级的中断需要打开我们需要在EPWM模块的初始化文件中进行设置比如如果我们需要使用EPwm1模块的外设中断那么就需要将EPwm1模块的中断进行使能并设置什么时候进入中断几个事件进一次中断等EPwm1Regs.ETSEL.bit.INTSELET_CTR_ZERO;//当计数值CTR到0时候ePWM1模块中断触发(更新比较寄存器CMPA和CMPB的值)EPwm1Regs.ETSEL.bit.INTEN1;// ePWM1模块中断产生位使能中断EPwm1Regs.ETPS.bit.INTPRD1;//每次事件发生都触发中断在第一个事件时产生SOC信号即SOCBCNT01产生中断这样我们初始化EPWM模块之后就相当于开启了外设级中断。EPWM模块的中断对应的是PIE中断的第三组EPWM1模块的中断对应INT3.1当EPWM1中断信号即时基计数器CTR为0时外设EPWM1模块的中断信号进入PIE模块PIE模块接收到外设请求的中断之后PIEIFR即PIE模块的中断标志位会自动置1不需要人为设置之后经过PIEIER即PIE模块的中断使能位如果相应的PIEIER中断使能位也置1需要在主程序中设置PIE模块将检查PIEACK。PIEACK共有12个位PIEACK1至PIEACK12分别对应PIE模块的12组向量PIEACK3对应的是PIE中断的第3组即EPWM模块的中断PIE模块将检查PIEACK3确定CPU是否准备中断由图1知道PIEACK3信号是低有效当PIEACK3位清零时通过一个与门与之后是1的话PIE模块就可以将外设级中断送入CPU的中断线比如EPWM的中断对应INT3从而进入CPU级中断此时经过CPU的中断标志位IFR会自动置1不需要人为设置之后同样经过CPU的中断使能位IER如果IER也置1需要在主程序中设置那么之后会经过CPU的总中断INTM当INTM位被置0时外设中断就可以进入CPU被执行。当PIE送入一个中断进入CPU之后PIEACK3对应的位会自动置1CPU读到PIEACK3位为1的时候就会断开CPU的中断标志位IFR防止下一个中断进入CPU中断。当CPU执行当前的中断的程序之后在中断程序结束之后需要将ePWM中断的中断标志位写1清除ePWM的中断标志位并将ePWM对应的组的PIEACK3位置1即是CPU给PIEACK3位写1就是中断程序中将PIEAC3K位置1PIEACK3位写1之后PIE模块对应的3组的所有中断标志位PIEIFR3.1到PIEIFR3.8会自动清零全部断开之后PIEACK3位会自动清零等待下一个中断。以下面的中断为例interruptvoidepwm1_isr(void){k2;EPwm1Regs.ETCLR.bit.INT1;//清除标志位PieCtrlRegs.PIEACK.allPIEACK_GROUP3;//清除应答位,中断结束后准备下一次中断响应。EINT;}这里定义了一个ePWM1模块的中断中断函数的名字为epwm1_isr那么我们需要在主程序的最开始声明这个中断函数interruptvoidepwm1_isr(void);//声明EPWM1中断服务程序并在主函数里面需要将epwm1_isr中断函数的入口地址映射到ePWM1的中断的入口地址PieVectTable.EPWM1_INTepwm1_isr;//映射使用的中断向量由于我们中断使用的ePWM1的中断ePWM1的中断是属于外设级中断所以首先需要在EPWM的初始化程序中开启ePWM1模块的外设中断EPwm1Regs.ETSEL.bit.INTSELET_CTR_ZERO;//当计数值CTR到0时候ePWM1模块中断触发EPwm1Regs.ETSEL.bit.INTEN1;// ePWM1模块中断产生位使能中断EPwm1Regs.ETPS.bit.INTPRD1;//每次事件发生都触发中断在第一个事件时产生SOC信号即SOCBCNT01产生中断根据图1我们知道当外设中断进入PIE模块时PIE模块的中断标志位PIEIFR会自动置1但是PIE的中断使能位PIEIER需要在主程序中设置PieCtrlRegs.PIEIER3.bit.INTx1 1;//允许PIE级中断INT3.1即EPWM1中断由于PIEACK3的位初始状态为0所以ePWM1中断会顺利进入CPU级中断INT3CPU的中断标志位IFR会自动置1但是CPU的中断使能位IER需要在主程序中设置IER | M_INT3;//允许CPU的INT3对应的是EPWM1~6之后还需要在主程序设置CPU级的总中断INTM让INTM置0使能CPU的全局中断EINT; // Enable Global interrupt INTM这样外设ePWM1的中断就能顺利进入CPU进行执行了我们前面分析了PIEACK3位初始状态为0进入中断服务子程序之后PIEACK3会自动置1CPU读取到PIEACK3为1时就会关闭CPU的所有中断线。在中断服务子程序epwm1_isr函数中打一个Breakpoint断点 ● interruptvoidepwm1_isr(void){● k2;// ● 表示断点位置EPwm1Regs.ETCLR.bit.INT1;//清除标志位PieCtrlRegs.PIEACK.allPIEACK_GROUP3;//清除应答位,中断结束后准备下一次中断响应。EINT;}当程序刚载入到目标板的时候在CCS的Expression中观察PIEACK寄存器的所有的值如图2所示图2初始状态PIEACK3的值为0可以发现当程序还没运行的时候PIEACK的所有位初始状态为0之后点击运行程序当程序运行到Breakpoint断点的时候再次查看PIEACK寄存器的所有位的值如图3所示图3运行到中断程序时PIEACK3值为1之后按住F6进行单步运行首先是清除ePWM1模块的中断标志位➤ EPwm1Regs.ETCLR.bit.INT1;//清除标志位PieCtrlRegs.PIEACK.allPIEACK_GROUP3;//清除应答位,中断结束后准备下一次中断响应。再次按F6进行单步运行EPwm1Regs.ETCLR.bit.INT1;//清除标志位➤ PieCtrlRegs.PIEACK.allPIEACK_GROUP3;//清除应答位,中断结束后准备下一次中断响应。运行最后一句之后查看PIEACK寄存器的值的变化当再次按F6运行完最后一条语句之后会发现PIEACK3位会清零如图4所示图4PIEACK写PIEACK_GROUP3之后CPU自动将PIEACK3清零这也就是CPU给PIEACK的所有位写PIEACK_GROUP3之后PIEACK会将PIE模块的所有中断标志位全部清零断开同时PIEACK3寄存器位也被自动清零准备下一次的中断。最后再次观看PIEACK寄存器的英文描述如图5所示图5PIEACK寄存器的使用如果CPU读到PIEACK的某一位为0表明PIE能够将对应组的中断送入CPU中断如果CPU写0到PIEACK没有效果如果CPU读到PIEACK的某一位为1表明已经有某一组的中断进入了CPU中断其他组的中断被阻断。如果CPU写1到PIEACK的某一位表明PIEACK对应位会自动清零允许PIE模块将正在等待进入CPU中断的中断函数送入CPU执行。以上就是对中断执行的全部过程的理解。