中断
- 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
- 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
- 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回
STM32中断
- 68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设
- 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级




NVIC
基本结构

优先级分组
- NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
- 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
| 分组方式 | 抢占优先级 | 响应优先级 | 宏 | 值 |
|---|---|---|---|---|
| 分组0 | 0位,取值为0 | 4位,取值为0~15 | NVIC_PriorityGroup_0 | ((uint32_t)0x700) |
| 分组1 | 1位,取值为0~1 | 3位,取值为0~7 | NVIC_PriorityGroup_1 | ((uint32_t)0x600) |
| 分组2 | 2位,取值为0~3 | 2位,取值为0~3 | NVIC_PriorityGroup_2 | ((uint32_t)0x500) |
| 分组3 | 3位,取值为0~7 | 1位,取值为0~1 | NVIC_PriorityGroup_3 | ((uint32_t)0x400) |
| 分组4 | 4位,取值为0~15 | 0位,取值为0 | NVIC_PriorityGroup_4 | ((uint32_t)0x300) |
代码
|
|
NVIC_InitTypeDef为NVIC初始化结构体
NVIC_IRQChannel为中断通道 ( IRQChannel )NVIC_IRQChannelCmd为通道使能:ENABLE为开启,DISABLE为关闭NVIC_IRQChannelPreemptionPriority为抢占优先级NVIC_IRQChannelSubPriority为响应优先级 中断触发后,将会进入中断函数void xHandler(void)EXTI_GetITStatus函数可获取某个中断标志位EXTI_ClearITPendingBit函数可清除某个中断标志位(<u>必须</u>)
中断通道(以STM32F10X_MD为准)
| NVIC_IRQChannel | 值 | 描述 |
|---|---|---|
| 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 |
| 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 |
| EXTI4_IRQn | 10 | EXTI Line4 Interrupt |
| DMA1_Channel1_IRQn | 11 | DMA1 Channel 1 global Interrupt |
| 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 |
| 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 |
| 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 |
| CAN1_SCE_IRQn | 22 | CAN1 SCE Interrupt |
| EXTI9_5_IRQn | 23 | External Line[9:5] Interrupts |
| TIM1_BRK_IRQn | 24 | TIM1 Break Interrupt |
| TIM1_UP_IRQn | 25 | TIM1 Update Interrupt |
| TIM1_TRG_COM_IRQn | 26 | TIM1 Trigger and Commutation Interrupt |
| TIM1_CC_IRQn | 27 | TIM1 Capture Compare Interrupt |
| TIM2_IRQn | 28 | TIM2 global Interrupt |
| TIM3_IRQn | 29 | TIM3 global Interrupt |
| TIM4_IRQn | 30 | TIM4 global Interrupt |
| I2C1_EV_IRQn | 31 | I2C1 Event Interrupt |
| I2C1_ER_IRQn | 32 | I2C1 Error Interrupt |
| I2C2_EV_IRQn | 33 | I2C2 Event Interrupt |
| I2C2_ER_IRQn | 34 | I2C2 Error Interrupt |
| SPI1_IRQn | 35 | SPI1 global Interrupt |
| SPI2_IRQn | 36 | SPI2 global Interrupt |
| USART1_IRQn | 37 | USART1 global Interrupt |
| USART2_IRQn | 38 | USART2 global Interrupt |
| USART3_IRQn | 39 | USART3 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 |
EXTI
基本结构

- EXTI(Extern Interrupt)外部中断
- EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
- 支持的触发方式:上升沿/下降沿/双边沿/软件触发
- 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
- 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
- 触发响应方式:中断响应/事件响应
代码
|
|
EXTI_Line为中断线来源EXTI_LineCmd为中断线使能:ENABLE为开启,DISABLE为关闭EXTI_Mode为EXTI的模式EXTI_Trigger为触发边缘
| EXTI_Line | 值 | 描述 |
|---|---|---|
| EXTI_Line0 | ((uint32_t)0x00001) | External interrupt line 0 |
| EXTI_Line1 | ((uint32_t)0x00002) | External interrupt line 1 |
| EXTI_Line2 | ((uint32_t)0x00004) | External interrupt line 2 |
| EXTI_Line3 | ((uint32_t)0x00008) | External interrupt line 3 |
| EXTI_Line4 | ((uint32_t)0x00010) | External interrupt line 4 |
| EXTI_Line5 | ((uint32_t)0x00020) | External interrupt line 5 |
| EXTI_Line6 | ((uint32_t)0x00040) | External interrupt line 6 |
| EXTI_Line7 | ((uint32_t)0x00080) | External interrupt line 7 |
| EXTI_Line8 | ((uint32_t)0x00100) | External interrupt line 8 |
| EXTI_Line9 | ((uint32_t)0x00200) | External interrupt line 9 |
| EXTI_Line10 | ((uint32_t)0x00400) | External interrupt line 10 |
| EXTI_Line11 | ((uint32_t)0x00800) | External interrupt line 11 |
| EXTI_Line12 | ((uint32_t)0x01000) | External interrupt line 12 |
| EXTI_Line13 | ((uint32_t)0x02000) | External interrupt line 13 |
| EXTI_Line14 | ((uint32_t)0x04000) | External interrupt line 14 |
| EXTI_Line15 | ((uint32_t)0x08000) | External interrupt line 15 |
| EXTI_Line16 | ((uint32_t)0x10000) | External interrupt line 16 Connected to the PVD Output |
| EXTI_Line17 | ((uint32_t)0x20000) | External interrupt line 17 Connected to the RTC Alarm event |
| EXTI_Line18 | ((uint32_t)0x40000) | External interrupt line 18 Connected to the USB Device/USB OTG FS Wakeup from suspend event |
| EXTI_Line19 | ((uint32_t)0x80000) | External interrupt line 19 Connected to the Ethernet Wakeup event |
AFIO
基本结构

- AFIO主要用于引脚复用功能的选择和重定义
- 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
代码
|
|
GPIO_PortSourceGPIOx为选择的GPIO_PortGPIO_PinSource为选择的GPIO_Pin
外部中断完整配置流程
- 配置时钟
- GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); - AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- GPIO时钟
- 配置GPIO
GPIO_Init(GPIOB, &GPIO_InitStructure); - 配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14); - 配置EXTI
EXTI_Init(&EXTI_InitStructure); - 配置NVIC
- 中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); - 中断配置
NVIC_Init(&NVIC_InitStructure);
- 中断分组