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

【经验分享】STM32 NVIC

[复制链接]
STMCU小助手 发布时间:2022-1-29 01:01
在stm32中是要配置nvic的。何为nvic,对于我这样的初学者来说,直观感受就是在设置为中断后 还需要配置 中断的优先级nvic就是搞这个的、
那么具体的需要配置些什么那?
void NVIC_Configuration(void)/ b# s+ w; e# X6 J2 H/ R. I
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键WK_UP所在的外部中断通道
7 _4 M( O9 I: a8 ?* j) VNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,* S6 ~% @+ Q! F* V
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3
. T2 Y! ^) @* d# P/ T+ d1 ZNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
9 \: @4 n3 E+ ~5 mNVIC_Init(&NVIC_InitStructure);

! a) [+ |2 D- w0 S6 v' R8 _  g/ DNVIC_InitStructure.NVIC_IRQChannel //  通道在头文件中 stm32f10x的定义
/ \' }" k. Z& q% V$ s
. T; r1 y& v4 c0 m! ctypedef enum IRQn
2 L) g- i0 F, `. D/ ]{
/ T( ?! o/ g. Z% d5 u+ D  E/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/0 g5 |9 Z; q0 S  R8 `+ V1 n4 p! i$ J
  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
3 T! m! M& t7 ^% e1 q" A: \; }  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */7 S; {+ b8 `+ B6 p0 G4 r
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */5 P& k+ d# e8 Q
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
0 W' v0 o; s, |6 N: l/ `0 m  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */% m, d4 _- _2 [2 B
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */0 _( l( Y  N, z0 N: a' C4 R; u1 P
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */! ~: C" B% {  j: `, z2 l/ f! w8 ~
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */
/ j; k3 X; P4 g. ^+ b# ]7 O2 B, R
) U; C" \+ t  D" Q& ~6 m/******  STM32 specific Interrupt Numbers *********************************************************/7 q- ]$ e% j( Y" |8 ^3 Y) n8 ^
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
3 R! b) E& D) B' p3 c. Z; G6 w  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
) r+ l, J5 t* ?9 W+ _  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
/ q& X8 U2 {$ Z7 v# q  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
$ B# x' N) ^& Y, Y9 v  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */& B8 f. e0 j. v( y- V8 m6 K1 v
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
  o; B! N% w3 Q" A$ Y  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */7 q5 K* T$ w* Z
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */1 X! w7 e$ k  x! p- u1 H5 ]; ^
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
% H4 s) \( e' |  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
* |& f7 r" Y/ u+ U" n4 S# W# E  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
9 _3 g. r3 P/ U! z- E) b6 Y' }) v/ \; y  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */! ?0 |9 h( d, Q* d1 C
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */6 |. M# c1 U& K1 L
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */) @, J+ u7 R, d& I( ?& {4 c
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
8 P. Q0 U" S3 A5 `, p, v9 k5 {  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
; q, C1 p9 \; c5 S# W3 U& u0 S  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
1 d- Y. ^! A  t) y  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
0 I, a* H: M0 T
9 P! S( c1 Z4 g#ifdef STM32F10X_LD. D1 q2 w  C0 S/ U, L
  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */2 p  g, Q! e9 m. ^1 ^/ D0 H( D5 ]
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */% D6 d* I5 D1 g3 t4 K7 W, l
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
% @: u' q& ~$ l1 V( ^: U" P  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */% Q' d) }! w5 T1 \; r
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */. K$ ?/ M1 |4 k, L, K2 i
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
2 w- L7 R! ^5 ~2 e2 m  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */0 R+ \. T- M. ^4 T* Y: _0 Z
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */# ]5 |/ t& i) e9 O
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
1 d/ v1 E: _3 u) ~  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */2 y' u4 P; [0 U  W' f& X
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */! U1 u' e) t, a2 q* D$ j
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */: i! _$ o+ M, v5 g
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */  d4 r: Y3 B: N! y+ a  c
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */5 B; d: P5 e2 ~: E$ f  |0 s. K( a
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */, y+ [$ F' d3 T$ j. ^
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */$ J8 n9 S* r: {* k
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
# `8 p% c3 r% X, i, l  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
8 d- f7 Y0 R5 j, ~: k7 u* Q6 D7 |  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */7 _) k) b& S" |6 w: r. @
  USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */    6 c1 S# ~1 E7 y* K* v8 Z& {  {
#endif /* STM32F10X_LD */  , b$ F6 e% L+ j9 [2 J( T/ `
" U; w! D* v: l0 B! E( k9 a

, H* W- ?) k( O& Z
# c: _& `' d5 T/ c! m# _' x
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下* {2 H& N0 U0 j, D
#define NVIC_PriorityGroup_0 ((u32)0x700)* `: E2 }$ B+ G$ F6 h- H" h
#define NVIC_PriorityGroup_1 ((u32)0x600)
5 q, e1 W9 y# s; B: Y" X#define NVIC_PriorityGroup_2 ((u32)0x500)) z, f" \" n( N; C  q2 e& Z* M( m- T( `
#define NVIC_PriorityGroup_3 ((u32)0x400)3 Q; W+ E+ I) N' y$ J
#define NVIC_PriorityGroup_4 ((u32)0x300)
每个工程只能有一种分组方式:
按NVIC_PriorityGroup_0来分组:抢占优先级为1个,子优先级为16个;
按NVIC_PriorityGroup_1来分组:抢占优先级为2个,子优先级为8个;
按NVIC_PriorityGroup_2来分组:抢占优先级为4个,子优先级为4个;
按NVIC_PriorityGroup_3来分组:抢占优先级为8个,子优先级为2个;
按NVIC_PriorityGroup_0来分组:抢占优先级为16个,子优先级为1个;
抢占优先级高的中断可以打断抢占优先级低的中断;抢占优先级相同时比较响应优先级(子优先级)。
先设定分组方式
例:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);    //按NVIC_PriorityGroup_4来分组
此时,有一中断EXTI0_IRQChannel,你指定他为抢占优先级8,则5 w, m) g9 ], W4 E
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
6 Q0 _, Z- b! ?0 [) c  XNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别,可取0-15
又有1中断SPI1_IRQChannel,设定如下, C8 R. f( H9 J/ `; L
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;; `8 R7 L* x: c; ?3 Y+ y6 I  w0 ^
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别,可取0-15
则SPI1_IRQChannel的抢占优先级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)

# G; T6 Q' _0 N: V! t: Q. e. I
又:若分组方式为:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);    //按NVIC_PriorityGroup_3来分组
此时就有8个抢占优先级,2个子优先级;
EXTI0_IRQChannel中断,你指定他为抢占优先级3,则:& l5 i4 A* u5 u
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;0 y6 f1 ?" H6 L4 Q: S
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7
. [  I7 b6 f- j$ J/ r' Y3 f; |还需要指定他的阶层:3 W& j2 o: z7 [3 T
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1
又有TIM2_IRQn中断,设定如下:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
; P/ q+ y4 \' V) N7 k* eNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 指定抢占式优先级别,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 指定响应优先级别,可取0-1
由于抢占优先级相同,响应优先级EXTI0_IRQChannel中断高于TIM2_IRQn中断,所以EXTI0_IRQChannel可以打断TIM2_IRQn;
还有一USB_LP_CAN1_RX0_IRQn,设定如下:
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;   //CAN1 RX0中断& {  I2 t0 G/ N" |' M
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级03 \( M6 i9 m9 d% x* h8 g4 {
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //响应优先级别0,可取0-1
USB_LP_CAN1_RX0_IRQn优先级最高,前两中断发生时,它都可以打断。
附:
void NVIC_Config(void)
{     

& S+ R% ~* O& g
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//一个工程中只能使用一种分组方式
3 E  ^1 Z0 `  h" i. XNVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //CAN1 RX0中断
4 v2 }' [- h! i/ v: j. d1 CNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
1 k' z/ x/ x% ?* J$ xNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为03 p2 R, e2 p$ ?2 \" K9 j
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/ f1 x6 c5 N0 h  ONVIC_Init(&NVIC_InitStructure);5 e' `% B, g5 Z3 c6 e7 V
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;1 y! g- y9 i; U% @& G
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 指定抢占式优先级别,可取0-7- U0 B  _; d$ t! i8 h9 m
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 指定响应优先级别,可取0-1( w5 w5 k. M/ P' \
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;: l8 f- X! K) _& I6 h1 N1 V
NVIC_Init(&NVIC_InitStructure);
* g( q- g, G. t4 a6 c$ g1 dNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
6 r% n, D+ R& F- uNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7& }9 ]4 u! P1 W
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1
* f( d9 V& f. ~) D+ kNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;2 F' v, x/ Z' g0 Z
NVIC_Init(&NVIC_InitStructure);
}
. }3 O" p2 {4 P. l
. H4 F/ w; u) K5 ~# o/ i7 Y
赞 收藏 评论0 发布时间:2022-1-29 01:01

举报

0个回答

所属标签

相似技术帖

官网相关资源

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