
在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 9 u: x+ T9 ?9 MNVIC_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); NVIC_InitStructure.NVIC_IRQChannel // 通道在头文件中 stm32f10x的定义 t( {+ x' m3 y. i; e% u . `( b4 Z k2 W7 J. ?. W; ? typedef enum IRQn { /****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ 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 */ UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */% p% [+ ^' P% T5 R+ Y SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ 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+ ] /****** 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 */ RTC_IRQn = 3, /*!< RTC global Interrupt */2 I: T, v% D4 j2 v FLASH_IRQn = 4, /*!< FLASH global Interrupt */ 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 */ EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */$ x* Y6 @( w) D- Y0 I DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ 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 */ 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 ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */7 V9 t1 y3 F* v& M6 ] CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ 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 */ TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ TIM3_IRQn = 29, /*!< TIM3 global Interrupt */# d. F/ Q( ^: y1 l; d I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ SPI1_IRQn = 35, /*!< SPI1 global Interrupt */! x. [! v h+ ], \& D+ }7 y USART1_IRQn = 37, /*!< USART1 global Interrupt */ USART2_IRQn = 38, /*!< USART2 global Interrupt */ EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ 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 */ 2 G1 r9 ^5 L- q3 L STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 #define NVIC_PriorityGroup_0 ((u32)0x700)0 S, v f6 X T0 }. x' W- o #define NVIC_PriorityGroup_1 ((u32)0x600) #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做事的时候可以打断(嵌套) 又:若分组方式为:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //按NVIC_PriorityGroup_3来分组 此时就有8个抢占优先级,2个子优先级; EXTI0_IRQChannel中断,你指定他为抢占优先级3,则: NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7 还需要指定他的阶层:6 _. N" w w& F0 D q: f! ^ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1 又有TIM2_IRQn中断,设定如下: NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_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中断 NVIC_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% aNVIC_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); NVIC_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 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;( F- J- e8 U: I8 E' f! q NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7- m. f* e `0 Z' \* Y: N; W NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } d; |+ m/ I+ g3 }/ U9 N |