中断标志清除注意事项 Questions:应用为了提升代码执行效率,可能会选择直接操作寄存器方式来实现软件功能,直接操作寄存器方式应用到中断标志清除上,如果清除时机设计不恰当时,就可能出现中断函数被异常多执行一次的现象 Answer: 以EXTI中断为例,其中断响应机制如下 1) IO口上出现期望边沿 2) 置位PR标志 3) 置位NVIC Flag 4) 指令跳转到中断函数执行 5) 跳转进中断函数时立即清除NVIC Flag 6) 清PR标志及中断代码执行 7) 退出中断 而实际清除标志命令的执行到标志被真正清除通常需要约2个cycle的时间(视外设而定,可能有些外设会存在细微差异)。 如果应用代码设计时将清PR标志写在中断函数末尾,则在执行清除标志命令后就会立即退出中断函数。此时就可能会出现代码退出中断函数了,但PR标志因未及时被清除而处于置位状态。从而又会从前述中断响应机制的2)步骤开始再执行一次循环。最终导致中断被异常多执行一次。 示例:存在隐患的标志清除写法 void EXTI0_IRQHandler(void) { /* user code */ EXTI->PND = EXTI_Line0; } 示例:正常标志清除写法 void EXTI0_IRQHandler(void) { EXTI->PND = EXTI_Line0; /* user code */ } 当然,如果应用代码调用库函数来清除标志的话,不会存在前述问题,因为指令的跳转是需要时间的,该跳转时间可以满足标志清除的时间要求。 类型:MCU应用 适用型号:所有M0/M3/M4等系列产品 主功能:中断标志清除 次功能:无
|