你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开关总中断

[复制链接]
STMCU小助手 发布时间:2022-2-6 21:45
在 STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或禁止中断。
7 g9 H  H3 w* g+ r0 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

' T6 h6 X6 u) f7 O! i, c在 STM32 固件库中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定义了四个函数操作 PRIMASK 位和, t  v# ?0 I1 z% B
  j# O- t5 ?8 `# j
FAULTMASK 位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。
" G) [' M* k' C  {* j" }: O& [7 K* k/ g
+ T4 R+ h) R: H/ ]5 W: _下面两个函数等效于关闭总中断:8 E- K* Z0 Q8 o+ O8 F+ d  l
void NVIC_SETPRIMASK(void);
* ]; D# F. G, i$ p% C( |, A& a" Bvoid NVIC_SETFAULTMASK(void);) P7 C% j0 x3 X( X# P  O: q2 t

$ J1 {8 J* T: B- h4 s
% l8 I: T, e; P) h9 U" r3 b下面两个函数等效于开放总中断:. O4 x: Z7 V6 R/ e+ K7 I
void NVIC_RESETPRIMASK(void);
0 H: c+ l( X, [- w1 h3 Jvoid NVIC_RESETFAULTMASK(void);; x' {2 t- h3 Q4 F5 k" a/ R4 c$ t

, c2 f  t5 \7 _
# X/ k9 E1 u- t  N上面两组函数要成对使用,不能交叉使用。
- S! D  Y) c/ n0 d# l2 d9 s& u8 u
* y& o5 K+ Z7 }8 i" o* J例如:0 r: f. t) I7 k( ^! b( D; s7 e: L3 J
# c* y& q. A+ @. ?' d) H
第一种方法:
2 d, Y1 [3 ]2 }+ C: s$ @: x$ rNVIC_SETPRIMASK(); //关闭总中断
5 h7 j/ Z: @# q! O* d" v: hNVIC_RESETPRIMASK(); //开放总中断
, _7 F/ f, v$ w, e9 {
) l& g  G4 l! C% @/ f第二种方法:
% ]) g6 B% l/ e" F- l  `# E( zNVIC_SETFAULTMASK(); //关闭总中断* F- g7 c) G5 d$ u, ]2 G. i
NVIC_RESETFAULTMASK(); //开放总中断; C! U; @4 W6 x% ]

; v) S/ c9 G9 U2 E! \, {常常使用
( K5 w. v6 P& M; X, x+ f% p2 ?6 V0 m* t, a" V. J# v- T
NVIC_SETPRIMASK(); // Disable Interrupts
$ k. F7 k  U$ j9 A- g, L, I; SNVIC_RESETPRIMASK(); // Enable Interrupts- s' ?  V$ |8 c: A) U  P" K
, Z3 Q, R) D% j
-------------------------------------------------------------------------------------------------
' B; _1 a1 \3 J+ R. y4 L* m) |  F在 3.0 的库中 已经没有
! Z9 [3 a& e. T* L: W第一种方法:. 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
第二种方法:
4 B# w  J( A6 D' M: L  TNVIC_SETFAULTMASK(); //关闭总中断# v' j" h5 g6 q
NVIC_RESETFAULTMASK(); //开放总中断5 B8 }) T* ?# C# I

7 z0 S* g1 Z3 ^2 ?+ ~. {补充 可以用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)
$ v, z) l& Y* U
赞 收藏 评论0 发布时间:2022-2-6 21:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版