1.实验目的
使用中断的方法,按下KEY1翻转LED1状态,而LED2一直保持500ms的频率闪烁
2.硬件清单
- STM32开发板
- ST-Link
3.代码
3.1exti.c
这个.c文件是编写中断的代码
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
void exti_init(void)
{
GPIO_InitTypeDef gpio_initstruct;
//打开时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIO时钟
//调用GPIO初始化时钟
gpio_initstruct.Pin = GPIO_PIN_0; //设置AFIO
gpio_initstruct.Mode = GPIO_MODE_IT_FALLING; //设置EXTI,下降沿触发
gpio_initstruct.Pull = GPIO_PULLUP; //设置GPIO输入模式
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio_initstruct);
//设置NVIC
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); //设置优先级,EXTI0_IRQn就是PA0的中断线
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
}
//中断服务函数,中断服务函数没有任何的返回值和传入的参数
void EXTI0_IRQHandler(void) //中断服务函数的名字是在启动文件中写好的,找到对应的中断线即可。
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //调用公共服务函数
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //在回调函数中写代码
{
delay_ms(20);
if(GPIO_Pin == GPIO_PIN_0)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
{
led1_toggle();
}
}
}
上图为中断的配置流程
使能GPIO时钟
就是代码中,exti_init()函数中的__HAL_RCC_GPIOA_CLK_ENABLE();这句。
设置GPIO输入模式,设置AFIO,设置EXTI,这三个就是调用GPIO初始化函数,设置这个函数中结构体中的参数。
GPIO模式:就是设置PULL为上拉还是下拉
AFIO:就是设置Pin引脚
EXTI:就是设置Mode为上升沿触发,还是下降沿触发,
选择上升沿触发就是,当从低电平变为高电平时就触发中断,
选择下降沿触发就是,当从高电平变为低电平时就触发中断。
设置NVIC
首先设置优先级分组,是在main.c函数中HAL_Init()中设置,下图这句代码中修改后面的数字。
然后设置优先级,就是调用HAL_NVIC_SetPriority()函数。
然后设置使能中断,就是调用HAL_NVIC_EnableIRQ()函数
设置中断服务函数
在启动文件中
找到对应的中断函数名,在这个函数中调用回调函数,然后在回调函数中写相应的代码。
写回调函数时,首先要判断一下检查触发中断的引脚是否是 PA0(GPIO_PIN_0),如果是其他引脚(如 PA1、PB2 等)触发中断,则跳过处理。
中断运行的步骤
首先外部触发中断,然后就会调用中断函数,在中断函数中会将设置为中断的引脚号传给回调函数,然后回调函数就会根据引脚的变化进行相应的动作。
完结