打印
[应用相关]

FAQ0109 中断标志清除注意事项

[复制链接]
433|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ArterySW|  楼主 | 2021-4-26 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断标志清除注意事项
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等系列产品
主功能中断标志清除
次功能

使用特权

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

本版积分规则

179

主题

274

帖子

10

粉丝