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

问题

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

背景知识

参考

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

需要改什么

只需要在 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。

调试

在这里插入图片描述

### STM32CubeMX配置按键中断初始化设置教程 #### 一、创建新项目并选择MCU 在STM32CubeMX软件中启动一个新的工程,按照向导提示输入项目名称以及保存路径之后,在弹出的选择器件窗口里挑选适合的STM32系列单片机型号。 #### 二、GPIO引脚分配 进入"Pinout & Configuration"标签页,找到用于连接按钮的I/O端口。点击该管脚将其属性更改为“GPIuxe”,这里的x代表具体的外设编号,比如EXTIx表示第x个外部线中断源[^1]。 #### 三、配置NVIC参数 切换到“System Core”下的“NVIC (Nested Vectored Interrupt Controller)”节点,勾选对应于之前选定GPIO通道的相关IRQ Handler项前的小方框来激活此中断请求处理程序[^4]。 #### 四、设定触发条件 返回至先前调整过的GPIO Pin Control页面,针对已指定为输入功能的那个IO接口,在其右侧展开更多选项后可以看到有Rising edge, Falling edge 或者 Both edges可供选取作为触发方式;对于大多数应用场景而言,“Both edges”即上下沿都能引起响应最为常用,这样既可以捕捉到开关闭合也可以感知释放动作。 #### 五、生成初始化代码 当所有的硬件层面准备工作完成后,便可以直接利用工具自动生成C语言形式的基础驱动框架文件了——只需依次点按顶部菜单栏里的“Project->Generate Code”。此时会依据用户前期所做的各项设定自动填充好必要的寄存器操作语句,从而大大简化编程难度。 ```c // 用户需在此基础上编写实际业务逻辑部分 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == USER_BUTTON_PIN){ // 判断是否是由特定按键引发的中断事件 // 执行相应任务... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值