STM32 EXTI

STM32标准库学习笔记-STM32 EXTI

中断

  • 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得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)

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//NVIC中断优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//NVIC配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure); 

NVIC_InitTypeDef为NVIC初始化结构体

  1. NVIC_IRQChannel为中断通道 ( IRQChannel )
  2. NVIC_IRQChannelCmd为通道使能:ENABLE为开启,DISABLE为关闭
  3. NVIC_IRQChannelPreemptionPriority为抢占优先级
  4. NVIC_IRQChannelSubPriority为响应优先级 中断触发后,将会进入中断函数 void xHandler(void)
  5. EXTI_GetITStatus函数可获取某个中断标志位
  6. 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唤醒、以太网唤醒
  • 触发响应方式:中断响应/事件响应

代码

1
2
3
4
5
6
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
  1. EXTI_Line为中断线来源
  2. EXTI_LineCmd为中断线使能:ENABLE为开启,DISABLE为关闭
  3. EXTI_Mode为EXTI的模式
  4. 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主要完成两个任务:复用功能引脚重映射、中断引脚选择

代码

1
2
3
4
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
  1. GPIO_PortSourceGPIOx为选择的GPIO_Port
  2. GPIO_PinSource为选择的GPIO_Pin

外部中断完整配置流程

  1. 配置时钟
    1. GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    2. AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  2. 配置GPIO GPIO_Init(GPIOB, &GPIO_InitStructure);
  3. 配置AFIO GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
  4. 配置EXTI EXTI_Init(&EXTI_InitStructure);
  5. 配置NVIC
    1. 中断分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    2. 中断配置 NVIC_Init(&NVIC_InitStructure);
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计