1、复制03-流水灯项目,重命名06-按键点灯(中断法)
在\Drivers\BSP目录下创建一个文件夹exti,在该文件夹下,创建两个文件exti.c和exti.h文件,并且把这两个文件加载到项目中,打开项目工程文件
加载完新建的文件之后,找到exti.c文件双击打开,写入代码:
#include "sys.h"
#include "exti.h"
编译项目,编译通过,找到exti.h文件,双击打开,写入代码:
#ifndef __EXTI_H__
#define __EXTI_H__#endif
2、代码
exti.c
#include "sys.h"
#include "exti.h"
#include "delay.h"
#include "led.h"
void exti_init(void)
{
//使能GPIO时钟
GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct
//打开时钟-使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
//设置GPIO输入模式
//设置AFIO(开启时钟,IO口映射)
//设置EXTI(屏蔽,上/下沿)
//调用GPIO初始化函数
gpio_initstruct.Mode = GPIO_MODE_IT_FALLING;//下降沿输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_0;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLUP;//上拉
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//设置NVIC(优先级分组,设置优先级,使能中断)
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);
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();
}
}
在设置优先级分组进入函数
把这里的4改成2,优先级分组只需要设置一次
exti.h
#ifndef __EXTI_H__
#define __EXTI_H__
void exti_init(void);
#endif
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "exti.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();//初始化led灯
exti_init();
while(1)
{
led2_OFF();
delay_ms(500);
led2_ON();
delay_ms(500);
}
}