STM32-外部中断

声明!!!

这是我看B站江科大视频写的笔记,我同时也是一名学习嵌入式的萌新,如果文中有不严谨,不对的地方,请告诉我,让我及时改正。

中断简介

1.STM32中断通道

68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。(本文只有外部中断EXTI)。

2.NVIC优先级分组

 NVIC的中断优先级由优先级寄存级的4位(0~15)决定,并且可以按下图方式进进行切分。

3.中断的执行逻辑

同时执行多个中断时,响应优先级高的可以优先进入中断。

如果现在正在执行一个中断,突然来了一个抢占优先级高的中断,那么这个中断就可以直接打断正在执行的中断,这就是中断嵌套,等这个中断完了才可以继续执行原来的中断。

当出现两个一样抢占优先级高的中断的时候,响应优先级更高的先执行。

优先级数字越小,优先级越高。

外部中断 (EXTI)

1.简介

EXTI可以检测指定GPIO口的电平信号,当GPIO口产生电平跳变时,EXTI向NVIC发送中断申请,经过NVIC判断后就可以中断CPU主程序,使CPU执行对应的中断程序。

2.触发方式

支持上升沿/下降沿/双边沿/软件触发。

3.支持的端口

支持所有GPIO口(相同的pin不可以同时用,例如PA0和PB0,因为相同的GPIO口用的时同一个中断通道)。

4.通道数

通道:

 16个GPIO_Pin,外加PVD输出,RTC闹钟,USB唤醒,以太网唤醒(如图)。

补充:

PVD输出,RTC闹钟,USB唤醒,以太网唤醒这几个是因为外部中断还有一个功能,从低功耗的停止模式下唤醒STM32。

1.PVD电源电压检测

电源从低电压恢复时,需要借助外部中断退出停止模式。

2.RTC闹钟

RTC定一个闹钟进入休眠模式,当时间到后,借助外部中断来退出休眠。

3.USB唤醒

当USB设备连接到STM32微控制器的USB接口时,设备可发送唤醒信号到微控制器,使其从低功耗模式中唤醒。此时,外部中断引脚会产生一个中断信号,触发唤醒处理程序,从而使系统重新运行。

4.以太网唤醒

以太网模块一般会进入休眠模式以降低功耗,当需要唤醒以太网模块时,可以通过配置外部中断来接收唤醒信号。当外部中断触发时,微控制器会响应中断并执行相应的唤醒操作,从而唤醒以太网模块。

5.外部中断的触发响应方式

中断响应:外部检测引脚检测到引脚电平变化时,申请中断,让CPU执行中断函数。

事件响应:外部检测引脚检测到引脚电平变化时,可以选择触发一个事件。(选择触发一个事件时,中断信号就不会通向CPU了,而会通向其他外设。)

6.外部中断的使用

AFIO复用IO口的功能:
1.复用功能引脚重映射

将右图中默认复用引脚换到重定义的位置

2.中断引脚选择

这就是外部中断中要使用的功能。

代码部分

1.重要函数

1.EXTI部分

GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

/**
  * @简介  选择GPIO口作为外部中断线
  * @参数  GPIO_PortSource: 选择某个GPIO口作为外部中断源
  *   这个参数可以是 GPIO_PortSourceGPIOx 其中x可以是 (A..G).
  * @参数  GPIO_PinSource: 指定要配置的外部中断线
  *   这个参数可以是 GPIO_PinSourcex 其中x可以是 (0..15).
  * @retval None
  */
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
  uint32_t tmp = 0x00;
  /* 函数进行参数的检查,确保参数的有效性。*/
  assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
   /* 然后根据引脚源选择,设置相应的EXTICR寄存器,将GPIO端口源选择写入寄存器中。具体的操作是通过位运算将GPIO_PortSource左移,然后按位或操作写入寄存器中。*/
  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
 //生成一个软件中断.

void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

主程序建议用下面前两个,中断函数中建议使用下面后两个

//作用  获取指定标志位是否被置1了.
 
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
//对置1的标志位进行清除.
  
void EXTI_ClearFlag(uint32_t EXTI_Line);
// 获取中断标志位是否被置1.

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//清除中断挂起标志位.

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);


/*清除EXTI所有配置*/
void EXTI_DeInit(void);
/*调用它,用它里面的参数配置EXTI外设*/
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
/**
  * @brief  给EXTI结构体赋一个初始值.
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct)
{
  EXTI_InitStruct->EXTI_Line = EXTI_LINENONE;
  EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStruct->EXTI_LineCmd = DISABLE;
}
 2.NVIC部分
/**
  * @作用  中断分组的方式.下面这一部分上NVIC优先级分组有介绍
  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length. 
  *   This parameter can be one of the following values:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority
  * @retval None
  */
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}


 

//初始化的
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

2.初始化

1.GPIO初始化
     /*开启GPIOx的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);

    /*以下为GPIO口初始化,需要注意的是GPIO_Mode的选择,外部中断可以选择上拉/下拉/浮空输入,选择哪种模式要看实际情况,这里是上拉输入*/
	GPIO_InitTypeDef GPIOInitStructure;
	GPIOInitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIOInitStructure.GPIO_Pin=GPIO_Pin_x;
	GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOx,&GPIOInitStructure);
2.EXIT初始化 


    /*AFIO有中断引脚选择的功能,所以要开启AFIO的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    

	/*EXIT函数配置*/

    /*选择GPIO端口作为EXTI线路的源。详见上面重要函数。*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcex);
	EXTI_InitTypeDef EXTI_Init_Structure;
	EXTI_Init_Structure.EXTI_Line=EXTI_Linex;//选择要启用和禁用的EXIT行
    /*指定所选EXIT行的新状态ENABLE(启用)DISABLE(禁用)*/
	EXTI_Init_Structure.EXTI_LineCmd=ENABLE;
    //
    /*选择中断模式  EXTI_Mode_Interrupt   (外部中断)
                   EXTI_Mode_Event       (事件中断)*/
	EXTI_Init_Structure.EXTI_Mode=EXTI_Mode_Interrupt;
    //
    /*下降沿触发          EXTI_Trigger_Falling
      上升沿触发          EXTI_Trigger_Rising
      上升沿下降沿都触发   EXTI_Trigger_Rising_Falling   */
	EXTI_Init_Structure.EXTI_Trigger=EXTI_Trigger_Falling;
    //
	EXTI_Init(&EXTI_Init_Structure);
	
3.NVIC初始化
    //NVIC配置
    /*中断分组方式*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //
	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);
 4.中断服务函数

中断服务函数都是固定的,可以在启动文件(startup_stm32f10x_md.s)中找到,附录中也有。有关GPIO口的外部中断的是以下几个。

EXTI0_IRQHandler//pin0
EXTI1_IRQHandler//pin1
EXTI2_IRQHandler//pin2             
EXTI3_IRQHandler//pin3           
EXTI4_IRQHandler//pin4    
EXTI9_5_IRQHandler//pin5-pin9  
EXTI10_15_IRQHandler//pin10-pin15  

附录

 1.中等密度芯片中断通道
#ifdef STM32F10X_MD
  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 */  
#endif /* STM32F10X_MD */  
2.中断服务函数 

                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  PVD_IRQHandler             [WEAK]
                EXPORT  TAMPER_IRQHandler          [WEAK]
                EXPORT  RTC_IRQHandler             [WEAK]
                EXPORT  FLASH_IRQHandler           [WEAK]
                EXPORT  RCC_IRQHandler             [WEAK]
                EXPORT  EXTI0_IRQHandler           [WEAK]
                EXPORT  EXTI1_IRQHandler           [WEAK]
                EXPORT  EXTI2_IRQHandler           [WEAK]
                EXPORT  EXTI3_IRQHandler           [WEAK]
                EXPORT  EXTI4_IRQHandler           [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
                EXPORT  ADC1_2_IRQHandler          [WEAK]
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler         [WEAK]
                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler         [WEAK]
                EXPORT  TIM2_IRQHandler            [WEAK]
                EXPORT  TIM3_IRQHandler            [WEAK]
                EXPORT  TIM4_IRQHandler            [WEAK]
                EXPORT  I2C1_EV_IRQHandler         [WEAK]
                EXPORT  I2C1_ER_IRQHandler         [WEAK]
                EXPORT  I2C2_EV_IRQHandler         [WEAK]
                EXPORT  I2C2_ER_IRQHandler         [WEAK]
                EXPORT  SPI1_IRQHandler            [WEAK]
                EXPORT  SPI2_IRQHandler            [WEAK]
                EXPORT  USART1_IRQHandler          [WEAK]
                EXPORT  USART2_IRQHandler          [WEAK]
                EXPORT  USART3_IRQHandler          [WEAK]
                EXPORT  EXTI15_10_IRQHandler       [WEAK]
                EXPORT  RTCAlarm_IRQHandler        [WEAK]
                EXPORT  USBWakeUp_IRQHandler       [WEAK]

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值