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

【经验分享】STM32 NVIC

[复制链接]
STMCU小助手 发布时间:2022-1-29 01:01
在stm32中是要配置nvic的。何为nvic,对于我这样的初学者来说,直观感受就是在设置为中断后 还需要配置 中断的优先级nvic就是搞这个的、
那么具体的需要配置些什么那?
void NVIC_Configuration(void)' T0 l1 A* W4 |% s# j
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键WK_UP所在的外部中断通道; j8 Q6 g( j$ }* K6 I
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,* I% @" i; u7 l: N" |
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3# p/ n7 O7 e! k9 U7 N  Q5 P+ s
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道. _! a) F+ h4 J7 W, V
NVIC_Init(&NVIC_InitStructure);
9 u: x+ T9 ?9 M
NVIC_InitStructure.NVIC_IRQChannel //  通道在头文件中 stm32f10x的定义  t( {+ x' m3 y. i; e% u
. `( b4 Z  k2 W7 J. ?. W; ?
typedef enum IRQn
2 f( g7 a+ Q: ~9 w4 T1 B{
0 h+ Y0 H" E  Y# }/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
7 j" I5 ^/ N9 Q( ?# J  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
: W" {$ y. j5 O( ^$ n+ ]  d  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */6 f: S& X* i% ?, p' N( G1 ~! K
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
/ F7 z0 o; H: `6 i7 S  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */% p% [+ ^' P% T5 R+ Y
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
; n& f8 m# P# Y, a0 D  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
" a1 u4 O8 [* s# _& H  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */& s2 V/ E5 e( a4 y0 [
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */* H6 y* K5 f; b+ ]

# C0 x4 s+ ~: }9 V! c5 ]% z/******  STM32 specific Interrupt Numbers *********************************************************/2 a1 s. j2 B5 q# Q
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */0 S+ }, G( ^; ~6 o5 H
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */3 Z" q, _+ P# z5 m/ f# @
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
* V8 H6 h% I' A6 M( B- `  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */2 I: T, v% D4 j2 v
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
; ?. B- Q" W+ A# u: F  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */# Z+ S5 W2 b3 ~2 G
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */' B" u$ c8 C3 e7 E& }- m; ]; d
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
6 [* C. c! H9 Z7 n4 Z$ s  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
- U  o2 [. t" M1 |- s: @; \! F% K  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
* }/ C, i( T6 |' M" q  x' \  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
$ r' |: j" b6 Y; d. r0 V  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */$ x* Y6 @( w) D- Y0 I
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
' Y( w: B; R5 v1 B# Y6 O, [8 L8 t$ U  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
. ~) F# x( J1 X5 X1 y! t  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */! D$ T  I5 y: `* \
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */$ r# p9 H! |* j
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
$ ~+ W* L; z6 T) v* V* M' u: w% e  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */8 U% z! P4 j% B8 e( |" B0 l
" h6 F" K/ a* ^9 v* M+ Y# e! w/ K
#ifdef STM32F10X_LD
- x" z3 F# r- b. ~  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
- T6 i7 @) \1 a; N4 m  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
' |, u, R2 D6 W6 g  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
- ^5 Q( N# {8 y) f/ ]3 z4 n4 Y. ^5 E  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */7 V9 t1 y3 F* v& M6 ]
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
* x* h7 w( K! v7 ~# I$ q  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
) x2 o2 a( d! @8 b, |; l( r  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */8 v1 \3 a) o. B. t% G9 A: n2 I
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */! |! t8 B- `) N9 C- W
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */8 G+ G8 [$ j6 o
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
+ u. s! q! f% o. h% a0 t  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
( A: x, S  y) Z  }  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */# d. F/ Q( ^: y1 l; d
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
" ~% }+ H6 M+ g( K2 O- ?* V* |" q  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
! p0 G1 Y, k: l1 Q# W$ q" m  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */! x. [! v  h+ ], \& D+ }7 y
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
. z' Z  X; e# ?! {& \' A6 w3 m5 i  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
: R: Z" ?8 }4 g8 t) |  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
  ]# y9 A: E# n9 N. p; U+ L* r3 X  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */" Z& e7 Y. M1 G$ q$ l5 [# e
  USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */    8 }2 C* F3 {7 j! O
#endif /* STM32F10X_LD */  
) M: f# k5 r6 X5 o. v. f9 v2 G1 r9 ^5 L- q3 L

7 Z, h7 }: y; o# t
& b6 Q1 j7 Z. u
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下
) U/ Z3 w# @( q# f  [, i#define NVIC_PriorityGroup_0 ((u32)0x700)0 S, v  f6 X  T0 }. x' W- o
#define NVIC_PriorityGroup_1 ((u32)0x600)
) P- k$ t! ]% T5 W9 t6 ^4 L. i#define NVIC_PriorityGroup_2 ((u32)0x500)1 t0 l2 t2 b% n! m* y/ d
#define NVIC_PriorityGroup_3 ((u32)0x400)- W$ ~* I" s- ^3 ?. ]
#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,则( u1 U! b5 G5 V8 d6 h, O6 p
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;; p: U) o0 l" y% y, C- Q( T0 Q
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别,可取0-15
又有1中断SPI1_IRQChannel,设定如下1 R- f; K  A- J" j. E0 w& p
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;: |9 B- K# w& m- l6 U/ Z+ f8 Y2 f# \
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别,可取0-15
则SPI1_IRQChannel的抢占优先级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)

" G0 |" d$ D) j
又:若分组方式为:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);    //按NVIC_PriorityGroup_3来分组
此时就有8个抢占优先级,2个子优先级;
EXTI0_IRQChannel中断,你指定他为抢占优先级3,则:
6 k) n7 L& d6 S4 X1 e1 GNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
) [3 T) p" ~- NNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7
% [1 q' P" N2 }% B6 ~9 P还需要指定他的阶层:6 _. N" w  w& F0 D  q: f! ^
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1
又有TIM2_IRQn中断,设定如下:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
% b- {3 U& v* B( a) W: p8 Y9 cNVIC_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中断
4 D4 _* n6 G" t! J. BNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级05 [( q! n' A, Q% T9 H: U) V
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //响应优先级别0,可取0-1
USB_LP_CAN1_RX0_IRQn优先级最高,前两中断发生时,它都可以打断。
附:
void NVIC_Config(void)
{     
* Q" ?, }. H  N3 Z% a
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//一个工程中只能使用一种分组方式+ |. g1 L) I5 a; A" x  s
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //CAN1 RX0中断7 p7 e/ s$ I# z1 J/ H/ g) l
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0  N& L6 T6 Q7 b! G0 f! [
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为05 [3 [, `1 I5 O$ z: u
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;% z! y! d1 ?" ]( z; K
NVIC_Init(&NVIC_InitStructure);
/ F& V  U8 N" }0 G# mNVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;7 e, k" g2 ~( X; \5 y
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 指定抢占式优先级别,可取0-7$ s4 t2 n/ e+ Z6 F. Z) [& L7 G; B
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 指定响应优先级别,可取0-1
0 R# e& ~! z0 V( ?* _" V& ]3 f( ENVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;( F- J- e8 U: I8 E' f! q
NVIC_Init(&NVIC_InitStructure);
' m0 \" e1 `2 x& J! ~NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
$ I% Y: C. L+ S/ Q: rNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7- m. f* e  `0 Z' \* Y: N; W
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1
, S, k6 K4 D3 b/ Q6 y7 k9 FNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
" d6 N; h" d9 E7 a& lNVIC_Init(&NVIC_InitStructure);
}
  d; |+ m/ I+ g3 }/ U9 N

! T; _+ p, l5 l; ^: |) e
收藏 评论0 发布时间:2022-1-29 01:01

举报

0个回答

所属标签

相似分享

官网相关资源

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