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

【经验分享】STM32 NVIC

[复制链接]
STMCU小助手 发布时间:2022-1-29 01:01
在stm32中是要配置nvic的。何为nvic,对于我这样的初学者来说,直观感受就是在设置为中断后 还需要配置 中断的优先级nvic就是搞这个的、
那么具体的需要配置些什么那?
void NVIC_Configuration(void)/ O* U" n+ J6 G
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键WK_UP所在的外部中断通道
- c0 u- t) L% k8 R% n8 ~4 u8 DNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,! x& A+ x) g# w1 g: q/ N
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3. L0 N* L% T0 k9 q" O! d
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  b5 K0 S8 N( ]+ JNVIC_Init(&NVIC_InitStructure);

$ `9 c) E# C% X4 D! C$ \0 A8 bNVIC_InitStructure.NVIC_IRQChannel //  通道在头文件中 stm32f10x的定义: z) P  J6 T# z' e/ T7 Q# ~
5 {% j( L. |6 \" T/ H% X" @3 @
typedef enum IRQn
- A- ?- e' C& @5 e' r& ~  X{( Z/ t3 m# V2 W* z1 H/ a+ x
/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/8 S7 E9 [$ t7 s9 [
  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */4 m6 o6 J  ?2 b3 F
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
* X& D# ?; ?, o# J7 y0 \/ i  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */1 Z8 T+ z8 g9 X* z- V9 H+ Q
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */0 m( @) t* r$ [
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */; N0 y% }! |. V" j
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
. D: S" o' d) v) P9 n  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */- {" e7 D" k! |% @- ?
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */$ J/ r" m7 e( `  ?& }) c& @

: W" Z7 K/ e1 V8 r* y# C4 ?& n/******  STM32 specific Interrupt Numbers *********************************************************/  X9 u, a5 W" {# a, D# H4 H5 c& d
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */' u+ u0 ~1 p; Q! m0 v) ^5 M# c2 Z2 q
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */0 b% S% q$ S) V$ P
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
8 y. E8 Z8 M6 y( m0 X, S  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
+ {0 g* _% w. f% B4 r: x4 C  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */! Z2 `5 ?' d" W/ {; R/ z. |
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
% q9 X6 Z: A7 v4 w$ L& V  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
2 ]1 k, Q7 n, }$ j1 T  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
4 m! Y  s+ p8 Z+ u' C/ d, t" h  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
' i8 E  g6 `( L3 B7 w4 U1 y8 x  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */% V6 p; s3 V' y* Y; W2 H* F0 ~# z
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
- H$ F' Z/ u; q3 L& b+ e  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
9 m* Q  ^# Z4 \0 Y3 v  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */4 F! m6 n, V: G9 S# D7 P# ]
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */2 w" g; p% K/ V7 H6 e7 ?+ u# U
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */8 H4 h7 |9 }5 m$ N9 x% N
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */% a; o" x" |! O- }5 F, C
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      *// s* e( l- x& ?
  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */( G' D( W: y1 D; B, ?$ I' q# K, z9 J

' n; X6 M. ?. T3 z' e/ q  [#ifdef STM32F10X_LD
+ z6 O+ g. e+ J6 T4 E# @  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */1 l5 p  ]4 E& s5 Y4 A! ^2 g
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */" h8 m& P5 q& Q8 |* l! P& S! f
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
* g% r$ A2 u! D3 _6 j2 J( T* @' x7 A# \6 N  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */. h$ I& Q4 Q& Z" Q
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */, H' u7 z# R, y0 D) I  l$ m+ q% S4 s7 ]
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
  e4 k- I  I+ V) K8 @3 A- s  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
- W  g+ T- }; a* r. ^- `. `  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */: z" W% r$ e1 z( `+ O) R' i
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */  Y5 n! }! N/ x) A* t
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
! o" D% L! T- Z$ q+ R. }8 o  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */* ?8 n' F  y& p6 r( S: F! v$ Y
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
7 P- i+ r' s$ C+ @4 t4 P  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
7 N% r' m$ M- k* j2 ~& K4 [  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
7 U9 w  i3 ~6 @  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */' G' [  q) X! ^' C0 n% d
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
' Q( W, t7 j# |& m" t  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
- `' n1 Y: ~& @5 W! o  k1 h  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
6 H& c8 |" c3 z5 E# J  ]% I  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
) r- u2 E/ C  A1 l  USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */   
! L6 T. l  _- ]* T# d#endif /* STM32F10X_LD */  
; t9 g  e5 d- g- U2 x
% W+ _" ~9 {2 ^5 k; n5 ^* g, j
& r1 b" I% k* b& u4 @# R7 ^
' t1 _  E5 B% y/ G
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下( u7 u! W- p0 ^. `
#define NVIC_PriorityGroup_0 ((u32)0x700)6 s9 y! T% O- v7 p
#define NVIC_PriorityGroup_1 ((u32)0x600). \& i) @8 o1 O3 P( X
#define NVIC_PriorityGroup_2 ((u32)0x500)
: ?9 q/ b' |1 ?5 ?+ O- n#define NVIC_PriorityGroup_3 ((u32)0x400)3 J; i+ ]6 Q) u1 ?
#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,则9 e+ _2 i! b& Z/ j* K. @
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;( n) W! }- b  F, C6 B! M8 Z
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别,可取0-15
又有1中断SPI1_IRQChannel,设定如下6 M+ \" m; y# m; }
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
9 P2 E- J5 b0 f* Z+ D- x' H( INVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别,可取0-15
则SPI1_IRQChannel的抢占优先级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)

6 h4 H' |# W# j+ ~) F
又:若分组方式为:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);    //按NVIC_PriorityGroup_3来分组
此时就有8个抢占优先级,2个子优先级;
EXTI0_IRQChannel中断,你指定他为抢占优先级3,则:& G5 {, T( u2 ~: f! H: p) ~
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
0 G" z7 g: Q6 x. i2 W1 |7 ONVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-77 E* F' u5 Y" ^
还需要指定他的阶层:& [  }) X( U2 P" h
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1
又有TIM2_IRQn中断,设定如下:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
1 Y# j2 K  B& G0 J; x  b" p2 wNVIC_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中断
; r( R% M% f" f+ o0 kNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级0
* h! D& m9 E1 [- }! S1 J0 @7 tNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //响应优先级别0,可取0-1
USB_LP_CAN1_RX0_IRQn优先级最高,前两中断发生时,它都可以打断。
附:
void NVIC_Config(void)
{     

! n( E0 W& G; w. A, z
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//一个工程中只能使用一种分组方式, F$ z! h  v$ G4 v
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //CAN1 RX0中断
, w, G! [/ W0 d! bNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
$ ], @: S* q& Z* F) j$ SNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0
/ U% f3 i2 l% t9 mNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
! p: R2 k2 ]$ MNVIC_Init(&NVIC_InitStructure);. t, P7 X6 T# _9 @; A
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
8 K2 @2 ?9 x8 ]4 k) k/ CNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 指定抢占式优先级别,可取0-7
7 _* {) l; ]& h0 H6 e, Z+ `$ ?* KNVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 指定响应优先级别,可取0-1
  U/ Y; S4 G" M5 q) G8 u! NNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;0 u) R, G: [& V* n0 Z) w
NVIC_Init(&NVIC_InitStructure);
6 Q0 n% l8 {7 p5 {' jNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
) t) G/ {0 M+ \/ WNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7) z- i5 }: Y5 E1 A
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1, H8 O& f. `3 u4 B0 [
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;9 V2 S* Q, O/ o! o1 Z
NVIC_Init(&NVIC_InitStructure);
}

: m+ ?7 b4 e# F) \2 F
$ J: H1 T1 D4 [6 f/ v
收藏 评论0 发布时间:2022-1-29 01:01

举报

0个回答

所属标签

相似分享

官网相关资源

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