【星云 Orbit-F4 开发板】02. 探索GPIO:点亮你的 LED 灯

【星云 Orbit-F4 开发板】02. 探索GPIO:点亮你的 LED 灯

博客上文章配合以下星系列开发板,所有资料均会开源。致力点燃学生对技术的热情,培养“懂理论能实战”的嵌入式人才。愿你们所行风雨无阻,前程似锦。

核心板型号 处理器参数 学习定位 典型应用场景
极光 Orbit-C8 STC8H8K64U(51架构/24MHz) 单片机原理与应用 GPIO控制/UART通信
星火 Orbit-F1 STM32F103RET6(Cortex-M3/72MHz) ARM应用开发实践 智能小车/物联网节点
星云 Orbit-F4 实时操作系统进阶 四轴飞控/工业网关
星界 Orbit-H7 STM32H743IIT6(双核480MHz+AI加速器) 嵌入式AI与边缘计算 机器视觉/预测性维护

引言

STM32F407是一款功能强大的32位微控制器,广泛应用于各种嵌入式系统中。本文将详细介绍如何使用STM32F407的PC0-PC3引脚控制LED灯,并通过HAL库实现模块化设计。通过本教程,读者将能够掌握GPIO配置、LED控制以及模块化编程的基本方法。

硬件准备

在开始编程之前,确保您已经准备好以下硬件:

  1. 星云 Orbit-F4 开发板:板载STM32F407VGT6(Cortex-M4/168MHz)作为主控芯片。
  2. 板载 LED灯:4个LED灯,颜色不限。
  3. 开发板设有限流电阻:4个220Ω至330Ω的电阻,用于保护LED灯。
硬件连接

将LED灯连接到STM32F407的PC0-PC3引脚:

  1. 连接LED的正极

    • LED1的负极通过电阻连接到PC0。
    • LED2的负极通过电阻连接到PC1。
    • LED3的负极通过电阻连接到PC2。
    • LED4的负极通过电阻连接到PC3。
  2. 连接LED的正极

    • 所有LED的正极连接到 3.3V(VCC)电源。
GPIO配置

在STM32F407中,GPIO引脚可以配置为多种模式,以适应不同的应用需求。以下是一些常见的GPIO模式:

  1. 输入模式

    • 浮空输入(Floating Input):引脚处于高阻态,适用于不需要上拉或下拉的情况。
    • 上拉输入(Pull-Up Input):引脚内部连接上拉电阻,适用于外部信号为低电平有效的情况。
    • 下拉输入(Pull-Down Input):引脚内部连接下拉电阻,适用于外部信号为高电平有效的情况。
  2. 输出模式

    • 推挽输出(Push-Pull Output):引脚可以输出高电平或低电平,适用于直接驱动小电流负载,如LED灯。
    • 开漏输出(Open-Drain Output):引脚输出低电平或高阻态,适用于需要外部上拉电阻的场合。
  3. 复用模式

    • 用于将GPIO引脚配置为特定的外设功能,如UART、SPI等。

在本教程中,我们将使用推挽输出模式来控制LED灯,因为这种模式可以直接驱动LED灯而无需额外的上拉电阻。

配置GPIO时钟

在使用GPIO引脚之前,需要先使能相应的GPIO时钟。对于PC0-PC3引脚,需要使能GPIOC时钟。

// 使能GPIOC时钟
__HAL_RCC_GPIOC_CLK_ENABLE();

配置GPIO引脚

使用GPIO_InitTypeDef结构体配置GPIO引脚的模式、上下拉、速度等参数。

GPIO_InitTypeDef GPIO_InitStruct = {0};

// 配置PC0-PC3为推挽输出模式
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
LED控制模块

为了实现模块化设计,我们将LED的控制功能封装到bsp/LED目录下的bsp_led.cbsp_led.h文件中。

1. 创建LED目录
  1. 打开文件管理器

    • 导航到STM32F407项目目录下的Drivers/BSP文件夹。
  2. 创建新目录

    • 右键点击空白区域,选择新建文件夹
    • 输入目录名称LED,并按回车键确认。
2. 创建bsp_led.cbsp_led.h文件
  • 确保bsp_led.cbsp_led.h文件当前位于Drivers/BSP目录下。
3. 更新项目包含路径
  1. 打开Keil MDK

    • 加载当前的STM32F407项目。
  2. 进入项目设置

    • 右键点击工程名称,选择Options for Target
  3. 添加新的包含路径

    • 在弹出的窗口中,选择C/C++选项卡。
    • Include Paths字段中,添加以下路径:
      Drivers/BSP/LED
      
    • 确保路径正确无误,点击OK保存设置。
4. 更新main.c文件
  1. 打开main.c文件

    • 在Keil MDK的项目资源管理器中,找到并双击main.c文件。
  2. 包含新的头文件

    • 在文件顶部,添加以下包含语句:
      #include "bsp_led.h"
      
    • 确保路径正确,以便编译器能够找到该头文件。
5. 重新编译项目
  1. 编译工程

    • 点击工具栏中的Build按钮(或按F7键)。
    • 确保编译过程中没有错误和警告。
  2. 处理编译错误

    • 如果出现包含路径错误,请检查Include Paths设置是否正确。
    • 确保bsp_led.h文件位于Drivers/BSP/LED目录下。
6. 更新项目分组
  1. 添加新的文件夹分组

    • 在Keil MDK的项目资源管理器中,右键点击BSP分组,选择Add Group
    • 输入分组名称LED,点击OK
  2. 添加文件到分组

    • 右键点击新的LED分组,选择Add New Item to Group
    • 选择Add Existing File,导航到Drivers/BSP/LED目录,选择bsp_led.cbsp_led.h文件,点击OK
  3. 确保文件可见性

    • 确保bsp_led.cbsp_led.h文件在LED分组下可见,并且路径正确。
LED控制模块实现
bsp_led.h文件
#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f4xx_hal.h"

#define LED_COUNT 4  // 定义LED的数量
#define BLINK_DELAY 500  // 定义闪烁延迟时间(毫秒)

/**
 * @brief 初始化LED
 */
void LED_Init(void);

/**
 * @brief 打开指定的LED
 * @param led_number LED编号(0-3)
 */
void LED_On(uint8_t led_number);

/**
 * @brief 关闭指定的LED
 * @param led_number LED编号(0-3)
 */
void LED_Off(uint8_t led_number);

/**
 * @brief 切换指定的LED状态
 * @param led_number LED编号(0-3)
 */
void LED_Toggle(uint8_t led_number);

/**
 * @brief 让指定的LED闪烁一次
 * @param led_number LED编号(0-3)
 * @param delay 延迟时间(毫秒)
 */
void LED_Blink(uint8_t led_number, uint32_t delay);

#endif /* __BSP_LED_H */
bsp_led.c文件
#include "bsp_led.h"

/**
 * @brief 初始化LED
 */
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 使能GPIOC时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();

    // 配置PC0-PC3为推挽输出模式
    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

/**
 * @brief 关闭打开指定的LED
 * @param led_number LED编号(0-3)
 */
void LED_Off(uint8_t led_number)
{
    switch(led_number)
    {
        case 0: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); break;
        case 1: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET); break;
        case 2: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); break;
        case 3: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); break;
        default: break;
    }
}

/**
 * @brief 打开指定的LED
 * @param led_number LED编号(0-3)
 */
void LED_On(uint8_t led_number)
{
    switch(led_number)
    {
        case 0: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); break;
        case 1: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET); break;
        case 2: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); break;
        case 3: HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); break;
        default: break;
    }
}

/**
 * @brief 切换指定的LED状态
 * @param led_number LED编号(0-3)
 */
void LED_Toggle(uint8_t led_number)
{
    switch(led_number)
    {
        case 0: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_0); break;
        case 1: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_1); break;
        case 2: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2); break;
        case 3: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_3); break;
        default: break;
    }
}

/**
 * @brief 让指定的LED闪烁一次
 * @param led_number LED编号(0-3)
 * @param delay 延迟时间(毫秒)
 */
void LED_Blink(uint8_t led_number, uint32_t delay)
{
    LED_On(led_number);
    HAL_Delay(delay);
    LED_Off(led_number);
    HAL_Delay(delay);
}
主程序实现
#include "stm32f4xx_hal.h"
#include "bsp_led.h"

int main(void)
{
    // 系统初始化
    HAL_Init();
    SystemClock_Config();

    // LED初始化
    LED_Init();

    while (1)
    {
        // 逐个闪烁LED灯
        LED_Blink(0, BLINK_DELAY); // PC0闪烁
        LED_Blink(1, BLINK_DELAY); // PC1闪烁
        LED_Blink(2, BLINK_DELAY); // PC2闪烁
        LED_Blink(3, BLINK_DELAY); // PC3闪烁
    }
}
测试与验证
  1. 编译与下载

    • 将代码编译并下载到STM32F407开发板中。
  2. 观察LED灯

    • 连接好硬件后,LED灯应该按照程序的设置逐个闪烁。如果LED灯没有闪烁,检查硬件连接和代码配置是否正确。
总结

通过本教程,您已经掌握了如何使用STM32F407的PC0-PC3引脚控制LED灯,并通过HAL库实现模块化设计。GPIO模式的配置是关键步骤,选择合适的模式可以确保LED灯的正常工作。模块化设计使代码更加清晰和易于维护,为后续的项目扩展奠定了良好的基础。希望本教程对您有所帮助,祝您在嵌入式开发的道路上取得更大的成功!

你可能感兴趣的:(【星云,Orbit-F4,开发板】,stm32,嵌入式硬件,单片机)