31号 · 2022年04月05日

【GD32F310开发板试用】使用USART串口与PM传感器、ESP8266通信

目录:

一. 工程建立
二. 串口通信
三. 结果显示
摘要:第一节对工程建立进行了介绍,第二节包含GD32与ESP8266程序,第三节为PC端上显示内容
实现功能:GD32F310K通过USART0接收PM传感器串口数据,并发送给ESP8266,ESP8266将此数据发送到PC端。(ESP8266本身有串口可以接收PM传感器数据)
结果表明:GD32F310K在USART使用上仅库函数命名与stm32f103有些不一致,整体方法相似,从stm32f103移植到GD32F310K较容易,可以放心食用,以后用GD32啦~

一.工程建立

1.new project
新建文件夹,建立PM10工程文件
 title=
选择GD32F310K8
 title=
在GD32F3x0\_Firmware\_Library\_V2.2.0\Template文件夹中复制主函数、中断、定时器这6个文件
 title=
在items管理中添加这5个组,并添加相应文件,里面的文件在GD32F3x0\_Firmware\_Library\_V2.2.0都有,添加进去就可以了,不用复制
 title=
添加完成后如图
 title=
注:gd32f310k\_start.c文件在GD32310K\_START\_Demo\_Suites\Utilities中
接着对魔术棒内容进行设置,修改编译器版本,选择version5。
image.png
修改宏定义、头文件路径(宏定义:USE_STDPERIPH_DRIVER,GD32F310)
image.png
debug界面修改如下
image.png
完成配置后可以正常编译
image.png
接下来编写main.c函数

二.串口通信

首先在GD32F3x0固件库用户指南查找USART库函数说明,如下图所示
image.png
硬件上只使用了USART0,TX用来传输信息至ESP8266,RX用来接收PM传感器信息

2.1与PM传感器通信

PM传感器与GD32开发板之间通过USART串口连接
连线方式:

PM2传感器        GD32开发板
    TX    ---       RX(PA10)
   VCC    ---       5V
   GND    ---       GND

此函数基于官网例程进行修改,并删除了部分说明,详见GD32F3x0_Firmware_Library_V2.2.0\Examples\USART\Printf
main.c

#include "gd32f3x0.h"
#include <stdio.h>      
void usart0_gpio_config(void);
void usart0_config(void);

int main(void)
{
    /* initilize the com */
    usart0_gpio_config();
    usart0_config();

    while(1)
    {
        uint8_t res;
        //读数据缓冲区非空标志,发送中为SET,发送完成为RESET
        if(usart_flag_get(USART0, USART_FLAG_RBNE) != RESET)
        {     
             res =usart_data_receive(USART0);//接收PM传感器数据    
             usart_data_transmit(USART0, res);//发送数据至ESP8266
        }
    }
}
//GPIO初始化
void usart0_gpio_config(void)
{
    /* enable COM GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);

    /* connect port to USARTx_Tx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);

    /* connect port to USARTx_Rx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);

    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);
}
//USART0初始化
void usart0_config(void)
{
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);

    /* USART configure */
    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, 9600U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

    usart_enable(USART0);
}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t) ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}

2.2与ESP8266通信

ESP8266与GD32开发板之间通过USART串口连接
连线方式:

ESP8266        GD32开发板
RX(GPIO3)  --- TX(PA9)

main.ino

const int bufferLength = 32;    // 定义缓存大小为32个字节
char serialBuffer[bufferLength];// 建立字符数组用于缓存

void setup() 
{
  Serial.begin(9600);
  delay(10);
}

void loop() 
{
  // 当串口接收到信息后
  if (Serial.available())
  { 
    //将接收到的信息使用readBytes读取
    Serial.readBytes(serialBuffer, bufferLength);
    //通过串口监视器输出readBytes
    for (int i = 0; i < bufferLength; i++) 
    {
      Serial.print(serialBuffer[i], HEX);//输出读取的信息
      Serial.print(",");
    }
    int PM1 = serialBuffer[10] * 256 + serialBuffer[11];
    int PM2_5 = serialBuffer[12] * 256 + serialBuffer[13];
    int PM10 = serialBuffer[14] * 256 + serialBuffer[15];
    Serial.println("");
    Serial.print("PM1.0 = ");
    Serial.print(PM1);
    Serial.println("ug/m3");

    Serial.print("PM2.5 = ");
    Serial.print(PM2_5);
    Serial.println("ug/m3");

    Serial.print("PM10 = ");
    Serial.print(PM10);
    Serial.println("ug/m3");
  }
  delay(1000);
}

三.结果显示

在串口助手上显示GD32读取到的PM传感器数据,第一行为GD32发送的十六进制数据,第二三四行为ESP8266对数据转换后的输出
image.png

结论:GD32好用,爱了爱了,路转粉^__^

推荐阅读
关注数
10694
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息