1、前言
该系列文章用于记录个人学习stm32单片机的过程,欢迎指导讨论~。
2、中断知识点梳理
中断 { N V I C ( 内嵌向量中断控制器 ) { 中断向量表 优先级 { 抢占优先级 响应优先级 自然优先级 优先级分组 E X T I ( 外部中断 ) { 触发方式 { 上边沿 下边沿 双边沿 I O 映射关系 回调处理 { 中断服务函数 ( 硬件 ) 中断回调函数 ( 软件 ) 中断 \left\{ \begin{array}{lr} NVIC (内嵌向量中断控制器) \left\{ \begin{array}{lr} 中断向量表 \\\\ 优先级 \left\{ \begin{array}{lr} 抢占优先级 \\\\ 响应优先级 \\\\ 自然优先级 \end{array} \right. \\\\ 优先级分组 \end{array} \right. \\\\ EXTI(外部中断) \left\{ \begin{array}{lr} 触发方式 \left\{ \begin{array}{lr} 上边沿\\ 下边沿 \\ 双边沿 \end{array} \right. \\\\ IO映射关系 \end{array} \right. \\\\ 回调处理 \left\{ \begin{array}{lr} 中断服务函数(硬件) \\\\ 中断回调函数(软件) \end{array} \right. \end{array} \right. 中断⎩ ⎨ ⎧NVIC(内嵌向量中断控制器)⎩ ⎨ ⎧中断向量表优先级⎩ ⎨ ⎧抢占优先级响应优先级自然优先级优先级分组EXTI(外部中断)⎩ ⎨ ⎧触发方式⎩ ⎨ ⎧上边沿下边沿双边沿IO映射关系回调处理⎩ ⎨ ⎧中断服务函数(硬件)中断回调函数(软件)
3、中断优先级
中断优先级决定了中断的执行顺序。当多个中断源同时发生时,根据中断的抢占优先级和响应优先级来确定优先级顺序。
抢占优先级用于决定是否打断正在执行的中断源,如果一个中断源的抢占优先级高于正在处理的中断源,会立即中断当前中断源的处理,转而处理高优先级的中断源。
响应优先级用于决定多个中断源具有相同抢占优先级时的执行顺序。已经排序好响应优先级的中断源不能被其他响应优先级打断。
自然优先级是中断的基本优先级,不受抢占优先级和响应优先级的影响。较低优先级的中断源在存在较高优先级中断源的情况下会被延迟处理。
4、中断代码解释
4.1 GPIO初始设置
void MX_GPIO_Init(void)
{
/* PC5的按键初始化*/
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
-
HAL_NVIC_SetPriority:设置中断的抢占优先级、响应优先级,此处将EXTI9_5_IRQn的抢占优先级、响应优先级设置为0。
-
HAL_NVIC_EnableIRQ:设置使能中断,此处使能EXTI9_5_IRQn的中断线。
4.2 中断触发处理
void EXTI9_5_IRQHandler(void)
{
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != RESET)
{
buttonPressed = 1;
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_Delay(10);
if (buttonPressed)
{
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5)==0)
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
buttonPressed = 0;
}
}
}
-
EXTI9_5_IRQHandler:中断服务函数,用于处理外部中断线 的中断事件,当外部中断线
的中断事件发生时,会执行这个函数。 -
__HAL_GPIO_EXTI_GET_IT:用于检查指定的 GPIO
引脚是否触发了外部中断事件,此处观察GPIO_PIN_5是否触发。 -
HAL_GPIO_EXTI_IRQHandler:调用中断处理公用函数。
-
__HAL_GPIO_EXTI_CLEAR_IT:用于清除指定 GPIO
引脚的外部中断标志位,此处用来清除GPIO_PIN_5。