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

【经验分享】stm32之NVIC

[复制链接]
STMCU小助手 发布时间:2022-1-18 22:35
STM32的NVIC理解 例程:  /* Configure one bit for preemption priority */
, n; y& w1 [5 @/ H2 X/ {

% Y4 ~' E2 s$ g, u1 |, d  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
, J4 u5 P$ }; @+ q. g" }  
7 o# H  c- s- u2 t/ U( W  /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */
/ u9 N- y2 G9 E) D  p5 a: }  B  NVIC_InitStructure.NVIC_IRQChannel = WAKEUP_BUTTON_EXTI_IRQn;
6 `1 t2 V$ |- t% K  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;
6 P  x+ E7 i1 h, B3 J  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;3 j5 L7 x* w/ N. u
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& ~) \, u/ a6 [5 P& Q) R* {  NVIC_Init(&NVIC_InitStructure);9 p$ @- [; y& M
  
* @4 c' `1 X& @# E: P% E1 D  /* Enable the KEY_BUTTON_EXTI_IRQn Interrupt */7 ]# o5 C* A( q  a
  NVIC_InitStructure.NVIC_IRQChannel = KEY_BUTTON_EXTI_IRQn;
$ @7 ]& r7 m$ \5 ^. `. M$ l* y  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;! S% B8 b/ s' J! y# {
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  R7 h. f6 Q  b7 ?5 A! @+ O  i! V  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& M2 @- M) }# f7 f0 z  W- o  NVIC_Init(&NVIC_InitStructure);
& B3 _" o" D+ W9 Q9 a! n/ M6 M  
+ F& p) J: ?0 t, g( n$ ^) ^& Q  /* Configure the SysTick Handler Priority: Preemption priority and subpriority */
3 }7 t0 w( _+ D! w& g) I  NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), !PreemptionPriorityValue, 0));
1 J" P& T& X* Y4 t$ @- L, D

7 S- V/ |! Q  `/ w% v" ]
这两日被些许琐事所牵,身心俱累,本无心记录,但回想前几天的点滴收获,无录甚是可惜,于是身倚椅,旁敲键盘记之,唯慰藉自己及共享同道仁友。废言不再多,就此入题。
+ k) m; i. S5 L" X' C$ W
        NVIC,中文名嵌套中断向量控制器,是Cortex-M3系列控制器内部独有集成单元,与CPU结合紧密,降低中断延迟时间并且能更加高效处理后续中断。举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。
       抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。
STM32中指定优先级的寄存器为4位,其定义如下:
第0组:所有4位用于指定响应优先级7 t- s) ~$ {: u2 Y5 l; I* B: i
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
8 g8 v& o3 {2 c# y; B, \第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级- `/ Y6 D0 |& k" `: K0 U+ M7 x' u
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
6 g5 M! F% g/ @第4组:所有4位用于指定抢占式优先级
以上定义也称作中断优先级分组,相关内容在STM32固件库的misc.h文件中有详细定义。
基础了解了就可以对中断进行操作了。
第一步:使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数对优先级分组配置。NVIC_PriorityGroup可以配置为
NVIC_PriorityGroup_0 => 选择第0组& N2 f) j: E- _" Y
NVIC_PriorityGroup_1 => 选择第1组
4 N4 e7 Q, T) V! }- i9 N, b* n" FNVIC_PriorityGroup_2 => 选择第2组+ L. D( j+ \2 Z6 k4 ]' _
NVIC_PriorityGroup_3 => 选择第3组
  B8 _5 V' b# b& [* H+ ANVIC_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;
2 d3 \; _0 n* u- ~; R
例如: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;
* z; T& s7 u  D- [
第三步:中断初始化结构体初始化操作如下
         NVIC_Init(&EXTI_NVIC_InitStructure);

/ G+ G2 H9 Q! {4 N  c
第四步:开关总中断操作。在STM32中是通过改变CPU优先级来允许和禁止中断的。
(1)   下面两个函数等效关闭总中断
void NVIC_SETPRIMASK(void);
% l& c8 o; g5 ?& H4 xvoid NVIC_SETFAULTMASK(void);
(2)   下面两个函数等效开放总中断
void NVIC_RESETPRIMASK(void); 1 {! J7 D& v& @& ?4 A6 B
void NVIC_RESETFAULTMASK(void);
(3)   常用操作是先关后开中断
NVIC_SETPRIMASK();     // Disable Interrupts $ j: c" N% U6 U* F! h  k% l& ^: T
NVIC_RESETPRIMASK(); // Enable Interrupts
两种类型函数要成对使用。
( y# z8 [$ @& t  Z
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下
( U7 h/ h, h1 l/ ?% h
! j: l. P, a0 N#define NVIC_PriorityGroup_0 ((u32)0x700)
6 _9 E3 h/ P- [8 t  R$ V( O! Y#define NVIC_PriorityGroup_1 ((u32)0x600)
5 V$ F8 F" x8 P#define NVIC_PriorityGroup_2 ((u32)0x500)  C/ a: H; W6 |7 ~' s' b6 U
#define NVIC_PriorityGroup_3 ((u32)0x400)# l( p7 [2 o$ C: s% j# S
#define NVIC_PriorityGroup_4 ((u32)0x300)# g  [7 K7 k4 X( f- g

' u; c2 {5 h1 v* d形象化的理解是:! |/ k, x" @. ?- `( @: P

! A5 G. r" ?6 b6 r1 [! }, w你是上帝,) d7 Y% t" X/ l# D
造了43个人,这么多人要分社会阶级和社会阶层了;
& n& a; M: `* g$ Q/ \/ u因为“阶级”的词性比较重;"阶层"比较中性,; ?+ Z1 C4 A" |6 l
所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;
) I) g2 _) O! H* M2 V+ ]
6 q4 P0 J; V5 Y. H/ W: Q, E如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
1 }1 F7 g$ L) i& L( A每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则0 \7 w' t4 ~; M& ?" I
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;8 P% k& Q' j: M" x( _+ B
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-158 a# }1 @- x' W6 C: h8 S9 R; v
" H0 H8 r7 H9 X& ~9 N
另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)( i( ^* L, O" a9 A, F7 t
还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;% a& B: l+ w. R/ Z4 i: x
6 x: B8 `" j$ T/ ~- l
又有1个人SPI1_IRQChannel,设定如下
+ Q2 r3 @- x& ~$ SNVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;6 n. F% a' ^% @! n3 I
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-150 |" J$ O+ K: k

; S% g. O- s$ p. tSPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。( A% p; T, G+ X+ O- C5 y. a

$ F/ V+ n' S  b* A& t' A! m! t" t6 @5 Y3 N; o6 h# @- w! C

% |3 a6 @3 H. i0 X9 |+ v如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。
6 _7 V: z! S1 g+ G5 [
9 w. t' d& T0 k- E+ Y; o3 y% ]! q每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:8 f* ?0 P/ m/ ]* J1 l, I
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;9 [& J& b1 A  v4 D
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7$ I" ]! Q9 n& l3 n2 S1 J
还需要指定他的阶层:1 Z% T3 G5 F0 I  K
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1) c# k9 r3 B1 Q9 ^9 H7 w+ b
% R5 A% Y( U$ {8 B% y8 q
另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
9 o, J0 Q* G: F! B, P, \NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
& X1 D( S/ C  yNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-78 b0 L1 ~# J5 k( h. M
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1$ K: T6 H" y* t9 f5 M9 w/ V
8 q3 S3 S" s/ f
那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)7 E7 C" v* |& O& x7 a
如果他们两个同时想做事,因为前者的阶层高,所以前者优先。5 @, q% n- M1 P2 F! H0 [/ y( w

5 W' Z: W4 y$ g; r' N: y还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下, ^+ f8 r! u( g' h$ z" s% C& ]' h3 D
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;, n' H7 d: [) X/ ^
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7* K+ G* `/ e$ t' |
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1! x9 l* w. K7 b+ M4 |- k# s

3 s  w# A; y0 gUSART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。' d" l  W9 e$ j# ^

6 e8 {" n% B2 S6 ~' w# z! n3 i8 s* H- W. [0 y
收藏 评论0 发布时间:2022-1-18 22:35

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版