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

STM32 使用 CubeMX 实现按键外部中断

目录

    • 问题
    • 背景知识
    • 参考
    • 需要改什么
    • 注意
      • 尽量不要在中断函数使用 循环函数做延时
      • 中断函数中延时方法
      • 调试

问题

我想实现按钮触发紧急停止类似功能,需要使用按键中断功能。

背景知识

  • GPIO 点亮 LED。
  • stm32cubemx hal学习记录:GPIO输入输出。
  • STM32—HAL库 笔记

参考

阅读下面的参考资料,一步一步跟着做。

  • SM32CubeMX应用笔记4 外部中断。
  • STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑),同样的 CSDN 博文在这里。
  • cubemx按键配置中断 cubemx配置中断优先级。
  • STM32 中断函数与回调函数。
  • STM32开发,使用HAL库函数实现按键(中断和普通扫描)控制LED灯。

需要改什么

只需要在 stm32f4xx_it.c 中重写回调函数。

  • stm32f4xx_it.c 重写回调函数
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{ 
	// delay 10 ms, double check button pressed
//	uint32_t aa=3127*10;
//	while(aa--);
	if(GPIO_Pin==Btn_Pin)
	{ 
		// 你自己的代码
		
		flag = 1;
	}
}
/* USER CODE END 1 */

下面的代码是为了中断中使用 HAL_Delay 函数,需要进行的修改,同时中断函数中只改变了一个 flag。

  • main 函数定义 flag
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t flag = 0;
/* USER CODE END 0 */
  • main 函数中 while 循环处理中断的工作内容,主要是为了使用 HAL_Delay
/* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,GPIO_PIN_SET);
		HAL_Delay(50);
		HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,GPIO_PIN_RESET);
		HAL_Delay(50);
		
		
		if (flag == 1)
		{
			// Beep
			HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET);
			HAL_Delay(1000);
			HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
			
			// LED
			if(HAL_GPIO_ReadPin(GPIOE,Btn_Pin)==1)
			{
				for(uint16_t i= 0; i<50;i++)
				{
					HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_SET);
					HAL_Delay(20);
					HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
					HAL_Delay(20);
				}
			}
			flag=0;
		}
    /* USER CODE END WHILE */
  • stm32f4xx_it.c 申明外部的 flag
/* USER CODE BEGIN EV */
extern uint8_t flag;
/* USER CODE END EV */

注意

尽量不要在中断函数使用 循环函数做延时

中断函数中循环延时代码可能被编译器优化。一定要使用,需要修改优化等级到 “O0”。

在这里插入图片描述

中断函数中延时方法

在中断函数中设置一个 flag,在 main 中判断这个标志,然后采取动作。main 中可以使用延时函数 HAL_Delay。

调试

在这里插入图片描述


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

相关文章:

  • flink 为啥使用MemorySegment 来管理内存
  • 性能测试1初步使用Jmeter
  • el-table中根据状态改单元格样式
  • 医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断
  • mybatis-plus公共字段自动填充fillStrategy()方法和strictFill()方法
  • Windows环境运行.sh脚本提示找不到wget指令的问题
  • CSS基本概念以及CSS的多种引入方式
  • Python模拟真人鼠标轨迹算法
  • 使用umy-ui 优化带有大量输入框、下拉框的ElementUI el-table
  • Leetcode 1472. 设计浏览器历史记录
  • 开源音频处理项目推荐【持续更新】
  • 《C++设计新思维-泛型编程与设计模式之应用》阅读记录
  • DY按图搜索商品API:解锁电商新趋势
  • LeetCode 257. 二叉树的所有路径,dfs
  • 29. RabbitMQ队列模型
  • 多用户自定义商城小程序源码系统 独立部署 到源代码包以及搭建部署教程
  • 根据源码解析Vue2中对于对象的变化侦测
  • 搭建HAproxy----7层负载均衡集群
  • FDA辅料数据库在线免费查询-药用辅料
  • 灵当CRM multipleUpload.php 文件上传致RCE漏洞复现
  • 双11好物推荐有哪些?五大双十一好货推荐!
  • PHP如何从字符串中删除转义字符
  • 抽奖拼团卷轴模式系统开发小程序源代码解析
  • Flask 第十二课 -- 错误处理
  • 下水道内缺陷识别检测数据集 yolo数据集 共2300张
  • LeetCode2207解题思路
  • 双十一买什么好?五款数码好物推荐!
  • 毕业设计选题:基于ssm+vue+uniapp的面向企事业单位的项目申报小程序
  • 1.3 MySql的用户管理
  • 电脑如何录屏?无水印、高清晰度电脑录屏教程