硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5066|回复: 0
收起左侧

[客户分享] AT32等MCU 中断标志清除注意事项

[复制链接]

41

主题

1

回帖

124

积分

初级会员

积分
124
发表于 2021-4-26 23:10:07 | 显示全部楼层 |阅读模式
中断标志清除注意事项

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等系列产品
主功能:中断标志清除
次功能:无


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-18 12:37 , Processed in 0.166394 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表