GD32F470ZKT6单片机开发板入门学习(二)点亮LED

📅 2026/7/12 19:05:34
GD32F470ZKT6单片机开发板入门学习(二)点亮LED
前言GD32F470ZKT6 是兆易创新GigaDevice推出的一款基于 ARM Cortex-M4 内核的高性能微控制器主频高达 240MHz内置 1MB Flash 和 256KB SRAM并集成了丰富的外设资源。本系列教程旨在帮助初学者快速上手 GD32F470ZKT6 开发板从最基础的开发环境搭建开始逐步深入掌握其应用开发。本文作为系列的第二篇将详细介绍基于 GD32F470ZKT6 单片机开发板点亮 LED 的代码编写。通过这个简单的入门项目读者可以熟悉 GD32 开发的基本流程、GPIO 配置方法以及工程创建步骤为后续更复杂的应用开发打下坚实基础。一、准备工作1.1 硬件准备GD32F470ZKT6 开发板或核心板一块USB 数据线用于供电和程序下载/调试一台 Windows 电脑1.2 软件准备Keil MDK-ARM版本建议 V5.30 或以上。可从 ARM 官网或 Keil 官网下载安装。1.3 文档支持《GD32F4xx_用户手册_Rev3.3》这是 GD32F4xx 系列微控制器的官方核心参考文档。手册详细记录了该系列芯片的完整资源、功能特性、寄存器定义及操作指南是开发过程中不可或缺的权威资料。主要内容包括 在开发过程中遇到任何硬件功能或寄存器配置问题都应首先查阅此手册获取最准确的技术细节。芯片概述介绍 GD32F4xx 系列的产品线、内核特性、性能参数和封装信息。存储器架构详细说明 Flash、SRAM、备份寄存器的地址映射和访问方式。系统与外设深入讲解时钟系统RCU、电源管理、GPIO、中断控制器NVIC等所有外设模块的功能、寄存器配置和编程模型。通信接口涵盖 USART、I2C、SPI、CAN、USB、以太网等通信协议控制器的使用方法。模拟功能包括 ADC、DAC、比较器等模块的配置和校准说明。定时器与高级控制详细描述基本定时器、高级定时器、PWM、输入捕获等功能的操作。附录与电气特性提供引脚定义、封装尺寸、电气参数、勘误表等实用信息《GD32F470xx_Datasheet_Rev2.2》这是 GD32F470xx 系列芯片的官方数据手册。它提供了该系列芯片的详细电气特性、引脚定义、封装信息、工作条件、直流/交流参数以及订购信息等关键硬件规格。数据手册是进行硬件设计如原理图绘制、PCB 布局、电源设计、外设选型时必须参考的核心文档用于确保芯片在目标应用中的可靠运行。二、LED灯基础知识在开始编写点亮 LED 的代码之前有必要先了解 LED 的基本工作原理和驱动方式。本节将简要介绍 LED 的结构组成、发光原理以及驱动原理。2.1 LED 的结构组成LEDLight Emitting Diode发光二极管是一种半导体发光器件其基本结构主要包括以下几个部分半导体芯片LED 的核心部分由 P 型半导体和 N 型半导体组成的 PN 结。当电流通过时电子和空穴在 PN 结处复合释放出能量以光的形式发射。引线架连接芯片与外部电路的金属支架通常包括阳极正极和阴极负极两个引脚。封装材料保护芯片并起到光学透镜作用的环氧树脂或硅胶材料能够将芯片发出的光线聚焦并向外发射。荧光粉涂层部分 LED对于白光 LED 或特定颜色的 LED芯片表面会涂覆荧光粉通过芯片发出的蓝光或紫外光激发荧光粉产生所需颜色的光。2.2 LED 发光原理LED 的发光基于半导体 PN 结的电致发光效应其基本原理如下正向偏置当 LED 两端施加正向电压阳极接正阴极接负时外部电场会削弱 PN 结的内建电场。载流子注入电子从 N 区向 P 区移动空穴从 P 区向 N 区移动两者在 PN 结附近区域相遇。复合发光电子与空穴在 PN 结处复合释放出能量。这部分能量以光子的形式发射出来产生可见光或红外光。波长决定颜色发射光的波长颜色由半导体材料的能带间隙决定。不同材料如 GaAs、GaP、GaN 等可以产生红、黄、绿、蓝等不同颜色的光。2.3 LED 驱动原理LED 是电流驱动型器件其亮度与通过的正向电流成正比。驱动 LED 时需要注意以下几个关键点正向电压降LED 导通时需要一定的正向电压通常为 1.8V-3.6V具体取决于材料和颜色低于此电压 LED 不会发光。电流限制LED 的伏安特性曲线非常陡峭微小的电压变化会导致电流急剧增加可能烧毁 LED。因此必须使用限流电阻或恒流驱动电路来限制电流。驱动方式电阻限流最简单的驱动方式通过串联一个电阻来限制电流。计算公式R (VCC - VF) / IF其中 VCC 为电源电压VF 为 LED 正向压降IF 为期望的 LED 工作电流。恒流驱动使用专门的 LED 驱动芯片或电路提供恒定电流确保 LED 亮度稳定不受电源电压波动影响。PWM 调光通过快速开关 LED 并改变占空比来调节平均亮度这种方式不会改变 LED 的色温是常用的调光方法。2.4 LED原理图开发板关于LED灯的原理图如图所示。通过上面的原理图可以了解到LED灯的负极接到了电源地LED灯的正极连接到了单片机的 GPIO 口上通过LED灯的驱动原理只需要将GPIO配置为高电平即可点亮LED灯。对应LED1就是 使能PD4输出高电平即可点亮LED1。在单片机系统中通常使用 GPIO 引脚通过限流电阻直接驱动 LED或通过晶体管/MOSFET 驱动大功率 LED。GD32F470ZKT6 的 GPIO 引脚可以配置为推挽输出模式提供足够的驱动能力来控制 LED 的亮灭。三、代码编写3.1 创建工程首先创建一个新的 Keil 工程文件命名为1_GD32F470_LED。具体的创建步骤可以参考本系列教程的第一篇文章。工程创建完成后点击编译按钮编译结果如下图所示。编译成功后接下来开始编写点亮 LED 的核心代码。3.2 创建源文件和头文件1. 创建源文件并命名为 my_led在 Keil 工程中展开左侧的Hardware分组右键点击该分组选择Add New Item to Group Hardware...。在弹出的对话框中选择C File (.c)文件类型在Name框中填写my_led在Location框中选择本例程文件夹下的Hardware文件夹具体操作如下图所示。2 创建头文件并命名为 my_led在 Keil 工程中展开左侧的Hardware分组右键点击该分组选择Add New Item to Group Hardware...。在弹出的对话框中选择Header File (.h)文件类型在Name框中填写my_led在Location框中选择本例程文件夹下的Hardware文件夹具体操作如下图所示。3.3 源文件代码编写在上一节的 LED 原理图中我们已经明确了 LED 灯与控制引脚的对应关系具体连接情况如下图所示。根据原理图可知要控制 LED 灯的点亮与熄灭需要配置对应的 GPIO 端口。从图中可以看到LED1 连接至 PD4 引脚LED2 连接至 PD5 引脚LED3 连接至 PG3 引脚。因此我们需要配置 GPIOD 和 GPIOG 这两个端口。GD32 官方提供了完善的固件库Firmware Library其中包含了丰富的库函数涵盖了时钟控制、GPIO 配置、中断管理、定时器、通信接口等所有外设功能。这些库函数经过精心设计和测试具有详细的注释和清晰的接口定义。在开发过程中我们无需从零开始编写底层驱动只需根据需求查找并使用相应的库函数即可这大大提高了开发效率和代码可靠性。1. 开启 GPIO 端口时钟在 GD32 微控制器中所有外设资源的时钟默认都是关闭的以降低功耗。因此在配置和使用任何外设如 GPIO之前必须先开启其对应的时钟。要开启 GPIO 端口的时钟我们需要查找相关的库函数。打开gd32f4xx_rcu.h头文件该文件包含了丰富的时钟控制函数声明。通过函数名可以大致判断其功能我们找到void rcu_periph_clock_enable(rcu_periph_enum periph)函数这正是我们需要的时钟使能函数。该函数接收一个枚举类型参数periph用于指定要开启时钟的外设。查看该枚举的定义可以看到其中定义了各种外设的时钟使能选项包括 GPIO、DMA、定时器等如图所示图中仅展示部分枚举值。2. GPIO 基础模式配置说明GD32F4 系列 GPIO 引脚模式配置分为两个核心配置阶段功能模式配置调用标准库函数指定引脚工作模式可选输入、通用输出、复用功能、模拟输入四类电平阻抗配置调用标准库函数配置引脚内部阻抗特性可选浮空、上拉电阻、下拉电阻三种。以 PD4 驱动 LED1 点亮为例需求为引脚输出高电平驱动负载因此引脚需配置为通用输出模式。 硬件设计规范通用输出模式下芯片内部上下拉电阻默认关闭采用浮空阻抗配置仅输入模式场景需根据引脚默认电平需求选择开启上拉或下拉电阻。综上本例 PD4 需配置为通用输出 浮空阻抗。该功能对应的库函数定义在gd32f4xx_gpio.h头文件中核心接口如下void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin);函数共 4 个入参释义gpio_periphGPIO 外设端口基地址可选配置参考如图所示mode引脚功能模式输入 / 输出 / 复用 / 模拟可选配置参考如图所示pull_up_down引脚内部上下拉阻抗配置浮空 / 上拉 / 下拉可选配置参考如图所示pin待配置的 GPIO 引脚位掩码可选配置参考。3.GPIO输出配置说明当引脚已通过gpio_mode_set()设置为通用输出模式后还需完成两项输出电气参数配置输出驱动类型配置选择推挽输出或开漏输出引脚翻转速率配置设置 GPIO 输出驱动速度。上述输出特性配置接口定义在头文件gd32f4xx_gpio.h中专用配置函数如下void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin);该函数包含 4 个入参各参数定义与可选配置参考如下gpio_periph目标 GPIO 外设端口可选参数参考如图所示 ​​​​​​​otype输出驱动类型推挽 / 开漏可选参数参考如图所示speed引脚输出翻转速率可选参数参考如图所示pin待配置的 GPIO 引脚位掩码可选参数参考如图所示。使用上述的三个函数进行void my_led_init(void)函数进行编写如图所示。#include gd32f4xx.h void my_led_init(void) { //开启GPIO口时钟 rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_GPIOG); //配置GPIO口模式 gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_4 | GPIO_PIN_5); gpio_mode_set(GPIOG,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_3); //配置GPIO输出 gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_4 | GPIO_PIN_5); gpio_output_options_set(GPIOG,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3); }3.4 头文件代码编写在嵌入式C语言开发中头文件.h文件扮演着至关重要的角色。它主要用于声明函数原型、宏定义、数据类型和全局变量为源文件.c文件提供接口规范。良好的头文件设计可以提高代码的可读性、可维护性和复用性。对于LED驱动模块我们需要创建一个名为my_led.h的头文件其内容如下#ifndef MY_LED_H #define MY_LED_H #include gd32f4xx.h void my_led_init(void); #endif下面对头文件中的每一部分进行详细解析防止重复包含的宏定义#ifndef MY_LED_H和#define MY_LED_H这是C/C中标准的头文件保护机制。当编译器第一次遇到这个头文件时MY_LED_H宏尚未定义因此会执行#define MY_LED_H并继续处理后续内容。如果同一个源文件多次包含了这个头文件第二次及以后遇到时由于MY_LED_H已经定义#ifndef条件为假编译器会跳过整个头文件内容避免重复定义错误。#endif与#ifndef配对标记头文件保护区域的结束。必要的头文件包含#include gd32f4xx.h这是GD32F4系列微控制器的设备头文件包含了芯片的所有寄存器定义、外设地址映射和基本的类型定义。由于my_led_init函数中使用了GD32的库函数如rcu_periph_clock_enable、gpio_mode_set等必须包含这个头文件才能正确编译。函数声明void my_led_init(void);这是LED初始化函数的声明。它告诉编译器存在这样一个函数返回类型为void无返回值参数列表为void无参数。任何想要使用LED驱动功能的源文件只需要包含my_led.h头文件就可以调用my_led_init()函数而无需关心函数的具体实现细节。头文件的使用方法在main.c文件中我们需要包含这个头文件才能使用其中声明的函数#include my_led.h int main(void) { // 初始化LED相关GPIO引脚 my_led_init(); // 其他初始化代码... while(1) { // 主循环代码... } }通过这样的设计我们将LED驱动的接口头文件与实现源文件分离符合模块化编程的原则。当其他模块需要使用LED功能时只需要包含my_led.h头文件并调用my_led_init()函数即可无需了解底层GPIO配置的具体细节。3.5 main文件编写在完成 LED 驱动模块的源文件和头文件编写后接下来需要编写主程序文件main.c。该文件是程序的入口点负责初始化系统并实现 LED 闪烁的逻辑。1. 包含必要的头文件首先在main.c文件中包含以下头文件#include gd32f4xx.h #include my_led.hgd32f4xx.hGD32F4 系列微控制器的设备头文件包含所有外设寄存器定义和库函数声明。my_led.h自定义的 LED 驱动头文件声明了my_led_init()函数。2. 编写 main() 函数main()函数是 C 程序的入口点其基本结构如下int main(void) { // 系统初始化 systick_config(); // 滴答定时器初始化 // 外设初始化LED、定时器等 // 主循环 while(1) { // 应用程序逻辑 } }3. 初始化 LED 驱动在main()函数开始时调用my_led_init()函数来初始化控制 LED 的 GPIO 引脚int main(void) { // 初始化 LED 相关 GPIO 引脚 my_led_init(); // 其他初始化代码可根据需要添加 systick_config(); // 滴答定时器初始化 // 主循环 while(1) { // 应用程序逻辑 } }4. 实现 LED 闪烁逻辑为了实现 LED 的闪烁效果我们需要在主循环中周期性地翻转 LED 引脚的电平。GD32 固件库提供了gpio_bit_toggle()函数可以方便地翻转指定引脚的电平状态。同时为了控制翻转的时间间隔我们需要一个延时函数。GD32 标准库中通常包含delay_1ms()函数或类似的延时函数用于实现毫秒级延时。完整的main.c文件代码如下#include gd32f4xx.h #include my_led.h int main(void) { // 初始化 LED 相关 GPIO 引脚 my_led_init(); systick_config(); // 滴答定时器初始化 // 主循环 while(1) { // 翻转 PD4 (LED1) 引脚电平 gpio_bit_toggle(GPIOD, GPIO_PIN_4); // 翻转 PD5 (LED2) 引脚电平 gpio_bit_toggle(GPIOD, GPIO_PIN_5); // 翻转 PG3 (LED3) 引脚电平 gpio_bit_toggle(GPIOG, GPIO_PIN_3); // 延时 500 毫秒 delay_1ms(500); } }代码解析头文件包含包含了必要的设备头文件和自定义 LED 驱动头文件。LED 初始化my_led_init()函数配置了 PD4、PD5 和 PG3 引脚为推挽输出模式并开启了相应的 GPIO 时钟。主循环逻辑使用gpio_bit_toggle()函数依次翻转三个 LED 控制引脚的电平。每次翻转后调用delay_1ms(500)延时 500 毫秒。由于三个翻转操作之间没有延时三个 LED 会同时翻转实现同步闪烁效果。闪烁效果LED 每 500 毫秒改变一次状态亮→灭或灭→亮三个 LED 同步闪烁。5. 编译与下载编译工程点击 Keil MDK 工具栏中的编译按钮或按 F7检查是否有语法错误或警告。解决编译问题如果出现未定义delay_1ms()函数的错误需要确保已包含相应的延时库文件或自行实现一个简单的延时函数。连接开发板使用 USB 数据线连接开发板与电脑。下载程序点击下载按钮或按 F8将编译生成的二进制文件烧录到 GD32F470ZKT6 的 Flash 中。观察现象程序运行后开发板上的 LED1、LED2、LED3 应每隔 500 毫秒同时闪烁一次。6. 实验现象验证编译成功且无错误后点击烧录按钮将程序下载到开发板。程序运行后可以观察到以下现象LED1PD4、LED2PD5、LED3PG3三个指示灯同时点亮。经过 500 毫秒后三个 LED 同时熄灭。再经过 500 毫秒三个 LED 再次同时点亮。如此循环形成周期为 1 秒亮 500ms灭 500ms的同步闪烁效果。7. 扩展思考独立控制尝试修改代码让三个 LED 以不同的时间间隔闪烁或实现流水灯效果。延时函数优化了解delay_1ms()函数的实现原理考虑使用定时器中断实现更精确的延时。按键控制结合 GPIO 输入功能实现通过按键控制 LED 的亮灭或闪烁模式。通过本节的实践读者应掌握主程序文件的基本结构、LED 驱动函数的调用方法以及简单的延时控制逻辑为后续更复杂的嵌入式应用开发奠定基础。