STMCU小助手
发布时间:2022-2-6 21:45
|
在 STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或禁止中断。 0 a2 r; u$ A7 S0 r7 z0 b PRIMASK 位:只允许 NMI 和 hard fault 异常,其他中断/ 异常都被屏蔽(当前 CPU 优先级=0)。! T5 j4 d7 a' ~ U V2 W' q/ N2 I L6 E+ f FAULTMASK 位:只允许 NMI,其他所有中断/异常都被屏蔽(当前 CPU 优先级=-1)。4 |- B4 w5 N2 _& n8 R! Z- S 在 STM32 固件库中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定义了四个函数操作 PRIMASK 位和, t v# ?0 I1 z% B j# O- t5 ?8 `# j FAULTMASK 位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。 下面两个函数等效于关闭总中断:8 E- K* Z0 Q8 o+ O8 F+ d l void NVIC_SETPRIMASK(void); void NVIC_SETFAULTMASK(void);) P7 C% j0 x3 X( X# P O: q2 t 下面两个函数等效于开放总中断:. O4 x: Z7 V6 R/ e+ K7 I void NVIC_RESETPRIMASK(void); void NVIC_RESETFAULTMASK(void);; x' {2 t- h3 Q4 F5 k" a/ R4 c$ t 上面两组函数要成对使用,不能交叉使用。 例如:0 r: f. t) I7 k( ^! b( D; s7 e: L3 J # c* y& q. A+ @. ?' d) H 第一种方法: NVIC_SETPRIMASK(); //关闭总中断 NVIC_RESETPRIMASK(); //开放总中断 第二种方法: NVIC_SETFAULTMASK(); //关闭总中断* F- g7 c) G5 d$ u, ]2 G. i NVIC_RESETFAULTMASK(); //开放总中断; C! U; @4 W6 x% ] 常常使用 + f% p2 ?6 V0 m* t, a" V. J# v- T NVIC_SETPRIMASK(); // Disable Interrupts NVIC_RESETPRIMASK(); // Enable Interrupts- s' ? V$ |8 c: A) U P" K , Z3 Q, R) D% j ------------------------------------------------------------------------------------------------- 在 3.0 的库中 已经没有 第一种方法:. V/ J' R: o/ Q2 E7 T& A NVIC_SETPRIMASK(); //关闭总中断9 ~) G; i6 L: w+ ] NVIC_RESETPRIMASK(); //开放总中断3 ?# R0 s+ U% u q% m+ {3 P 3 c, w5 T. p1 q- A' N! G 第二种方法: NVIC_SETFAULTMASK(); //关闭总中断# v' j" h5 g6 q NVIC_RESETFAULTMASK(); //开放总中断5 B8 }) T* ?# C# I 补充 可以用4 W% M' Q6 N9 n #define CLI() __set_PRIMASK(1)- G/ n- H- I' n; y3 `: a0 z; T. W #define SEI() __set_PRIMASK(0) |
实战经验 | 基于STM32G0B1的全桥移相+同步整流PWM解决方案
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:逢7发帖赢大礼】8、基于STM32G070板子的Ymodem串口协议IAP Bootloader开发
【福利三:逢7发帖赢大礼】7、基于STM32G070板子TF卡的FATFS移植
【福利三:逢7发帖赢大礼】6、基于STM32G070板子spiflash的FATFS移植
【福利三:逢7发帖赢大礼】5、基于STM32G070板子IRDA红外遥控接收解码
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
【福利三:逢7发帖赢大礼】基于STM32G070板子的uart shell移植设计
【福利三:逢7发帖赢大礼】3、基于STM32G070板子的YModem串口协议通信
【福利三:逢7发帖赢大礼】2、基于STM32G070板子的OLED移植U8G2库
微信公众号
手机版