【萤火工场GD32VW553-IOT开发板】ADC电压表应用指南

【萤火工场GD32VW553-IOT开发板】ADC电压表

🔋 介绍了萤火工场GD32VW553-IOT开发板实现 ADC 采集并实现电压值转换和串口打印的项目设计流程。

硬件连接

  • RXD -> PB15
  • TXD -> PA8
  • 3V3 -> VCC
  • GND -> GND
  • 示意图

    USART

    💡 通过 USART0 测试串口通信功能。

    工程创建

  • 运行 Embedded Builder 软件,FileNewProject ...

  • 选择 C/C++C Project – 点击 Next ;

  • 设置工程名称、工程路径,目标设备选择 GD32VW553HMQ7 ,点击 Finished 完成工程创建。

  • 工程代码

    📊 打开 src/main.c 文件,修改代码如下

    #include "gd32vw55x.h"
    #include "systick.h"
    #include <stdio.h>
    #include "main.h"
    #include "gd32vw553h_eval.h"
    
    void com_usart_init(void);
    
    void led_spark(void){}
    
    int main(void)
    {
        /* initialize the COM */
        com_usart_init();
        while(1)
        {
        	printf("Hello World!\n\r");
        	delay_1ms(1);
        }
    }
    
    /*!
        \brief      initialize the USART configuration of the COM
        \param[in]  none
        \param[out] none
        \retval     none
    */
    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);
    }
    

    代码参考官方 Demo 例程 GD32VW55x_Firmware_Library_V1.2.0\Examples\USART\Printf .

    🔎 保存代码,编译工程,生成 Debug 文件夹,右键 bin 文件 – Show InSystem Explorer ,打开文件夹并获得 *.bin 固件。

    固件上传

    📡 采用 ISP 方式上传固件至开发板。

  • 将 BOOT0 拉高,USB 转 TTL 工具连接开发板;

  • 运行 GD32 All-In-One Programmer 软件;

  • 设备端口选择、串口参数设置,设备名称选择 GD32VW553HMQ7 ,点击 Connect 按钮(若连接失败,则短按复位键);

  • 加载镜像固件、设置起始地址,点击 Download 按钮;

  • 待加载完成,跳帽恢复,将 BOOT0 拉低;

  • 短按 RST 复位键,程序开始运行。

  • 效果演示

    📡 打开串口调试助手,配置串口参数,打开串口,即可观察到串口输出文本。

    ADC电压采集

    💡 在实现 USART 串口通信的基础上,进一步介绍了 ADC 采集电压数据并串口打印的项目设计。

    工程创建

  • 运行 Embedded Builder 软件,FileNewProject ...

  • 选择 C/C++C Project – 点击 Next ;

  • 设置工程名称、工程路径,目标设备选择 GD32VW553HMQ7 ,点击 Finished 完成工程创建。

  • 工程代码

    🎻 打开 src/main.c 文件,修改代码如下

    #include "gd32vw55x.h"
    #include "systick.h"
    #include <stdio.h>
    #include "main.h"
    #include "gd32vw553h_eval.h"
    
    float temperature;
    float vref_value;
    uint16_t adc_value[2];
    
    void rcu_config(void);
    void adc_config(void);
    void dma_config(void);
    
    void led_spark(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);
        while(1){
    
            /* value convert */
            temperature = (1.43f - adc_value[0]*3.3f/4096) * 1000 / 4.3f + 25;
            vref_value = (adc_value[1] * 3.3f / 4096);
    
            printf("ADC Voltage: %5.3f V, Temperature: %2.2f ℃\r\n", (double)vref_value, (double)temperature);
    
            delay_1ms(500);
        }
    }
    
    /*!
        \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);
    }
    

    代码参考官方 Demo 例程 GD32VW55x_Firmware_Library_V1.2.0\Examples\ADC\temperature_Vref_Vbat .

    🍟 保存代码,编译工程,生成 Debug 文件夹,右键 bin 文件 – Show InSystem Explorer ,打开文件夹并获得 *.bin 固件。

    固件上传

    📡 采用 ISP 方式上传固件至开发板。

  • 将 BOOT0 拉高,USB 转 TTL 工具连接开发板;

  • 运行 GD32 All-In-One Programmer 软件;

  • 设备端口选择、串口参数设置,设备名称选择 GD32VW553HMQ7 ,点击 Connect 按钮(若连接失败,则短按复位键);

  • 加载镜像固件、设置起始地址,点击 Download 按钮;

  • 待加载完成,跳帽恢复,将 BOOT0 拉低;

  • 短按 RST 复位键,程序开始运行。

  • 效果演示

    🎨 打开串口调试助手,配置串口参数,打开串口,即可观察到串口输出文本。

    🛠️ 动态效果

    总结

    🧵 介绍了萤火工场GD32VW553-IOT开发板实现 ADC 采集并实现电压值转换和串口打印的项目设计流程,为相关应用的开发和设计提供了参考。

    作者:无垠的广袤

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【萤火工场GD32VW553-IOT开发板】ADC电压表应用指南

    发表回复