VSCode环境部署及HC-SR04超声波测距传感器实验

环境部署

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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恢复。就能有如下效果。 VID_20260217_095530 (1)

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

基本介绍

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

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

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#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商城对本项目的大力支持。

演示视频: B站演示视频链接

iCEasy商城口碑测评:iCEasy商城口碑测评链接

参考文献

GD32VW553-IOT V2开发版【三分钟快速环境搭建教程—VSCode】_口碑测评-iCEasy商城 HC-SR04中文资料_最新报价_数据手册下载_Universal Microelectronics-超声波收发器-立创商城