新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2020-4-10
- 在线时间
- 2 小时
|
我打开设置了定时器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清中断代码,特别是,多个中断标识位在同一个寄存器中的情况。
|
|