Bblythe 发表于 2025-1-17 07:29

STM32F407VGT6的入门教程:如何用HAL库控制LED闪烁

STM32F407VGT6是STMicroelectronics推出的一款高性能32位微控制器,基于ARM Cortex-M4内核,主频可达168MHz,配备512KB的闪存和192KB的SRAM。由于其丰富的外设和强大的处理能力,STM32F407VGT6被广泛应用于各种嵌入式开发中。
在本文中,我们将为STM32F407VGT6创建一个简单的项目,演示如何使用STM32的HAL库控制LED的闪烁。这将帮助你熟悉STM32的开发环境、外设控制以及基本的代码编写方式。
开发环境设置
[*]安装STM32CubeIDE
STM32CubeIDE是STMicroelectronics官方提供的一款集成开发环境,支持STM32系列微控制器的开发。你可以从ST官网免费下载并安装。

[*]创建新项目
打开STM32CubeIDE,选择“File” -> “New” -> “STM32 Project”,选择STM32F407VGT6作为目标MCU,然后创建一个新项目。

[*]配置时钟
在STM32CubeMX中配置时钟源,使MCU运行在168MHz的频率上。打开"Clock Configuration"页面,确保HSE(外部晶体振荡器)启用,并选择PLL作为时钟源。

[*]启用GPIO外设
在“Pinout & Configuration”中,配置PA5(通常连接到开发板上的LED)为GPIO输出模式。

[*]初始化HAL库
在“Configuration”中,启用HAL库支持,并为GPIO配置合适的引脚模式。最后,生成代码。

代码实现在生成的代码中,我们会在main.c文件中进行必要的修改,加入LED闪烁的代码。
主要代码#include "main.h"

/* Private function prototypes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* Main function */
int main(void)
{
    /* MCU初始化 */
    HAL_Init();

    /* 配置系统时钟 */
    SystemClock_Config();

    /* 初始化GPIO */
    MX_GPIO_Init();

    /* 无限循环 */
    while (1)
    {
      /* 点亮LED */
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
      HAL_Delay(500);// 延时500毫秒

      /* 熄灭LED */
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
      HAL_Delay(500);// 延时500毫秒
    }
}

/* 系统时钟配置函数 */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /* 配置HSE外部振荡器 */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 8;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    /* 配置系统时钟 */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}

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

    /* 启用GPIOA时钟 */
    __HAL_RCC_GPIOA_CLK_ENABLE();

    /* 配置GPIOA引脚5为输出模式 */
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
代码解释
[*]HAL_Init()
该函数用于初始化HAL库,为系统配置必要的硬件资源。

[*]SystemClock_Config()
配置系统时钟,使得STM32F407VGT6的主频为168MHz。此部分代码用于设置PLL(锁相环),以提供更高的时钟频率。

[*]MX_GPIO_Init()
配置GPIOA的引脚5为输出模式,通常用于控制LED。

[*]主循环
主循环中,LED会间隔500毫秒闪烁一次。使用HAL_GPIO_WritePin()函数来控制LED的点亮与熄灭,HAL_Delay()用于创建延时。

编译和烧录
[*]编译代码
在STM32CubeIDE中点击“Build”按钮,编译项目。

[*]烧录代码
使用ST-Link或其他调试器将编译后的固件烧录到STM32F407VGT6开发板中。

[*]运行代码
烧录成功后,STM32F407VGT6将开始运行,你应该能看到LED闪烁。

总结通过以上步骤,你已经成功地使用STM32F407VGT6和HAL库编写了一个简单的LED闪烁程序。该示例演示了如何使用STM32CubeIDE和HAL库进行开发,并通过GPIO控制外设。对于初学者来说,这是了解STM32微控制器及其开发环境的一个很好的起点。

公羊子丹 发表于 2025-1-17 07:29

STM32的学习曲线有点陡,但一旦掌握了HAL库,感觉编程变得非常简单了!

周半梅 发表于 2025-1-17 07:29

我用的是STM32F103C8T6,这个系列也挺适合入门的。

帛灿灿 发表于 2025-1-17 07:30

代码写得很清晰,HAL库确实比直接操作寄存器方便多了。

童雨竹 发表于 2025-1-17 07:30

如果你在开发中遇到问题,可以查STM32的官方文档,非常详细。

万图 发表于 2025-1-17 07:30

我试了一下这个程序,LED闪烁效果挺好的,成功烧录后很有成就感。

Wordsworth 发表于 2025-1-17 07:31

如果加上串口输出,调试起来会更方便,不用每次都烧录代码。

Pulitzer 发表于 2025-1-17 07:31

用STM32CubeMX配置外设真的很省事,直接生成代码,省了很多时间。

Clyde011 发表于 2025-1-17 07:31

一开始用STM32有点不习惯,但慢慢适应后感觉功能非常强大。

Uriah 发表于 2025-1-17 07:31

你能推荐一些入门STM32的书籍吗?我现在正打算深入学习。

Amazingxixixi 发表于 2025-1-21 17:19

学习一下啊,还有好多需要学习的。

SophiaOP 发表于 2025-1-22 21:33

用上cubeMX后根本不想再手写了

花间一壶酒sd 发表于 2025-1-31 23:38

可以使用 STM32 的 HAL 库和 STM32CubeIDE 来实现这个功能
页: [1]
查看完整版本: STM32F407VGT6的入门教程:如何用HAL库控制LED闪烁