中断意味着中途打断现在干的事情,紧急处理其他事情
NVIC(内嵌向量中断控制器)特性
无论是 ARM Cortex M0/M3/M4 还是 ARM Cortex-A8/A53/A72/A73 等等内核,都有 NVIC。 STM32F405xx/07xx和STM32F415xx/17xx 具有82个可屏蔽(能够通过代码进行开和关中断)中断通道,10个不可屏蔽(无法通过代码关闭该中断)的中断,16 个可编程优先级。 向量意味就是中断源。 向量表,也就是中断源表。
外部中断/事件控制器 (EXTI)
多达 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 唤醒事件
声明变量:
static GPIO_InitTypeDef GPIO_InitStruct; static EXTI_InitTypeDef EXTI_InitStruct; static NVIC_InitTypeDef NVIC_InitStruct;
使能系统配置的硬件时钟,就是供电
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
选择对应的 GPIO 引脚连接到相应的中断控制线
将PA0引脚连接到外部中断0,作为它的输入引脚 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
根据 EXTI_InitTypeDef 结构体进行外部中断控制线 0 初始化
EXTI_InitStruct.EXTI_Line = EXTI_Line0;//外部中断0 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//产生中断 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发(只要按键按下,就通知CPU紧急处理该事件,跳转到中断服务函数,并由中断服务函数进行处理)触发方式(下降沿、上升沿、双边沿) EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能外部中断0工作,允许触发中断 EXTI_Init(&EXTI_InitStruct);//初始化
根据 NVIC_InitTypeDef 结构体对中断向量进行配置
//配置外部中断0的优先级 NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//响应优先级 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使优先级生效 NVIC_Init(&NVIC_InitStruct);
中断优先级的一个意义:出现多个中断同时触发,但是不能同时处理,所以 先后顺序之分,要根据实际上的运行环境优先处理重要的中断。
a.概述
STM32 对中断进行分组,共 5 组,组 0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级级。
/ ** * @brief Configures the priority grouping: pre-emption priority and subpriority. * @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 //4 位设置响应优先级,能设置 16 个抢占优先级 * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority //1 位抢占优先级,能设置 2 个抢占优先级 * 3 bits for subpriority //3 位响应优先级,能设置 8 个响应优先级 * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority //2 位抢占优先级,能设置 4 个抢占优先级 * 2 bits for subpriority //2 位响应优先级,能设置 4 个响应优先级 * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority //3 位抢占优先级,能设置 8 个抢占优先级 * 1 bits for subpriority //1 位响应优先级,能设置 2 个抢占优先级 * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority //4 位抢占优先级,能设置 16 个抢占优先级 * 0 bits for subpriority //没有响应优先级 * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. * The pending IRQ priority will be managed only by the subpriority. * @retval None **/ void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
抢占优先级与响应优先级区别
1)高抢占优先级是可以打断正在进行的低抢占优先级的中断。 2)抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。 3)抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。 4)抢占优先级相同且响应优先级相同的中断,假如同时发生,会按照硬件内部固定的优先级执行,如下图。 5)无论是抢占优先级还是响应优先级,优先级数值越小,就代表优先级越高。