|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
今天把之前自己的一些在中断方面所产生的疑惑把具体的解决办法给大家分享一下,希望能够帮到大家。% a2 M6 o! Z8 e5 j4 L: v, Y
STM32在使用时有时需要禁用全局中断,比如mcu在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。' F/ ?/ G e/ F2 X# q+ i# {, v
ARM MDK中提供了如下两个接口来禁用和开启总中断:
, h* @9 M% e& ~ __disable_irq(); // 关闭总中断
0 `6 x. P6 J+ A/ l& a- D$ e4 G __enable_irq(); // 开启总中断 但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。
2 a+ w. Q6 f& r8 h; a 这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。, E$ W* d) I' e
所以要想禁止所有中断,必须对逐个模块的中断进行 Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过 XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在 __enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。5 ?3 G) P- k3 N: G
' b! [/ g! K6 h, a+ ^1 P3 s
2 P: ~; P5 i9 Z |
|