
在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所在的外部中断通道 NVIC_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; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel // 通道在头文件中 stm32f10x的定义: z) P J6 T# z' e/ T7 Q# ~ 5 {% j( L. |6 \" T/ H% X" @3 @ typedef enum IRQn {( 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 */ 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 */ 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& @ /****** 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 */ RTC_IRQn = 3, /*!< RTC global Interrupt */ FLASH_IRQn = 4, /*!< FLASH global Interrupt */! Z2 `5 ?' d" W/ {; R/ z. | RCC_IRQn = 5, /*!< RCC global Interrupt */ EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */% V6 p; s3 V' y* Y; W2 H* F0 ~# z EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ 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 #ifdef STM32F10X_LD 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 */ 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 */ TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ 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 */ TIM2_IRQn = 28, /*!< TIM2 global Interrupt */* ?8 n' F y& p6 r( S: F! v$ Y TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ SPI1_IRQn = 35, /*!< SPI1 global Interrupt */' G' [ q) X! ^' C0 n% d 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 */ USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ #endif /* STM32F10X_LD */ 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) #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; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别,可取0-15 则SPI1_IRQChannel的抢占优先级高,EXTI0_IRQChannel做事的时候可以打断(嵌套) 又:若分组方式为: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; NVIC_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; 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; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级别0,可取0-1 USB_LP_CAN1_RX0_IRQn优先级最高,前两中断发生时,它都可以打断。 附: void NVIC_Config(void) { 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中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);. t, P7 X6 T# _9 @; A NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 指定抢占式优先级别,可取0-7 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 指定响应优先级别,可取0-1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;0 u) R, G: [& V* n0 Z) w NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_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); } |