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

【经验分享】stm32之NVIC

[复制链接]
STMCU小助手 发布时间:2022-1-18 22:35
STM32的NVIC理解 例程:  /* Configure one bit for preemption priority */
! F0 m1 I) v5 R" K& b
4 B; g' k) d) ]- A
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
7 g! ?1 o& f: Q/ {9 ~! H) l& C  . y4 @/ `+ ]& z, l5 q2 x
  /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */$ U. H0 M2 Z8 ?3 V! E2 Q" f3 |' ]9 [
  NVIC_InitStructure.NVIC_IRQChannel = WAKEUP_BUTTON_EXTI_IRQn;' f6 C7 c  i; W1 {
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;
7 m( ]; ~" {) D! x  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;9 V( a: d, {( \7 G
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
. i$ _4 f, \5 s# M% i. `  NVIC_Init(&NVIC_InitStructure);
( e5 @9 M0 F# {; j- A4 o% G: B2 }% p% @  , z3 h7 B8 r5 i2 K" l: ]2 ~
  /* Enable the KEY_BUTTON_EXTI_IRQn Interrupt */  V$ }4 D8 G& d6 [* y. L
  NVIC_InitStructure.NVIC_IRQChannel = KEY_BUTTON_EXTI_IRQn;
- H) }: k! p7 y1 t4 ~3 L4 b  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
$ s: V0 I) B) @; R% O1 l6 V' q  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;6 l. X0 _% z6 F' y6 `& ^, l
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;& d5 ]' K* w* J2 L0 i% N
  NVIC_Init(&NVIC_InitStructure);
3 r2 o& T( w& Y0 T" R* E  ! Q" E* J$ J1 o2 F
  /* Configure the SysTick Handler Priority: Preemption priority and subpriority */  w, q) v- A( @* a* I: e
  NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), !PreemptionPriorityValue, 0));

6 I4 ^0 z" e3 C, f$ d+ f, b+ k1 D0 `3 c- \. ?7 v4 _
这两日被些许琐事所牵,身心俱累,本无心记录,但回想前几天的点滴收获,无录甚是可惜,于是身倚椅,旁敲键盘记之,唯慰藉自己及共享同道仁友。废言不再多,就此入题。
0 C8 e0 w. f7 ?3 J7 F
        NVIC,中文名嵌套中断向量控制器,是Cortex-M3系列控制器内部独有集成单元,与CPU结合紧密,降低中断延迟时间并且能更加高效处理后续中断。举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。
       抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。
STM32中指定优先级的寄存器为4位,其定义如下:
第0组:所有4位用于指定响应优先级  p5 m3 K) G# d( e  [$ n
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级( n1 C' G( R/ d' ~$ _! Y- b' z2 N
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
9 V% I8 V9 j# I第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级/ ^3 v4 I4 t6 i( R' g! \8 H
第4组:所有4位用于指定抢占式优先级
以上定义也称作中断优先级分组,相关内容在STM32固件库的misc.h文件中有详细定义。
基础了解了就可以对中断进行操作了。
第一步:使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数对优先级分组配置。NVIC_PriorityGroup可以配置为
NVIC_PriorityGroup_0 => 选择第0组9 ]6 g% {0 f! u' @/ b) v" Q! |
NVIC_PriorityGroup_1 => 选择第1组: H  q" |: I' q% u' l/ \
NVIC_PriorityGroup_2 => 选择第2组
" l& e# y% E: U/ u* `+ w8 g% }9 HNVIC_PriorityGroup_3 => 选择第3组
2 y' o2 |, N5 ?+ C1 i' nNVIC_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;

& B% D  S' V+ U7 N
例如: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;
2 D5 t- ?7 g6 f% a2 M
第三步:中断初始化结构体初始化操作如下
         NVIC_Init(&EXTI_NVIC_InitStructure);

# h* ^# X3 R% U4 x$ H8 V
第四步:开关总中断操作。在STM32中是通过改变CPU优先级来允许和禁止中断的。
(1)   下面两个函数等效关闭总中断
void NVIC_SETPRIMASK(void);
, n. G3 s; ~6 C6 K+ V& v1 lvoid NVIC_SETFAULTMASK(void);
(2)   下面两个函数等效开放总中断
void NVIC_RESETPRIMASK(void);
) S; A7 J# J- ]7 L/ V0 j/ ~void NVIC_RESETFAULTMASK(void);
(3)   常用操作是先关后开中断
NVIC_SETPRIMASK();     // Disable Interrupts
: M4 ^4 z+ d: ?/ v- U: W, w2 }NVIC_RESETPRIMASK(); // Enable Interrupts
两种类型函数要成对使用。
2 `$ h6 F. Z9 A1 x3 `* @; T
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下
; T0 f- z- }* X3 ]7 y0 X
9 Y4 ~: ?! c7 }5 @8 j4 k#define NVIC_PriorityGroup_0 ((u32)0x700)
' `: E3 w+ O) g4 Y* w#define NVIC_PriorityGroup_1 ((u32)0x600)
; {* M: @2 U5 d- D; V#define NVIC_PriorityGroup_2 ((u32)0x500)7 f: \; S3 C( w
#define NVIC_PriorityGroup_3 ((u32)0x400)
+ H# g# N  V* w( B2 ?#define NVIC_PriorityGroup_4 ((u32)0x300)
  k* P. c0 |7 a/ ^7 ]! v4 U6 Y, a- c" b( i3 F% D. Y
形象化的理解是:3 \* z, \- ]3 S# @6 u

( A& U. @2 q* w  J你是上帝,1 c1 Q1 L+ ?: f+ n$ L8 t
造了43个人,这么多人要分社会阶级和社会阶层了;7 M8 w) t- ?- Y# v
因为“阶级”的词性比较重;"阶层"比较中性,+ l% J$ a2 A6 a7 S" V
所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;
$ m0 _, C8 R) G; |1 L( ?! y' b3 K$ F" V' O4 S# K4 P
如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
3 S% E2 R/ A3 w+ {3 P) S每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则
/ \: ^5 R/ Y% R- P. N. I. nNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
) J8 _) Q6 T! @  PNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15
) f3 D! O( g1 Q2 H2 N- X2 X) g) _- e1 X9 Z1 ?1 V6 {* q  N
另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)# J$ o# r! ^9 a1 S# w, u7 R' ]9 i
还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;
  i( Z) s2 H( B9 V: G. K9 z/ v, H
又有1个人SPI1_IRQChannel,设定如下
* E! e/ [3 n9 Z0 W  T5 z" @+ ~NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;$ Z, M1 b, M# e
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-153 |( A) b, i7 L. n- e

# c9 I5 t$ W/ |  }SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。' i7 Q& U% y$ Z& H
9 `1 H) ^8 I0 t6 Z- J( J
& s" x/ d4 X: o( G1 g) D3 n* M9 {/ t6 H

3 |9 P: I% o9 I* Y8 \6 B如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。' L2 C( i3 t2 Y/ L! T) l3 S
. |7 U! `9 T/ F, ?& \( R/ s! e  w
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:$ \4 d) C0 L& z8 ?* Y& _; H
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
( F# K5 ]# F+ b+ uNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
4 }1 g9 {9 k4 z% r8 a6 ?( J还需要指定他的阶层:
; d3 T) Y6 {$ e2 Z/ i4 qNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1
6 R' W! u% M% r
/ F2 T& z' j! k7 d3 f另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
+ K5 @" m$ L5 q: F2 p' v8 UNVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
4 D. d# B  N6 H# b5 w% y; Y3 Z. eNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
6 y4 B  i  ~! W6 B, ^: X  w0 oNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
3 `/ P5 z; F) n$ r/ n+ a
' c5 \$ q) T1 ?+ {, b那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
; c/ ?+ W2 d- H7 g8 I0 L: M如果他们两个同时想做事,因为前者的阶层高,所以前者优先。1 O& t0 t' Y9 D2 ]
0 Z$ l3 r4 R  t
还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
" w0 D; B' I# n4 d' Z7 a* xNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;$ y/ X8 O9 Y! ]1 h, S5 C
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7
# b6 Z$ W# ?4 s0 b9 \9 D4 dNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1+ i" P, }4 c+ p

& B3 f  b" H2 j2 d7 D% J% f* CUSART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。/ m9 Q5 b' \% C* B; y5 N
1 [+ W+ D2 V# a. t4 R& j
( g: X0 U' B; j5 w$ F: z
赞 收藏 评论0 发布时间:2022-1-18 22:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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