STM32使用HAL库配置中断的详细指南
一. 中断配置的流程:
1. 使能GPIO函数:__HAL_RCC_GPIOX_CLK_ENABLE()。
2. 配置 GPIO AFIO EXTI 等设置函数:HAL_GPIO_Init()。
配置中断口,配置中断触发的方式等。
3. 配置中断优先级分组,在HAL_Init 里面配置。
4. 配置中断的抢占优先级和响应优先级函数:HAL_NVIC_SetPriority()
参数一:中断号,IRQn_Type的类型。
参数二:抢占优先级。
参数三:响应优先级。
5. 使能中断函数:HAL_NVIC_EnableIRQ()。
参数:中断号,IRQn_Type的类型。
6. 配置中断服务函数:EXTI0_IRQHandler()。
函数:HAL_GPIO_EXTI_IRQHandler()是外部中断共用的入口函数,函数内部会清除中断标志位,并调用callback回调函数。
7. 中断回调处理函数:HAL_GPIO_EXTI_Callback()
通过中断入口函数的GPIO_PIN判断来自哪个IO口的中断,然后执行中断回调函数,就在该函数里来实现中断后你想要实现的功能。
二. 中断实验。
1. 实验内容
主程序执行LED的闪烁,利用中断来使按键来控制LED的亮灭。
2.流程图
大概画了一下,能力有限。
3.代码。
main.c
#include "sys.h"
#include "delay.h"
#include "exti.h"
#include "led.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); //LED初始化
exti_init(); //中断初始化
while(1)
{
led2_on();
delay_ms(500);
led2_off();
delay_ms(500);
}
}
exit.c
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
void exti_init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //GPIO使能
GPIO_InitTypeDef gpio_initstruct;
gpio_initstruct.Pin = GPIO_PIN_0; //配置pa0口为中断口
gpio_initstruct.Mode = GPIO_MODE_IT_FALLING; //下降沿触发中断
gpio_initstruct.Pull = GPIO_PULLUP; //默认拉高
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
}
void EXTI0_IRQHandler(void) /*中断服务函数*/
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); /*中断入口函数,
该函数内部会调用Callback回调函数*/
}
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(); //翻转LED
}
}
}
4. 实验效果
32
本人小菜鸡一枚,如哪里不对请帮忙纠正出来。
一直坚持我的一句话:舞台再大,你不上台,永远是观众。平台再好,你不参与,永远是局外人。
作者:走下去-别回头