概述
什么是中断,那么简单打个比方:你当前在做饭,切菜的时候不小心将手指伤了,你会停止切菜,去处理好伤口后再回来继续做饭。你伤到手后去处理伤口就是中断,处理好后又继续回来做饭。
先让我们大概来了解以下stm32的中断工作原理
在程序中工作流程简单来说就是:EXTI中断-->中断向量表-->偏移入口地址-->中端服务函数
中断向量表,基本上所有的外设,都有中断。所以中断很重要属于外部中断的线共有16条,引脚数量多于16,所以引脚要共用外部中断线。
CubeMX配置外部中断
我们仍配置按键为外部中断输入源,所以把引脚PA1配置为外部中断。然后设置为高电平触发。
配置中断优先级
在NVIC中使能外部中断,并分配优先级
生成的代码及详解
1.设置优先级分组,在HAL_Init()函数里面设置一次即可
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
优先级分组 | AIRCR[10: 8] | bit[7: 4]分配情况 | 分配结果 |
0 | 111 | 0: 4 | 0 位抢占优先级, 4 位响应优先级 |
1 | 110 | 1: 3 | 1 位抢占优先级, 3 位响应优先级 |
2 | 101 | 2: 2 | 2 位抢占优先级, 2 位响应优先级 |
3 | 100 | 3: 1 | 3 位抢占优先级, 1 位响应优先级 |
4 | 011 | 4: 0 | 4 位抢占优先级, 0 位响应优先级 |
抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
2.使能对应 GPIO 口时钟。
3. 设置 GPIO 工作模式,触发条件,开启 AFIO 时钟,设置 IO 口与中断线的映射关系。
这些步骤 HAL 库全部封装在 HAL_GPIO_Init 函数里面,我们只需要设置好对应的参数,
再调用 HAL_GPIO_Init 函数即可完成配置
4.设置中断优先级
HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
5.使能中断
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
6.编写中断函数
GPIO_InitTypeDef GPIO_InitStruct;
/*开启按键GPIO口的时钟*/
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 选择按键1的引脚 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
/* 设置引脚为输入模式 */
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
/* 设置引脚不上拉也不下拉 */
GPIO_InitStruct.Pull = GPIO_NOPULL;
/* 使用上面的结构体初始化按键 */
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 配置 EXTI 中断源 到key1 引脚、配置中断优先级*/
HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
/* 使能中断 */
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
生成的中断处理函数在stm32f1xx_it.c文件中
void EXTI1_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != RESET)
{
// 红色LED亮
LED_R_ON;;
//清除中断标志位,不清除中断的话就会一直产生中断
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
}
}
Comments NOTHING