STM32 禁用或开启总中断
2012-03-22 16:42
134 查看
STM32在使用时有时需要禁用全局中断,比如MCU在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。
ARM MDK中提供了如下两个接口来禁用和开启总中断:
__disable_irq(); // 关闭总中断
__enable_irq(); // 开启总中断
但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。所以要想禁止所有中断,必须对逐个模块的中断进行Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在__enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。
ARM MDK中提供了如下两个接口来禁用和开启总中断:
__disable_irq(); // 关闭总中断
__enable_irq(); // 开启总中断
但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。所以要想禁止所有中断,必须对逐个模块的中断进行Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在__enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。
相关文章推荐
- STM32 定时器有时一开启就进中断
- <抄>STM32 定时器有时一开启就进中断的问题
- 解决STM32开启定时器时立即进入一次中断程序问题
- STM32 定时器有时一开启就进中断
- STM32 中断优先级以及全局允许和禁止
- 关于stm32的MY_NVIC_Init()中断管理函数的使用心得!
- stm32串口中断接收发送实验
- STM32单片机外部中断配置讲解
- STM32—无需中断来实现使用DMA接收串口数据(原创)
- 【已实现】stm32 SPI DMA中断收发
- STM32 ------ 数组越界造成进入 HardFault_Hander 中断函数
- STM32基础实验4(按键中断)
- 关于STM32外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法
- stm32的串口空闲中断接收数据
- STM32 NVIC 中断优先级管理
- stm32的复用和中断
- android ViewPager 禁用/开启 滑动切换功能
- STM32学习--外部中断
- 对比S3C6410外部中断STM32外部中断
- 【不算奇葩的问题】stm32外部中断一直响应