一、中断

中断: CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。

STM32 CubeMX 中断NVIC_STM32 CubeMX 中断NVIC

 

1、EXTI
EXTI:外部中断/事件控制器

上升沿:数字电平从低电平(0)变为高电平(1),那一瞬间。

下降沿:数字电平从高电平(1)变为低电平(0),那一瞬间。

 

EXTI 主要特性
EXTI 控制器的主要特性如下:
● 每个中断/事件线上都具有独立的触发和屏蔽
● 每个中断线都具有专用的状态位
● 支持多达 23 个软件事件/中断请求

STM32 CubeMX 中断NVIC_STM32 CubeMX 中断NVIC_02

 

多达 140 个 GPIO( STM32F405xx/07xx 和 STM32F415xx/17xx)通过以下方式连接到 16 个
外部中断/事件线

另外七根 EXTI 线连接方式如下:
● EXTI 线 16 连接到 PVD 输出
● EXTI 线 17 连接到 RTC 闹钟事件
● EXTI 线 18 连接到 USB OTG FS 唤醒事件
● EXTI 线 19 连接到以太网唤醒事件
● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
● EXTI 线 21 连接到 RTC 入侵和时间戳事件
● EXTI 线 22 连接到 RTC 唤醒事件

 

  1. NVIC

NVIC:嵌套向量中断控制器,作用是提供中断通道及中断的优先级控制。

 

NVIC :嵌套向量中断控制器,用于总体管理异常

Cortex-M4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。

STM32F4并没有使用Cortex-M4内核的全部东西,而是只用了它的一部分。

STM32F40xx/STM32F41xx总共有92个中断

STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断。

16 个可编程优先级(使用了 4 位中断优先级 )

 

 中断管理:

首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置(注意:数字越小,优先级越高)

STM32 CubeMX 中断NVIC_STM32 CubeMX 中断NVIC_03

注意:数字越小,优先级别越高

 

 抢占优先级 & 响应优先级区别:

高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

 

二、按键中断程序实现步骤

中断要添加的库函数文件:stm32f4xx_exti.c和stm32f4xx_syscfg.c

1、理解按键电路原理

S1按键连接PA0

S1按键未按下,PA0为高电平

S1按键 按下,PA0为低电平

 

按键按下瞬间为下降沿,松开瞬间为上升沿。

STM32 CubeMX 中断NVIC_STM32 CubeMX 中断NVIC_04

 

2、使能SYSCFG时钟:

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

3、 初始化IO口为输入。

       GPIO_Init();

4、设置IO口与中断线的映射关系。

        void SYSCFG_EXTILineConfig();

5、初始化线上中断,设置触发条件等。

       EXTI_Init();

  1. 配置中断分组(NVIC),并使能中断要设置之前要设置分组(一个系统当中只能有一次分组)

NVIC分组函数: NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

       NVIC_Init();

7、 编写中断服务函数。中断服务函数可startup_stm32f40_41xxx.s中

      EXTIx_IRQHandler();

8、清除中断标志位

      EXTI_ClearITPendingBit();

 

函数说明:

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

函数功能:初始化线上中断,设置触发条件

EXTI_InitTypeDef* EXTI_InitStruct:初始化线上中断结构体

 

typedef struct

{

  uint32_t EXTI_Line;               //中断线

  EXTIMode_TypeDef EXTI_Mode;       //中断模式

  EXTITrigger_TypeDef EXTI_Trigger; //触发边沿

  FunctionalState EXTI_LineCmd;     //中断线使能

}EXTI_InitTypeDef;

 

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

函数功能:初始化线中断通道及优先级

NVIC_InitTypeDef* NVIC_InitStruct:初始化线中断通道及优先级结构体

 

typedef struct

{

  uint8_t NVIC_IRQChannel;                    //中断通道,可在stm32f4xx.h 查找

  uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占优先级

  uint8_t NVIC_IRQChannelSubPriority;         //响应优先级

  FunctionalState NVIC_IRQChannelCmd;         //通道使能

} NVIC_InitTypeDef;