嵌入式VSCode环境部署及HC-SR04超声波测距传感器实验
pcfx环境部署
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

我拿到示例程序没仔细看就直接上传了,发现灯一直不亮,还以为是上传过程有问题
上传了两次,才反应过来
咕
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"
int main(void) { systick_config(); rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2); 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恢复。就能有如下效果。
.gif)
HC-SR04超声波测距传感器实验
基本介绍
HC-SR04超声波传感器通过声纳原理测定物体距离。
该传感器测量范围为2厘米至400厘米(0.8英寸至157英寸),精度达0.3厘米(0.1英寸),适用于大多数业余爱好者项目。
此模块集成了超声波发射器与接收器模块。
根据数据手册中的公式
有以下代码
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);
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) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_USART0);
gpio_af_set(GPIOB, GPIO_AF_8, GPIO_PIN_15); gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_8);
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);
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_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
- 串口答应:串口周期打印
xx.xxin, xx.xxcm。
写在后面
项目所使用的是一个从iCEasy商城申请的开发版,
特此感谢iCEasy商城对本项目的大力支持。
演示视频: B站演示视频链接
iCEasy商城口碑测评:iCEasy商城口碑测评链接
参考文献
GD32VW553-IOT
V2开发版【三分钟快速环境搭建教程—VSCode】_口碑测评-iCEasy商城 HC-SR04中文资料_最新报价_数据手册下载_Universal
Microelectronics-超声波收发器-立创商城