环境部署

1) 下载与解压

在 GigaDevice 兆易创新官网下载:
GD32VW553系列 MCU | 兆易创新 GigaDevice | 官方网站

下载内容:

  • 烧录工具:GD32AllInOneProgrammer
  • 固件库:GD32VW55x_Demo_Suites

下载后并解压。

2) VSCode 安装扩展

在 VSCode 里安装扩展:Embedded IDE

Pasted image 20260217095854

3) 导入工程

选择导入项目:

Pasted image 20260217100147

选择第三个:Eclipse embedded gcc projects

Pasted image 20260217111258

打开以下路径下的 .cproject 文件:
\GD32VW553H_EVAL_Demo_Suites\Projects\01_GPIO_Running_LED\eclips

Pasted image 20260217111505

4) 配置工具链

设置工具链:

Pasted image 20260217111806

选择:RISC-V GCC Toolchain

Pasted image 20260217111839

5) 配置链接脚本与构建器选项

配置链接脚本路径和构建器选项:

Pasted image 20260217112044
Pasted image 20260217112156
Pasted image 20260217112258

链接脚本路径设置为:
GD32VW55x_Firmware_Library\RISCV\env_Eclipse\GD32VW553xM.lds

6) 修改示例代码(点亮板载 LED)

接下来我们要修改示例代码里面的程序。
根据原理图:板载 LED 位于 PB2

Pasted image 20260217112740

我拿到示例程序没仔细看就直接上传了,发现灯一直不亮,还以为是上传过程有问题
上传了两次,才反应过来

#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "gd32vw553h_eval.h"
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none

*/
int main(void)
{
    systick_config();
    /* enable the LED clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* configure LED GPIO port */
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
    /* reset LED GPIO pin */
    gpio_bit_reset(GPIOB, GPIO_PIN_2);

    while(1) {
        gpio_bit_set(GPIOB, GPIO_PIN_2);
        delay_1ms(500);
        gpio_bit_reset(GPIOB, GPIO_PIN_2);
        delay_1ms(500);
    }
}

7) 编译验证

尝试编译:

Pasted image 20260217112617

如图上就是能成功编译。

8) 烧录固件

如图所示调整开发板
Pasted image 20260217123408
打开GD32AllInOneProgrammer,选择好对应的COM口,选择波特率为115200
在Download里选择文件

注:vscode生成的文件是hex格式,选择文件时需要在窗口中切换对应的后缀格式

Pasted image 20260303100751
点击Download,等待进度条到100%,就证明刷入成功了。断开type-c把boot1恢复。led就能开始闪烁力。

HC-SR04超声波测距传感器实验

基本介绍

HC-SR04超声波传感器通过声纳原理测定物体距离。
该传感器测量范围为2厘米至400厘米(0.8英寸至157英寸),精度达0.3厘米(0.1英寸),适用于大多数业余爱好者项目。
此模块集成了超声波发射器与接收器模块。
Pasted image 20260303103354
根据数据手册中的公式
Pasted image 20260303103634
有以下代码

cm = ((float)duration_us / 2.0f) / 29.1f;
inches = ((float)duration_us / 2.0f) / 74.0f;
printf("%.2fin, %.2fcm\n\r", inches, cm);

完整代码

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

#define ULTRASONIC_GPIO_PORT      GPIOA
#define ULTRASONIC_TRIG_PIN       GPIO_PIN_0
#define ULTRASONIC_ECHO_PIN       GPIO_PIN_1
#define ULTRASONIC_TIMEOUT_US     30000U

void com_usart_init(void);
static void ultrasonic_gpio_init(void);
static void delay_us(uint32_t us);
static uint32_t pulse_in_high_us(uint32_t timeout_us);
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    uint32_t duration_us;
    float cm;
    float inches;

    systick_config();
    com_usart_init();
    ultrasonic_gpio_init();
    printf("\n\rUltrasonic sensor example (TRIG: PA0, ECHO: PA1)\n\r");

    while(1) {
        gpio_bit_reset(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_PIN);
        delay_us(5);
        gpio_bit_set(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_PIN);
        delay_us(10);
        gpio_bit_reset(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_PIN);

        duration_us = pulse_in_high_us(ULTRASONIC_TIMEOUT_US);

        if(0U == duration_us) {
            printf("out of range\n\r");
        } else {
            cm = ((float)duration_us / 2.0f) / 29.1f;
            inches = ((float)duration_us / 2.0f) / 74.0f;
            printf("%.2fin, %.2fcm\n\r", inches, cm);
        }

        delay_1ms(250);
    }
}

static void ultrasonic_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);

    gpio_mode_set(ULTRASONIC_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ULTRASONIC_TRIG_PIN);
    gpio_output_options_set(ULTRASONIC_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, ULTRASONIC_TRIG_PIN);
    gpio_bit_reset(ULTRASONIC_GPIO_PORT, ULTRASONIC_TRIG_PIN);

    gpio_mode_set(ULTRASONIC_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ULTRASONIC_ECHO_PIN);
}

static void delay_us(uint32_t us)
{
    uint32_t cycles_per_us = SystemCoreClock / 1000000U;
    uint32_t cycles = (cycles_per_us * us) / 5U;

    while(cycles--) {
        __asm volatile("nop");
    }
}

static uint32_t pulse_in_high_us(uint32_t timeout_us)
{
    uint32_t wait_us = 0U;
    uint32_t pulse_us = 0U;

    while(RESET != gpio_input_bit_get(ULTRASONIC_GPIO_PORT, ULTRASONIC_ECHO_PIN)) {
        if(wait_us++ >= timeout_us) {
            return 0U;
        }
        delay_us(1);
    }

    wait_us = 0U;
    while(SET != gpio_input_bit_get(ULTRASONIC_GPIO_PORT, ULTRASONIC_ECHO_PIN)) {
        if(wait_us++ >= timeout_us) {
            return 0U;
        }
        delay_us(1);
    }

    while(SET == gpio_input_bit_get(ULTRASONIC_GPIO_PORT, ULTRASONIC_ECHO_PIN)) {
        if(pulse_us++ >= timeout_us) {
            return 0U;
        }
        delay_us(1);
    }

    return pulse_us;
}


void com_usart_init(void)
{
    /* enable COM GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);

    /* connect port to USART TX */
    gpio_af_set(GPIOB, GPIO_AF_8, GPIO_PIN_15);
    /* connect port to USART RX */
    gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_8);

    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_15);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_15);

    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_8);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_8);

    /* USART configuration */
    usart_deinit(USART0);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_baudrate_set(USART0, 115200U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

    usart_enable(USART0);
}

实验效果

VID_20260303_100142

总结

  • 功能实现:实现超声波测距,触发脚为 A0(PA0),回波脚为 A1(PA1)
  • 时序实现5us LOW -> 10us HIGH 触发脉冲,并测量 ECHO 高电平持续时间。
  • 距离计算cm=(duration/2)/29.1inches=(duration/2)/74
  • 串口答应:串口周期打印 xx.xxin, xx.xxcm

写在后面

项目所使用的是一个从iceasy商城申请的开发版,
特此感谢iceasy商城对本项目的大力支持。

参考文献

GD32VW553-IOT V2开发版【三分钟快速环境搭建教程—VSCode】_口碑测评-iCEasy商城

HC-SR04数据手册
HC-SR04中文资料_最新报价_数据手册下载_Universal Microelectronics-超声波收发器-立创商城

更多推荐