整理:MilerShao 时不时会有人询问基于ARM CORTEX Mn 内核的STM32各系列MCU芯片应用开发时开、关总中断的函数或指令的话题,尤其最近,频繁有人问起STM32F0系列 MCU关闭总中断的问题,其中有些人还是用过STM32F1系列芯片的,说找不到相应的函数。 随着基于CORTEX Mn 各内核的MCU芯片越来越多和相关编译工具的升级换代,编译工具在有关内核指令操作的文档安排及函数书写等方面可能会发生些细微变化。 所以即使用过STM32F1系列产品的工程师,在使用较晚推出的STM32F0芯片开发时发现那些跟内核操作有关的指令或函数不知哪里去找了。以STM32各系列的标准固件库为例,与内核有关的指令及函数都可以在...\LIBRARIES\CMSIS\...后面目录的相关文件里找到。于不同系列的标准固件库中所对应的子目录及相关文件名略有差异。 一般来讲,我们是不用或者说用不着做总中断的关闭动作的,或许个别时刻可能真有需要。当然也不排除部分人可能出于之前使用别的MCU开发习惯或者好奇想知道怎么用。这里简单地分享下。 这个开、关STM32芯片总中断的指令,是针对ARM CORTEX内核的操作指令。在各ARM内核编程手册上一定可以找到,但在STM32芯片相关技术手册上是找不到的。开、关总中断的汇编指令分别就是CPSIE i、CPSID i,对于各个ARM CORTEX系列MCU芯片来说,都是一样的。 
目前各编译工具都把与内核相关ARM指令根据指令功能将其中某一条或几条汇编指令封装为C函数,函数名相对更为直观、好记,方便用户需要时拿来使用。比方在ARM MDK环境下,上面两个开关总中断的指令封装成如下2个内嵌函数。 1、关闭【或禁用】总中断的指令函数: __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) { __ASM volatile ("cpsid i" : : : "memory"); }
2、开启【或使能】总中断的指令函数【芯片复位后总中断时默认打开的,即使能的】: __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) { __ASM volatile ("cpsie i" : : : "memory"); }
需要关闭总中断时,在用户代码里直接放置 __disable_irq( ); 需要开启总中断时,在用户代码里直接放置 __enable_irq( ); 。注意是下划线是两个横杠。 |