萤火工场 GD32VW553-IOT LED 控制程序内容分享
分享作者:wx17394389273632
评测品牌:萤火工场
评测型号:GD32VW553-IOT
发布时间:2025-03-31 13:35:49
前言
本文将详细介绍如何在 GD32VW553 微控制器上实现 LED 控制程序,通过两个 LED 灯的交替闪烁展示微控制器的 GPIO 控制。同时结合 SEGGER Embedded Studio IDE 进行开发,为开发者提供一套完整的开发流程和技术参考
开源口碑分享内容

一、GD32VW553 微控制器简介

       GD32VW553xx 是一款高度集成的 2.4GHz Wi-Fi 和 BLE 系统级芯片(SoC),GD32VW553xx 设备采用运行频率为 160MHz 的 RISC-V 32 位处理器内核,以实现最高效率。它提供高达 4096KB 的片上闪存和 320KB(288KB + 32KB 共享)的 SRAM 内存。丰富的增强型 I/O 和外设通过两条 APB 总线连接。这些设备提供 12 位 ADC、多达四个通用 16 位定时器、一个基本定时器、一个 PWM 高级定时器,以及标准和高级通信接口:一个 SPI、两个 I2C、一个 USART、两个 UART 和一个无线(BLE / Wi-Fi)。还包括加密加速单元(CAU)、哈希加速单元(HAU)、公钥加密加速单元(PKCAU)和四线 SPI 接口(QSPI)等其他外设。该设备的工作电源为 1.8 至 3.6 伏,6 级器件的工作温度范围为 -40 至 +85 摄氏度,7 级器件的工作温度范围为 -40 至 +105 摄氏度。多种节能模式提供了灵活性,可在唤醒延迟和功耗之间实现最大程度的优化,这对于低功耗应用来说尤为重要。
       上述特性使 GD32VW553xx 系列器件适用于广泛的应用领域,尤其是在工业控制、智能家居控制系统、用户界面、电源监控和报警系统、消费类和手持设备、游戏和 GPS、电动自行车、物联网等方面。

二、开发工具介绍

(一)SEGGER Embedded Studio IDE 概述

SEGGER Embedded Studio 是一款功能强大且结构紧凑的集成开发环境(IDE),为开发者提供了全面的开发工具集。它具备强大的项目构建与管理系统,能够高效组织和管理项目文件;灵活的源代码编辑器支持多种编程语言,具备智能代码提示、语法检查等功能,方便开发者编写代码;此外,软件支持包方便了下载和安装相关依赖。其内置调试器与 J-Link 配合使用时,性能优异且稳定性强。对于基于 GD32VW553 微控制器的开发,该 IDE 能完美支持代码编写、编译和调试工作。值得一提的是,兆易创新与 SEGGER 合作,向所有使用 GD32V 系列 RISC-V 微控制器(包括 GD32VW553)的用户免费提供商用的多平台 SEGGER Embedded Studio,极大地降低了开发成本,提升了开发效率。

(二)软件版本信息

当前 RISC-V 版本为 V7.32a(2023-11-29) ,针对不同操作系统提供了多种安装包,如 Windows 64 位、Windows ARM 64 位、Linux 64 位、Linux ARM 64 位、macOS 64 位(适用于 Apple Silicon 和 Intel Silicon)等,开发者可根据自身系统选择合适的版本进行下载安装。

三、开发环境搭建

一)RISC-V 版本安装

RISC-V 版本的软件安装过程十分简便,开发者只需按照安装向导提示,一路点击 “下一步” 即可完成安装,且无需破解,降低了使用门槛。

(二)GD32VW553 插件安装

      在GD32官网下载名为 “GD32VW55x AddOn V1.2.0.7z” 的 7-Zip 压缩文件,解压后该压缩包内包含多个文件,如软件许可协议文档 “SOFTWARE LICENSE AGREEMENT SLA-GD0006-version1.1.pdf”、应用程序 “JAR.GD22MV55X_ADDON.1.2.0.exe” 以及 SEGGER Embedded Studio 相关文件 “GD32VW55x-1.01.emPackage” 等。解压后,直接点击安装GD32VW55x-1.01.emPackage程序即可完成插件安装。

四、编译操作指南

hex文件生成与编译

F7编译


五、关键函数解析

(一)系统滴答定时器配置函数

systick_config()函数用于配置系统滴答定时器,为程序中的延时功能提供基础。其实现代码如下:

void systick_config(void)
{
    SysTimer_SetControlValue(SysTimer_MTIMECTL_CMPCLREN_Msk);
    SysTimer_SetCompareValue(SystemCoreClock/4000);
    __ECLIC_SetTrigIRQ(CLIC_INT_TMR, ECLIC_POSTIVE_EDGE_TRIGGER);
    eclic_irq_enable(CLIC_INT_TMR, 0, 0);
}

该函数通过SysTimer_SetControlValue函数清除比较寄存器清零使能位,设置系统定时器的控制值;利用SysTimer_SetCompareValue函数将比较值设置为系统核心时钟除以 4000,这一设置为后续delay_1ms函数实现精确延时奠定了基础;通过__ECLIC_SetTrigIRQ函数将中断触发方式设置为上升沿触发,并使用eclic_irq_enable函数使能定时器中断,从而确保系统滴答定时器能按预期工作。

(二)GPIO 时钟使能函数

rcu_periph_clock_enable();函数用于使能 GPIO 端口的时钟,其定义如下:

void rcu_periph_clock_enable(rcu_periph_enum periph)
{
    RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph));
}

在控制连接于 GPIO 端口的 LED 时,开启该端口时钟是必不可少的前置步骤。通过此函数,向对应寄存器写入特定值,即可使能 GPIO端口时钟。

(三)GPIO 模式配置函数

gpio_mode_set函数用于配置 GPIO 模式,具体代码如下:

void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin)
{
    uint16_t i;
    uint32_t ctl, pupd;
    ctl = GPIO_CTL(gpio_periph);
    pupd = GPIO_PUD(gpio_periph);
    for(i = 0U; i < 16U; i++){
        if((1U << i) & pin){
            // 清除指定引脚模式位
            ctl &= ~GPIO_MODE_MASK(i);
            // 设置指定引脚模式位
            ctl |= GPIO_MODE_SET(i, mode);
            // 清除指定引脚上下拉电阻位
            pupd &= ~GPIO_PUPD_MASK(i);
            // 设置指定引脚上下拉电阻位
            pupd |= GPIO_PUPD_SET(i, pull_up_down);
        }
    }
    GPIO_CTL(gpio_periph) = ctl;
    GPIO_PUD(gpio_periph) = pupd;
}

该函数接收 GPIO 端口、引脚模式、上下拉电阻配置以及要配置的引脚等参数。通过循环遍历引脚,对 GPIO 控制寄存器和上下拉寄存器进行位操作,实现对指定引脚模式和上下拉状态的精确配置。在本 LED 控制程序中,将相关引脚配置为输出模式,以满足控制 LED 亮灭的需求。

(四)GPIO 引脚电平控制函数

gpio_bit_reset函数用于将指定引脚电平拉低,定义如下:

void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin)
{
    GPIO_BC(gpio_periph) = (uint32_t)pin;
}

与之对应的gpio_bit_set函数用于将引脚电平拉高,代码为:

void gpio_bit_set(uint32_t gpio_periph, uint32_t pin)
{
    GPIO_BOP(gpio_periph) = (uint32_t)pin;
}

在 LED 控制程序的主循环中,正是通过这两个函数的配合,实现了 LED1 和 LED2 的交替闪烁

六、主程序代码分析

#include"gd32vw55x.h"
#include"gd32vw553h_eval.h"
#include"systick.h"
#include <stdio.h>

/*!
\brief main function
\param[in]none
\param[out]none
\retval none
*/
int main(void)
{
    systick_config();

  
    // 使能LED时钟
    rcu_periph_clock_enable(RCU_GPIOB);
    // 配置LED GPIO端口
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15 | GPIO_PIN_13);

    gpio_bit_reset(GPIOB, GPIO_PIN_12 | GPIO_PIN_13);

    while(1){
        // 点亮LED1,熄灭LED3
        gpio_bit_set(GPIOB, GPIO_PIN_12);
        gpio_bit_reset(GPIOB, GPIO_PIN_13);
        delay_1ms(100);

        // 点亮LED2,熄灭LED1
        gpio_bit_set(GPIOB, GPIO_PIN_13);
        gpio_bit_reset(GPIOB, GPIO_PIN_12);
        delay_1ms(100);
    }
}

main函数中,首先调用systick_config()函数配置系统滴答定时器;使能 GPIOB 端口时钟,配置相关引脚为输出模式且无上拉或下拉电阻,并将 LED 引脚初始化为低电平。在无限循环中,通过gpio_bit_setgpio_bit_reset函数控制 LED1 和 LED2 交替闪烁,每次状态切换后通过delay_1ms(100)函数延时 100 毫秒,实现了两个 LED 灯的稳定交替闪烁效果。

七、程序下载

芯片内嵌的引导装载程序位于系统存储器中,用来对片上闪存的主存进行重新编程。该引导装
载程序可通过以下串行接口之一工作:USART0(PB15 和 PA8), UART1(PA4 和 PA5),
UART2(PA6和PA7)。

Boot 设置

下载与连接