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所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,* S6 ~% @+ Q! F* V NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel // 通道在头文件中 stm32f10x的定义 typedef enum IRQn { /****** Cortex-M3 Processor Exceptions Numbers ***************************************************/0 g5 |9 Z; q0 S R8 `+ V1 n4 p! i$ J NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ 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 */ 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 */ /****** STM32 specific Interrupt Numbers *********************************************************/7 q- ]$ e% j( Y" |8 ^3 Y) n8 ^ WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ TAMPER_IRQn = 2, /*!< Tamper Interrupt */ RTC_IRQn = 3, /*!< RTC global Interrupt */ FLASH_IRQn = 4, /*!< FLASH global Interrupt */& B8 f. e0 j. v( y- V8 m6 K1 v RCC_IRQn = 5, /*!< RCC global Interrupt */ 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 */ EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ 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 */ DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ #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 */ 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 */ 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 */ 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 */ EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ 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 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) #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; NVIC_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做事的时候可以打断(嵌套) 又:若分组方式为: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 还需要指定他的阶层:3 W& j2 o: z7 [3 T 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中断& { 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) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//一个工程中只能使用一种分组方式 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //CAN1 RX0中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为03 p2 R, e2 p$ ?2 \" K9 j NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_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); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7& }9 ]4 u! P1 W NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1 NVIC_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 |
实战经验 | 基于STM32G0B1的全桥移相+同步整流PWM解决方案
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:逢7发帖赢大礼】8、基于STM32G070板子的Ymodem串口协议IAP Bootloader开发
【福利三:逢7发帖赢大礼】7、基于STM32G070板子TF卡的FATFS移植
【福利三:逢7发帖赢大礼】6、基于STM32G070板子spiflash的FATFS移植
【福利三:逢7发帖赢大礼】5、基于STM32G070板子IRDA红外遥控接收解码
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
【福利三:逢7发帖赢大礼】基于STM32G070板子的uart shell移植设计
【福利三:逢7发帖赢大礼】3、基于STM32G070板子的YModem串口协议通信
【福利三:逢7发帖赢大礼】2、基于STM32G070板子的OLED移植U8G2库
微信公众号
手机版