【萤火工场GD32VW553-IOT开发板】ADC电压的LabVIEW采集
🔋 本文介绍了萤火工场 GD32VW553-IOT 开发板通过串口中断查询的方式采集 ADC 电压及温度转换数据,并进一步结合LabVIEW上位机实现数据自动采集和实时监测的项目设计。
项目介绍
- 串口中断查询,获取 ADC 电压数据,以及温度转换数据 🍦
- LabVIEW 上位机程序设计 🥧
- 开发板结合 LabVIEW上位机实现 ADC 电压和温度数据采集、实时演化曲线的显示、数据保存 🍫
硬件连接
- RXD -> PB15
- TXD -> PA8
- 3V3 -> VCC
- GND -> GND
示意图

实物连接

工程创建
-
运行
Embedded Builder
软件,File
-New
-Project ...
; -
选择
C/C++
-C Project
- 点击 Next ; -
设置工程名称、工程路径,目标设备选择
GD32VW553HMQ7
,点击Finished
完成工程创建。
流程图

工程代码
📊 打开 src/main.c
文件,修改代码如下
c++
#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"
uint16_t adc_value[2]; // storage adc value
void led_spark(void){}
void rcu_config(void);
void adc_config(void);
void dma_config(void);
void usart_config(void);
int main(void)
{
/* system clocks configuration */
rcu_config();
/* systick configuration */
systick_config();
/* DMA configuration */
dma_config();
/* ADC configuration */
adc_config();
/* USART configuration */
gd_eval_com_init(EVAL_COM0);
usart_config();
while (1)
{}
}
/*!
\brief USART interrupt function
\param[in] none
\param[out] none
\retval none
*/
void USART0_IRQHandler(void) {
static uint8_t comdata[3];
static uint8_t com_index = 0;
float temperature;
float vref_value;
if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
{
uint8_t data = usart_data_receive(USART0); // 读取数据
comdata[com_index++] = data;
if (com_index >= 3)
{
if(comdata[0] == 0x55){
if(comdata[1] == 0xAA){
switch(comdata[2]){
case 0x10:
while (!adc_flag_get(ADC_FLAG_EOC));
vref_value = (adc_value[1] * 3.3f / 4096);
printf("%5.3f\r\n", (double)vref_value);
break;
case 0x11:
while (!adc_flag_get(ADC_FLAG_EOC));
temperature = (1.43f - adc_value[0]*3.3f/4096) * 1000 / 4.3f + 25;
printf("%2.2f\r\n", (double)temperature);
break;
}
}
}
com_index = 0;
}
}
}
/*!
\brief Enable USART interrupt
\param[in] none
\param[out] none
\retval none
*/
void usart_config(void)
{
usart_interrupt_enable(USART0, USART_INT_RBNE); // 接收缓冲区非空中断
eclic_irq_enable(USART0_IRQn, 0, 0); // 使能 USART0 中断
usart_enable(USART0);
}
/*!
\brief configure the different system clocks
\param[in] none
\param[out] none
\retval none
*/
void rcu_config(void)
{
/* enable ADC1 clock */
rcu_periph_clock_enable(RCU_ADC);
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA);
/* config ADC clock */
adc_clock_config(ADC_ADCCK_PCLK2_DIV6);
}
/*!
\brief configure the DMA peripheral
\param[in] none
\param[out] none
\retval none
*/
void dma_config(void)
{
/* ADC_DMA_channel configuration */
dma_single_data_parameter_struct dma_single_data_parameter;
/* ADC DMA_channel configuration */
dma_deinit(DMA_CH0);
/* initialize DMA single data mode */
dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA);
dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_single_data_parameter.memory0_addr = (uint32_t)(&adc_value);
dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;
dma_single_data_parameter.number = 2;
dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA_CH0, &dma_single_data_parameter);
dma_channel_subperipheral_select(DMA_CH0, DMA_SUBPERI0);
/* enable DMA circulation mode */
dma_circulation_enable(DMA_CH0);
/* enable DMA channel */
dma_channel_enable(DMA_CH0);
}
/*!
\brief configure the ADC peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_config(void)
{
/* ADC contineous function enable */
adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);
/* ADC scan mode disable */
adc_special_function_config(ADC_SCAN_MODE, ENABLE);
/* ADC data alignment config */
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
/* ADC channel length config */
adc_channel_length_config(ADC_ROUTINE_CHANNEL, 2U);
/* ADC regular channel config */
adc_routine_channel_config(0U, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);
adc_routine_channel_config(1U, ADC_CHANNEL_10, ADC_SAMPLETIME_55POINT5);
/* ADC trigger config */
adc_external_trigger_config(ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
adc_tempsensor_vrefint_enable();
/* ADC DMA function enable */
adc_dma_request_after_last_enable();
adc_dma_mode_enable();
/* enable ADC interface */
adc_enable();
delay_1ms(1U);
/* ADC software trigger enable */
adc_software_trigger_enable(ADC_ROUTINE_CHANNEL);
}
🍟 保存代码,编译工程,生成 Debug 文件夹,右键 bin 文件 - Show In
- System Explorer
,打开文件夹并获得 *.bin
固件。
固件上传
📡 采用 ISP 方式上传固件至开发板。
-
将 BOOT0 拉高,USB 转 TTL 工具连接开发板;
-
运行 GD32 All-In-One Programmer 软件;
-
设备端口选择、串口参数设置,设备名称选择 GD32VW553HMQ7 ,点击
Connect
按钮(若连接失败,则短按复位键); -
加载镜像固件、设置起始地址,点击
Download
按钮; -
待加载完成,跳帽恢复,将 BOOT0 拉低;
-
短按 RST 复位键,程序开始运行。
效果演示
📡 打开串口调试助手,配置串口参数,打开串口,即可观察到串口输出文本。
动态演示

LabVIEW 上位机
🔎 LabVIEW 上位机的设计包括 前面板 和 程序框图 两部分。
🧵 结合开发板程序可知,
- 当串口接收到
55 AA 10
指令时,反馈 ADC 电压数据; - 当串口接收到
55 AA 11
指令时,反馈 ADC 温度数据。
🔮 由此通信协议,设计串口上位机程序,每隔 500 毫秒查询一次数据,并绘制演化曲线,实时监测电压和温度变化情况。
前面板
💡 前面板包括串口配置、仪表盘、演化曲线、保存路径、数组等模块。

操作流程
- 选择串口对应的设备端口号,设置波特率;
- 点击左上角箭头按钮,运行程序,设置数据采集保存文档的路径;
- 点击 START 按钮,开始采集数据和实时监测 ADC 电压和温度演化曲线;
- 采集完成后,点击 Stop 按钮结束,同时数据保存至预设路径;
- 点击 Terminate 按钮终止和退出程序。
程序框图
page 1

page 2

效果
🛠️ 程序开始运行后,左侧仪表盘显示实时采集的电压和温度数值,曲线绘制相应的数据点和演化曲线。

数据保存
🎨 数据保存为 dat 格式,其中第 1 列为日期时刻、第 2 列为 ADC 电压值、第 3 列为温度值。

总结
🔋 本文介绍了萤火工场 GD32VW553-IOT 开发板通过串口中断查询的方式采集 ADC 电压及温度转换数据,并进一步结合LabVIEW上位机实现数据自动采集和实时监测的项目设计,为相关嵌入式开发和自动化应用设计提供了参考。