[STM32F4] 使用 STM32F407 和 HAL 库实现简单的 LED 闪烁

[复制链接]
3354|11
 楼主| 周半梅 发表于 2024-9-25 07:39 | 显示全部楼层 |阅读模式
分享一个基于 STM32F407 微控制器的简单 LED 闪烁应用。使用 STM32CubeMX 生成初始化代码,并基于 HAL 库实现主循环中的逻辑控制。这个示例非常适合初学者,它能够帮助大家理解 STM32 微控制器的基本操作及其外设配置。
1. 准备工作使用的开发板是 STM32F407 DISCOVERY,工具链为 STM32CubeMX 和 Keil uVision。
2. 配置步骤
  • 打开 STM32CubeMX,选择 STM32F407 微控制器。
  • 在 Pinout 界面,将开发板上的一个 LED 引脚(例如 PD12)配置为 GPIO_Output。
  • 在 RCC 中使能 High Speed External Clock(HSE)。
  • 设置时钟树,将系统时钟配置为 168 MHz。
  • 生成代码并导出到 Keil IDE。
3. 在 Keil 中实现代码STM32CubeMX 已经生成了初始化代码。接下来,我们只需要在 main.c 中实现主循环,让 LED 以一定的频率闪烁。
  1. /* 包含必要的头文件 */
  2. #include "main.h"

  3. /* 主程序入口 */
  4. int main(void)
  5. {
  6.   /* 初始化 HAL 库 */
  7.   HAL_Init();
  8.   
  9.   /* 配置系统时钟 */
  10.   SystemClock_Config();
  11.   
  12.   /* 初始化 GPIO */
  13.   MX_GPIO_Init();

  14.   /* 主循环 */
  15.   while (1)
  16.   {
  17.     /* 点亮 LED */
  18.     HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
  19.     /* 延时 500 毫秒 */
  20.     HAL_Delay(500);
  21.    
  22.     /* 熄灭 LED */
  23.     HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
  24.     /* 延时 500 毫秒 */
  25.     HAL_Delay(500);
  26.   }
  27. }

  28. /* 系统时钟配置 */
  29. void SystemClock_Config(void)
  30. {
  31.   /* 系统时钟配置代码由 STM32CubeMX 自动生成 */
  32.   /* ... */
  33. }

  34. /* GPIO 初始化函数 */
  35. static void MX_GPIO_Init(void)
  36. {
  37.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  38.   /* 使能 GPIOD 时钟 */
  39.   __HAL_RCC_GPIOD_CLK_ENABLE();

  40.   /* 配置 PD12 引脚为输出模式 */
  41.   GPIO_InitStruct.Pin = GPIO_PIN_12;
  42.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  43.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  44.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  45.   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  46. }
4. 代码分析
  • HAL_GPIO_WritePin 函数用于控制 GPIO 引脚的电平。我们通过将 PD12 设为 GPIO_PIN_SET 来点亮 LED,设为 GPIO_PIN_RESET 来熄灭 LED。
  • HAL_Delay 函数提供一个简单的阻塞延时。在这个例子中,我们设置了 500 毫秒的延时,因此 LED 会每秒闪烁一次。
  • MX_GPIO_Init() 函数初始化了 GPIO 引脚,STM32CubeMX 已经生成了部分配置代码,我们需要自行定义 PD12 为输出模式。
5. 运行效果将代码编译并烧录到 STM32F407 开发板上。你会看到开发板上的 LED (PD12) 以 1 秒的周期进行闪烁。
6. 总结通过这个简单的 LED 闪烁项目,我们可以快速入门 STM32 微控制器的基础操作,掌握 GPIO 的初始化与控制。STM32CubeMX 提供了便捷的代码生成工具,可以加速开发流程。如果你对 STM32 开发有兴趣,可以继续深入学习其他外设的使用,如串口通信、ADC、定时器等。
希望对你有所帮助!


公羊子丹 发表于 2024-9-25 07:40 | 显示全部楼层
好帖!这个项目可以做成持续闪烁然后加个按钮控制嘛?
童雨竹 发表于 2024-9-25 07:40 | 显示全部楼层
有没有办法让 LED 闪烁的频率更精确一些?
帛灿灿 发表于 2024-9-25 07:41 | 显示全部楼层
HAL 库确实好用,但是有时候感觉灵活性差点。
万图 发表于 2024-9-25 07:41 | 显示全部楼层
一直听说 STM32 强大,现在终于亲自试了试,真不错!
Wordsworth 发表于 2024-9-25 07:41 | 显示全部楼层
我之前用的是 Arduino,现在转到 STM32 感觉好高端!
Pulitzer 发表于 2024-9-25 07:42 | 显示全部楼层
感谢分享!下次能不能讲讲如何使用定时器来控制 LED 闪烁?
Bblythe 发表于 2024-9-25 07:42 | 显示全部楼层
哇,STM32 的 GPIO 控制还挺简单的,以为会很复杂呢。
Uriah 发表于 2024-9-25 07:43 | 显示全部楼层
这个时钟配置部分,能详细讲讲怎么弄的吗?我有点搞不清楚。
Clyde011 发表于 2024-9-25 07:43 | 显示全部楼层
我也试了一下,运行起来没有问题,感谢楼主分享!
呐咯密密 发表于 2024-9-25 10:38 | 显示全部楼层
用HALL做LED闪烁很简单,库很好用
慢动作 发表于 2024-9-26 21:44 来自手机 | 显示全部楼层
这个示例非常适合初学者
您需要登录后才可以回帖 登录 | 注册

本版积分规则

169

主题

6150

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部