一、开发环境
硬件:正点原子探索者 V3 STM32F407 开发板
单片机:STM32F407ZGT6
Keil版本:5.32
STM32CubeMX版本:6.9.2
STM32Cube MCU Packges版本:STM32F4 V1.27.1
使用STM32F407的HAL库实现按键中断方式读取按键值,点亮和熄灭PF9的LED灯的STM32CubeMX配置步骤和程序,通常需要遵循一系列步骤。下面我将详细解释这些步骤,帮助你一分钟内成为“点灯大师”。中断方式解决了按键轮询的方式CPU占用率高和实时性较差的问题,能实时响应,节省CPU资源,方便也扩展。
不过中断也有缺点:
- 复杂性增加:中断方式的实现通常比轮询方式更复杂,需要配置中断向量表、编写中断服务程序等。
- 中断冲突:如果系统中存在多个中断源,并且它们同时触发中断,可能会产生中断冲突,需要额外的机制来处理。
- 抖动问题:对于按键等输入设备,可能存在抖动问题,即按键在按下或释放时状态会快速变化多次,这可能导致多次触发中断。
PS:轮询方式点灯请看文章一分钟成为点灯大师(超简单4行代码-STM32F407的HAL库轮询方式实现LED每隔1秒闪烁)
定时器中断方式点灯请看文章
一分钟成为点灯大师(超简单8行代码-STM32F407的HAL库定时器方式实现LED每隔1秒闪烁)定
PWM实现LED渐变闪烁请看文章
一分钟成为点灯大师(超简单24行代码-STM32F407的HAL库PWM实现LED渐变闪烁
二、配置STM32CubeMX
- 启动STM32CubeMX,新建STM32CubeMX项目:
- 选择MCU:在软件中选择你的STM32型号-STM32F407ZGT6。
-
选择时钟源:
- 配置时钟:
- 使能Debug功能:Serial Wire
- HAL库时基选择:SysTick
- 配置LED引脚:当前硬件的LED灯的引脚是PF9:在Pinout & Configuration标签页中,找到LED连接的GPIO端口,并设置为输出模式,通常选择Push-Pull,GPIO output level选高电平。
- 按键配置:当前硬件的按键的引脚是PE2,设置成中断模式。
- NIC中断使能:
- 配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。 10.生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。
三、代码实现与部署
-
增加代码:实现中断回调函数__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)在main.c的最后用户代码去添加代码3行代码。
/* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin); // 按键被按下,切换LED状态 } /* USER CODE END 4 */
- 编译代码:Keil编译生成的代码。
-
烧录程序:将编译好的程序用ST-LINK烧录到STM32微控制器中。
四、运行结果
观察结果:一旦程序烧录完成并运行,你应该能看到按下按键LED点亮,再按一下按键LED熄灭。如果一切正常,恭喜你,你现在已经是一个“点灯大师”了!
五、总结
轮询方式简单直观,但可能占用较多CPU资源且实时性较差;中断方式能够实时响应外部事件并节省CPU资源,但实现相对复杂且可能存在中断冲突和抖动问题。在选择使用哪种方式时,需要根据具体的应用场景和需求进行权衡。对于需要快速响应的应用或CPU资源紧张的情况,中断方式可能更为合适;而对于简单的应用或对实时性要求不高的场景,轮询方式可能更为方便。
六、注意事项
1.确保你的开发环境和工具链已经正确安装和配置。
2.在STM32CubeMX中配置GPIO时,注意选择正确的引脚和模式。
3.在STM32CubeMX中配置按键时,注意选择正确地勾选。
4.在编写代码时,确保使用正确的GPIO端口和引脚宏定义。
5.LED没有按预期点亮,检查代码、连接和电源是否正确,按一下复位键。