OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3178|回复: 0

读-修改-写导致的定时器中断丢失

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-4-10
在线时间
2 小时
发表于 2020-4-10 14:10:07 | 显示全部楼层 |阅读模式


我打开设置了定时器2的溢出、捕获CH2、捕获CH4,三个中断。


在某两个中断比较近的发生时,可能会出现,后发生的中断丢失故障。


比如:
捕获CH2发生,中断服务程序中,处理,清标志位。


使用的是   TIM2->SR    &= ~(TIM_SR_CC2IF);     清除CH2中断标识。


这行代码会被编译成3条汇编:


1.读
2.修改
3.写


若在读之后,写之前,溢出中断发生,硬件置对应的标识位,就会在写操作的时候,清空溢出中断,但是并没有处理。


怎么办:
还好,MCU在设计的时候,SR寄存器的各个位都使用rc_w0模型。
这样,不需要“读-修改-写”,而是直接对指定位写0,也不会影响其他位数值。
将“读-修改-写”代码中的&去除,应该就可以修复该bug。

  TIM2->SR   = ~(TIM_SR_CC2IF);

代码的含义是,把寄存器特定的位清零,其他的位都写1。


由于,其他位都是rc_w0模型,所以,对其他位的写1操作,不会对其他位的数值造成更改。


检查所有SR清中断代码,特别是,多个中断标识位在同一个寄存器中的情况。








Image.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-2 17:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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