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

【经验分享】STM32 NVIC配置详解

[复制链接]
STMCU小助手 发布时间:2022-1-13 20:42
例程:  /* Configure one bit for preemption priority */
3 z- p4 Q# e' I! C) x0 D9 ?$ ]% u  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);8 r3 ~8 k+ N* r2 ]1 g3 J
  
- k! Z7 X, D' O  X  /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */0 b' m5 Q: t: g/ h. u
  NVIC_InitStructure.NVIC_IRQChannel = WAKEUP_BUTTON_EXTI_IRQn;
  z% T! m7 e' ]) r: G: H  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;
- S3 N' G2 l7 _! ~0 j  v. d  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;: P+ @  ^" {- E9 D; {2 J
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
9 `6 f, n5 k( U! |# @  NVIC_Init(&NVIC_InitStructure);
- t; |( L9 `3 i  1 I$ @+ N- C4 l3 @( f+ I0 ^
  /* Enable the KEY_BUTTON_EXTI_IRQn Interrupt */
: r1 f9 X: ~& x. k  NVIC_InitStructure.NVIC_IRQChannel = KEY_BUTTON_EXTI_IRQn;
  c9 E, t5 K, A/ T$ i  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;& d- u  ^/ k4 S* v
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
9 O8 {+ h" _8 I) Z. B3 w- H  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
8 ]( W+ n5 M; r) ]. K  NVIC_Init(&NVIC_InitStructure);! x1 e+ O4 l# j# `& }
  
6 d  R5 ?+ o) ?7 N( @. w0 Y  /* Configure the SysTick Handler Priority: Preemption priority and subpriority */! b2 [1 u& j; t! O/ R3 O  B* @
  NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), !PreemptionPriorityValue, 0));
. t2 Q) x( z; B- M. ]9 G/ M8 X2 [4 [2 o. T
这两日被些许琐事所牵,身心俱累,本无心记录,但回想前几天的点滴收获,无录甚是可惜,于是身倚椅,旁敲键盘记之,唯慰藉自己及共享同道仁友。废言不再多,就此入题。
% m  L" U5 z4 e) h$ ?, l
        NVIC,中文名嵌套中断向量控制器,是Cortex-M3系列控制器内部独有集成单元,与CPU结合紧密,降低中断延迟时间并且能更加高效处理后续中断。举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。
       抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。
STM32中指定优先级的寄存器为4位,其定义如下:
第0组:所有4位用于指定响应优先级
% b3 Z% v/ |& z5 F; p$ v+ x第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级( ?' G3 i0 D# Q" T. ?# b
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
2 ^% I# x  y; G( Y" J7 n第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
0 }' o# g9 }3 Q: K第4组:所有4位用于指定抢占式优先级
以上定义也称作中断优先级分组,相关内容在STM32固件库的misc.h文件中有详细定义。
基础了解了就可以对中断进行操作了。
第一步:使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数对优先级分组配置。NVIC_PriorityGroup可以配置为
NVIC_PriorityGroup_0 => 选择第0组
; i/ G- q$ M8 f; w. ^/ \* lNVIC_PriorityGroup_1 => 选择第1组
' P5 M( Q7 @6 n$ e/ y: ]" UNVIC_PriorityGroup_2 => 选择第2组
5 }) T. `! \2 A7 RNVIC_PriorityGroup_3 => 选择第3组& b4 ^' a8 e% H# D; k+ s; z
NVIC_PriorityGroup_4 => 选择第4组
例如:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0)配置为0组。
第二步:中断初始化结构体配置,结构体类型定义如下:
typedef struct
{
  uint8_t NVIC_IRQChannel;                 
  uint8_t NVIC_IRQChannelPreemptionPriority;  //抢断优先级
  uint8_t NVIC_IRQChannelSubPriority;  //响应优先级      
  FunctionalState NVIC_IRQChannelCmd;      
} NVIC_InitTypeDef;
% g6 u. X6 {1 m2 @8 w
例如:STM32外部中断0配置如下
    EXTI_NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
         EXTI_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //抢占优先级别(0~1)
         EXTI_NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;  //响应优先级别(0~7)
         EXTI_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

- X. _. P/ p2 d* o, k+ ]
第三步:中断初始化结构体初始化操作如下
         NVIC_Init(&EXTI_NVIC_InitStructure);

" l" A- U6 p: w! k" h& r. S5 B
第四步:开关总中断操作。在STM32中是通过改变CPU优先级来允许和禁止中断的。
(1)   下面两个函数等效关闭总中断
void NVIC_SETPRIMASK(void);
; v( h2 g8 c8 X5 z  Nvoid NVIC_SETFAULTMASK(void);
(2)   下面两个函数等效开放总中断
void NVIC_RESETPRIMASK(void);
5 Z2 b# i- m  ivoid NVIC_RESETFAULTMASK(void);
(3)   常用操作是先关后开中断
NVIC_SETPRIMASK();     // Disable Interrupts 9 M; `, r6 u( v/ @$ m
NVIC_RESETPRIMASK(); // Enable Interrupts
两种类型函数要成对使用。

. f4 S4 a6 y1 r* T& GSTM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下3 L# B$ ]* }9 `0 W

0 d$ f7 K2 N6 c#define NVIC_PriorityGroup_0 ((u32)0x700)
6 e3 B- V' B1 L! Z8 H3 e#define NVIC_PriorityGroup_1 ((u32)0x600)
3 V3 j6 h" w# }; d+ Y/ J#define NVIC_PriorityGroup_2 ((u32)0x500)2 K9 a) S7 w7 X/ Y" M
#define NVIC_PriorityGroup_3 ((u32)0x400)
5 j. K* q* m+ b! D8 g' X: `#define NVIC_PriorityGroup_4 ((u32)0x300)% S* ^6 y9 U" G; p4 ^& |
2 E9 p* h4 F, o# r- @
形象化的理解是:# y/ F1 |  Q  A) y/ Y0 _# R

, A$ ?0 M* ^. H( E' U& q7 t你是上帝,
( L$ l. d+ q: R5 J5 i造了43个人,这么多人要分社会阶级和社会阶层了;, v- J2 ]8 F7 v) F: X1 F7 Q' q( A
因为“阶级”的词性比较重;"阶层"比较中性,; {$ Z) K" h( A; h& o+ e3 w8 Z
所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;" i* }  K0 Z1 m6 D
, @/ \0 K3 ]  U1 ~. ^" J
如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
, ~/ d0 M% \7 }: e% m8 c3 L每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则: Y( Z3 U( a4 o. C2 s; T
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;7 K5 T' N( {- z9 z: J
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-152 G) ]5 ?4 d- H- Z% S# o
5 {' g% T* v6 `6 \* W
另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
, ?& O0 s: P6 H: V3 l9 M9 Y还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;, R/ `/ l1 S% c+ T( E

( s4 ]8 z, W8 e/ f# {8 n" j# n) V! I; p又有1个人SPI1_IRQChannel,设定如下' ~# [9 G  n. `3 M" h7 R* n
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;$ |  ^) d/ b, a- d) J2 Z
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-15
. ^* _' o2 T( D
/ H* |  k6 W9 ?7 C( n  F- CSPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。
( O9 v( \& i4 c4 @0 g3 V
3 O. f" a) R! @) S0 z
0 V8 a( ^: A& N; P2 E, r% }5 c0 T# }- y' F8 k! f# B( T
如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。; H) B" G6 R3 v' F% O

, P3 v, j/ I- @9 g+ w每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:1 Z0 v" i4 L9 y! }7 p2 f
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;" G! s: ]7 B. W' {) n0 y/ Y
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7: J* G# n' {. R  }8 p/ ]* f; S
还需要指定他的阶层:& I4 {  u6 _) D. k1 m
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1
9 R# W, J7 B, z; _6 \( l: p* e# x% t: \
另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下0 L  C; O! h  j6 O% J; ~2 O. \  ?9 X! l
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;3 {2 }, @5 A9 R" X
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
3 H; f9 R* I( {/ U  LNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别11 K4 ^- @% p* s, M

4 N( U' y9 x( i5 Q  I那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)3 I/ q: ~& F$ z6 y
如果他们两个同时想做事,因为前者的阶层高,所以前者优先。9 H6 b: h* d# ]$ A+ x9 B* p
" [3 O  h) _  P/ n& Q
还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下/ T/ m# l' W) U1 h& m
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;' S$ ~% B6 S7 D# G) H
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-70 [  v9 @4 x1 e( A1 R; y8 J& r
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1" g, O) C3 i- f  t) I- r% j

9 ^& w: M) D4 s; d; g# i- OUSART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。
: `. t1 c/ I, _% A9 B4 e1 l
+ U2 |; p8 g  |/ p6 V+ Z8 H以下的类推。2 J5 Z2 D+ y+ D, U" W  B
  }% o' G# p! f) ]( U. h
  I& g! f  h4 V3 i
3 u( \5 m6 M0 n9 N- y
赞 收藏 评论0 发布时间:2022-1-13 20:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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