EXTI配置流程 含中断延时消抖点亮小灯

如图可知,配置流程分成以下一个部分

①使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE();// 打开时钟

②初始化利用 HAL_GPIO_Init 一步到位,可以初始化外设GPIO的一切 4个参数 (引脚 Pull 这里选择的模式 是从下面这几个里面选 速度

③在main()函数的HAL_Init() 中 选择HAL_NVINVICC_SetPriorityGrouping即设置NVIC优先级分组加下表

一般选择用2:2

⑤在初始化函数中设置优先级和使能中断

优先级:void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) 参数1是STM32 的特殊中断数字见图 参数2是抢占优先级的等级 参数3是 响应优先级的等级 注等级越低越优先

选择特殊中断数字根据引脚选定 例如PA0 则选择EXTI0_IRQn PB4则选择EXTI4_IRQn 这个选择也影响了后面的选择

使能:void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) 参数为特殊中断数字

⑥编写 中断服务函数void EXTI0_IRQHandler(void) ,专门用于处理 EXTI0(外部中断 0) 触发的中断事件。

在内部包含公共中段服务函数 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

⑦在HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);函数中有自定义的void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数 需要编写想要的中断效果

以下是中断exti.c文件代码

cs 复制代码
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"

    GPIO_InitTypeDef exti_initstruct;
void exti_init(void)
{
    //打开时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();   //注意看硬件原理图中key的引脚在哪一个组
    //调用GPIO初始化函数
    exti_initstruct.Pin = GPIO_PIN_0;
    exti_initstruct.Pull = GPIO_PULLUP;
    exti_initstruct.Mode =GPIO_MODE_IT_FALLING;
    exti_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA,&exti_initstruct);

    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)   //判断是不是在引脚0的位置
    {
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)  //如果在引脚0的位置则判断该处的引脚是否是低电平 
            led1_toggle();  //若低电平则翻转
    }
}

以下是主函数 main()的代码

cs 复制代码
#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();
    exti_init();
    while(1)
   { 
       
       led2_toggle();
       delay_ms(500);

    }
}

  

注意主函数 只需要调用exti_init()就可以了因为其他函数都连带在里面

相关推荐
7yewh44 分钟前
嵌入式产品级-超小尺寸热成像相机(从0到1 硬件-软件-外壳)
单片机·嵌入式硬件·mcu·数码相机·物联网
esmember1 小时前
电路研究9——GPRS用的AT命令手册
嵌入式硬件
冰糖小新新1 小时前
ELF2开发板(飞凌嵌入式)基本使用的搭建
嵌入式硬件
神一样的老师1 小时前
基于Web实时通信的无人机载物联网与严格时间敏感性:案例研究
物联网·无人机
天拓四方_bjttsf2 小时前
物联网数据采集网关在物联网系统中的作用
物联网
国产化创客2 小时前
物联网网关Web服务器--lighttpd服务器部署与应用测试
服务器·前端·物联网·嵌入式
列兵阿甘2 小时前
嵌入式Linux驱动开发之pinctrl和gpio子系统
linux·驱动开发·嵌入式硬件
小猪写代码2 小时前
STM32 FreeROTS 任务创建和删除实验(静态方法)
stm32·单片机·嵌入式硬件
爱学电子的刻刻帝3 小时前
基于STM32的智能门锁安防系统(开源)
stm32·单片机·嵌入式硬件
Try1harder3 小时前
联德胜w801开发板(四)实现腾讯云mqtt的订阅和发布
单片机·嵌入式硬件·物联网