打印
[STM32F4]

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

[复制链接]
1195|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 以一定的频率闪烁。
/* 包含必要的头文件 */
#include "main.h"

/* 主程序入口 */
int main(void)
{
  /* 初始化 HAL 库 */
  HAL_Init();
  
  /* 配置系统时钟 */
  SystemClock_Config();
  
  /* 初始化 GPIO */
  MX_GPIO_Init();

  /* 主循环 */
  while (1)
  {
    /* 点亮 LED */
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
    /* 延时 500 毫秒 */
    HAL_Delay(500);
   
    /* 熄灭 LED */
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
    /* 延时 500 毫秒 */
    HAL_Delay(500);
  }
}

/* 系统时钟配置 */
void SystemClock_Config(void)
{
  /* 系统时钟配置代码由 STM32CubeMX 自动生成 */
  /* ... */
}

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

  /* 使能 GPIOD 时钟 */
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /* 配置 PD12 引脚为输出模式 */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
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 库确实好用,但是有时候感觉灵活性差点。

使用特权

评论回复
5
万图| | 2024-9-25 07:41 | 只看该作者
一直听说 STM32 强大,现在终于亲自试了试,真不错!

使用特权

评论回复
6
Wordsworth| | 2024-9-25 07:41 | 只看该作者
我之前用的是 Arduino,现在转到 STM32 感觉好高端!

使用特权

评论回复
7
Pulitzer| | 2024-9-25 07:42 | 只看该作者
感谢分享!下次能不能讲讲如何使用定时器来控制 LED 闪烁?

使用特权

评论回复
8
Bblythe| | 2024-9-25 07:42 | 只看该作者
哇,STM32 的 GPIO 控制还挺简单的,以为会很复杂呢。

使用特权

评论回复
9
Uriah| | 2024-9-25 07:43 | 只看该作者
这个时钟配置部分,能详细讲讲怎么弄的吗?我有点搞不清楚。

使用特权

评论回复
10
Clyde011| | 2024-9-25 07:43 | 只看该作者
我也试了一下,运行起来没有问题,感谢楼主分享!

使用特权

评论回复
11
呐咯密密| | 2024-9-25 10:38 | 只看该作者
用HALL做LED闪烁很简单,库很好用

使用特权

评论回复
12
慢动作| | 2024-9-26 21:44 | 只看该作者
这个示例非常适合初学者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

3669

帖子

0

粉丝