外部中断

醉酒当歌 提交于 2019-12-04 08:28:27

中断意味着中途打断现在干的事情,紧急处理其他事情

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)无论是抢占优先级还是响应优先级,优先级数值越小,就代表优先级越高。

优先级分组只能在开始的时候初始化一次,中途在进行优先级分组会造成分组管理混乱

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!