小实验:按键点灯(中断法)

1.实验目的

使用中断的方法,按下KEY1翻转LED1状态,而LED2一直保持500ms的频率闪烁

2.硬件清单

  • STM32开发板
  • ST-Link

3.代码

3.1exti.c

这个.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 等)触发中断,则跳过处理。
中断运行的步骤

首先外部触发中断,然后就会调用中断函数,在中断函数中会将设置为中断的引脚号传给回调函数,然后回调函数就会根据引脚的变化进行相应的动作。
完结

相关推荐
独小乐2 小时前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
不吃鱼的羊2 小时前
ADC扫描组Scan Group
单片机
海砥装备HardAus3 小时前
飞控算法中双环串级PID深度解析:角度环与角速度环的协同机制
stm32·算法·无人机·飞控·串级pid
LCMICRO-133108477463 小时前
长芯微LPC556D1完全P2P替代DAC8830,是引脚兼容的16位数模转换器,该系列产品为单通道、低功耗、缓冲电压输出型DAC
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·电压输出型dac
forAllforMe3 小时前
如何用定时器PWM产生SPWM?--电机驱动控制
嵌入式硬件
charlie1145141913 小时前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c
钿驰科技3 小时前
水泵无刷电机驱动板如何实现恒压控制?
单片机·嵌入式硬件
xingzhemengyou13 小时前
STM32 DMA
stm32·单片机·嵌入式硬件
森利威尔电子-3 小时前
森利威尔 SL3160A 降压型 DC - DC 转换器:10V - 150V 宽输入,稳出 5V/2.5A
单片机·嵌入式硬件·集成电路·芯片·电源芯片
清风6666663 小时前
基于单片机与WiFi通信的教室人数与照明上位机监控系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业