当前位置: 首页 > news >正文

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

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;               //设置AFIOgpio_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);//设置NVICHAL_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 等)触发中断,则跳过处理。
中断运行的步骤
首先外部触发中断,然后就会调用中断函数,在中断函数中会将设置为中断的引脚号传给回调函数,然后回调函数就会根据引脚的变化进行相应的动作。
完结

http://www.dtcms.com/a/314236.html

相关文章:

  • QT的UDP
  • 【数据结构入门】链表
  • Solidity智能合约开发全攻略
  • Java基础-斗地主游戏
  • ArrayDeque双端队列--底层原理可视化
  • ubuntu修改时区
  • 【HZ-T536开发板免费体验】Cangjie Magic调用视觉语言大模型(VLM)真香,是不是可以没有YOLO和OCR了?
  • 通用 PDF 文件流 OCR 到文本 API 接口
  • 使用 Aspose.OCR 将图像文本转换为可编辑文本
  • 基础14-Java集合框架:掌握List、Set和Map的使用
  • 十字滑台:精密制造的“心脏“如何跳动?
  • 耘瞳科技国产化点云处理软件,开启智能化三维测量新时代
  • [机器学习]01-构建简单的贝叶斯分类器
  • 抓包相关知识学习
  • 项目复盘:Arena Of Furnace
  • vtkSSAAPass代码解析
  • [自动化Adapt] 回放策略 | AI模型驱动程序
  • Python异常捕获全指南
  • 智慧泵房赋能二次供水互联网化:物联网驱动下的全场景解决方案
  • Solidity全局变量与安全实践指南
  • Linux 文件与目录属性管理总结
  • 设备能力指标(CP/CPK)
  • C盘空间清理
  • JVM学习日记(十六)Day16——性能监控与调优(三)
  • AgxOrin平台JetPack5.x版本fix multi-cam race condition 补丁
  • 【Conda】常用指令操作
  • 机器学习——决策树(DecisionTree)+ 过采样 + 交叉验证 案例:电信客户流失数据
  • VAE学习笔记
  • Linux 网络深度剖析:传输层协议 UDP/TCP 原理详解
  • 【STM32】GPIO的输入输出