环境部署
1) 下载与解压
在 GigaDevice 兆易创新官网下载:
GD32VW553系列 MCU | 兆易创新 GigaDevice | 官方网站
下载内容:
- 烧录工具:GD32AllInOneProgrammer
- 固件库:GD32VW55x_Demo_Suites
下载后并解压。
2) VSCode 安装扩展
在 VSCode 里安装扩展:Embedded IDE

3) 导入工程
选择导入项目:

选择第三个:Eclipse embedded gcc projects

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

4) 配置工具链
设置工具链:

选择:RISC-V GCC Toolchain

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



链接脚本路径设置为:
GD32VW55x_Firmware_Library\RISCV\env_Eclipse\GD32VW553xM.lds
6) 修改示例代码(点亮板载 LED)
接下来我们要修改示例代码里面的程序。
根据原理图:板载 LED 位于PB2

我拿到示例程序没仔细看就直接上传了,发现灯一直不亮,还以为是上传过程有问题
上传了两次,才反应过来 示例程序里的灯和开发板上的灯位置不一样
#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) 编译验证
尝试编译:

如图上就是能成功编译。
8) 烧录固件
如图所示调整开发板

打开GD32AllInOneProgrammer,选择好对应的COM口,选择波特率为115200
在Download里选择文件
>注:vscode生成的文件是hex格式,选择文件时需要在窗口中切换对应的后缀格式

点击Download,等待进度条到100%,就证明刷入成功了。断开type-c把boot1恢复。就能有如下效果。

HC-SR04超声波测距传感器实验
基本介绍
HC-SR04超声波传感器通过声纳原理测定物体距离。
该传感器测量范围为2厘米至400厘米(0.8英寸至157英寸),精度达0.3厘米(0.1英寸),适用于大多数业余爱好者项目。
此模块集成了超声波发射器与接收器模块。

根据数据手册中的公式

有以下代码
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);
}
实验效果

总结
- 功能实现:实现超声波测距,触发脚为 A0(PA0),回波脚为 A1(PA1)。
- 时序实现: 5us LOW -> 10us HIGH 触发脉冲,并测量 ECHO 高电平持续时间。
- 距离计算:cm=(duration/2)/29.1,inches=(duration/2)/74
- 串口输出:串口周期打印所测距离。
参考文献
GD32VW553-IOT V2开发版【三分钟快速环境搭建教程—VSCode】_口碑测评-iCEasy商城
HC-SR04中文资料_最新报价_数据手册下载_Universal Microelectronics-超声波收发器-立创商城

开源社区 


