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

【STM32+HAL库】---- 按键中断控制LED

硬件开发板:STM32G0B1RET6
软件平台:cubemax+keil+VScode

1 新建cubemax工程

1.1 配置系统时钟树

image

1.2 配置相关GPIO引脚

①LED由PC13引脚控制
image
选择PA5引脚,GPIO_Output模式
image
GPIO模式配置:
image

②按键开关由PC13引脚控制
image
选择PC13引脚,GPIO_EXTIx模式,其中13表示13号中断线
image
GPIO模式配置:按键设置为下降沿触发中断(LED)
image

1.3 配置NVIC中断

勾上Enabled (G0系列相比于F1系列没有优先级Group配置)
image

1.4 导出工程

…略

2 中断处理流程

① main.c 中的 MX_GPIO_Init() 函数调用HAL库里的使能中断函数和设置中断优先级函数
image

② 在 HAL_NVIC_EnableIRQ() 中调用 NVIC_EnableIRQ()
image

③ 当触发中断时,处理器查表跳转到位于 stm32g0xx.it.c 里的中断服务程序 EXTIx_IRQHandler(void) 【这里的x指中断线】;中断服务程序 EXTIx_IRQHandler (void) 中调用外部中断通用处理函数HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin) ,该函数作为HAL库提供的外部中断接口函数,参量为触发中断的引脚
image

④相比较于F系列,G0系列的HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin)里所调用的中断回调函数分成了上升沿和下降沿两部分
G0系列:
image

F1/F4系列:
image

⑤在stm32g0xx.it.c 中重写对应类型的中断回调函数,并补全中断所需要执行的任务函数

3 代码

重写下降沿中断回调函数

//微秒级的延时
void delay_us(uint32_t delay_us)
{
  volatile unsigned int num;
  volatile unsigned int t;
  for (num = 0; num < delay_us; num++)
  {
    t = 11;
    while (t != 0)
    {
      t--;
    }
  }
}

//毫秒级的延时
void delay_ms(uint16_t delay_ms)
{
  volatile unsigned int num;
  for (num = 0; num < delay_ms; num++)
  {
    delay_us(1000);
  }
}

//下降沿回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin==BUTTON_Pin)
  {
    delay_ms(20);     /*消抖*/
    if (GPIO_Pin==BUTTON_Pin)
    {
      HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
      while (BUTTON_Pin==0);
    }
  }
}

http://www.kler.cn/news/290576.html

相关文章:

  • xhr、ajax、axois、fetch的区别
  • echo ‘‘ >>/etc/profile是什么意思什么效果
  • 基于深度学习的水稻病害虫检测设计与实现
  • 设计模式与反模式:UML图示常见误用案例分析
  • 【机器学习】.fit_transform()跟.transform()的区别
  • 基于人工智能的智能客服系统
  • 鸿蒙(API 12 Beta6版)图形【 请求动画绘制帧率】方舟2D图形服务
  • C++基础知识之数组
  • DexclassLoader读取dex在Android14上遇到问题
  • Java SPI机制源码
  • Hive锁表、hive查询表是否被锁、hive解锁表
  • Django+vue自动化测试平台(29)--测试平台集成playwright录制pytest文件执行
  • MVC架构模式
  • Java-线程的生命周期7大状态
  • 读写分离深度解析与MaxScale配置指南
  • 2024嵌入式面试:VIVO嵌入式面试题及参考答案(6万字长文)
  • selenium启动总报错 WebDriverManager总是异常
  • Datawhale X 李宏毅苹果书 AI夏令营 - 跟李宏毅学深度学习(入门之线性模型)
  • XR-Frame 实现 始终朝向屏幕(相机)的面片与模型
  • vue路由Router设置父路由默认选中第一个子路由,切换子路由让父路由激活高亮效果不会消失
  • 因 Mysql root 密码过于简单导致 Mysql 连接失败的解决方法
  • C++学习笔记(4)
  • 集成电路学习:什么是MMU存储管理单元
  • Get full article in Google Sheet using Openai
  • Python知识点:如何使用Mock库进行单元测试中的依赖模拟
  • Linux查看系统用户
  • 海康二次开发笔记10-独立Group导入、导出及执行
  • HTTP代理支持UDP协议吗?
  • ROS imu传感器节点
  • 第十二章节 xxjob, seata, zk, minio,activeMQ进行 helm化