找回密码
 注册
关于网站域名变更的通知
查看: 474|回复: 1
打印 上一主题 下一主题

STM32 禁用或开启总中断

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-10 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
  今天把之前自己的一些在中断方面所产生的疑惑把具体的解决办法给大家分享一下,希望能够帮到大家。# p+ i  b( l% Y
  STM32在使用时有时需要禁用全局中断,比如mcu在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。) s5 m3 d3 k( k- H, x. T5 [* Q
  ARM MDK中提供了如下两个接口来禁用和开启总中断:
( @: J3 h1 w; F" h2 K" _3 G  __disable_irq(); // 关闭总中断. T7 N3 L2 q8 \5 w3 i3 i* u* q
  __enable_irq(); // 开启总中断 但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。
% H/ }/ g+ e6 l8 h" |/ Z  这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。4 B! O$ H' \$ _1 ^, `6 ~
  所以要想禁止所有中断,必须对逐个模块的中断进行 Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过 XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在 __enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。8 I2 C6 M0 T1 T% B. ^3 b5 ]
4 C$ f9 S  v  |

$ q+ F3 ~0 G* Q  ?
  • TA的每日心情
    开心
    2023-5-15 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-20 10:30 | 只看该作者
    这要看手册,上面都有对寄存器得描述
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-19 06:47 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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