内容
实现功能:GD32F310K通过USART0接收PM传感器串口数据,并发送给ESP8266,ESP8266将此数据发送到PC端。(ESP8266本身有串口可以接收PM传感器数据)
结果表明:GD32F310K在USART使用上仅库函数命名与stm32f103有些不一致,整体方法相似,从stm32f103移植到GD32F310K较容易,可以放心食用,以后用GD32啦~
一.工程建立
1.new project
新建文件夹,建立PM10工程文件
![title= title=](//file.elecfans.com/web2/M00/78/F0/pYYBAGNqCEiAR6abAABDnhWnVMs543.jpg)
选择GD32F310K8
![title= title=](//file.elecfans.com/web2/M00/78/5E/poYBAGNqCEiAGfNrAACGIhaVTcA819.jpg)
在GD32F3x0_Firmware_Library_V2.2.0\Template文件夹中复制主函数、中断、定时器这6个文件
![title= title=](//file.elecfans.com/web2/M00/78/F0/pYYBAGNqCEiAcZAlAABgYR950MI748.jpg)
在items管理中添加这5个组,并添加相应文件,里面的文件在GD32F3x0_Firmware_Library_V2.2.0都有,添加进去就可以了,不用复制
![title= title=](//file.elecfans.com/web2/M00/78/F0/pYYBAGNqCEiAT6KlAAA58pS_Log504.jpg)
添加完成后如图
![title= title=](//file.elecfans.com/web2/M00/78/F0/pYYBAGNqCEiAJ0LQAABb1FIgxrE054.jpg)
注:gd32f310k_start.c文件在GD32310K_START_Demo_Suites\Utilities中
接着对魔术棒内容进行设置,修改编译器版本,选择version5。
![image.png image.png](//file.elecfans.com/web2/M00/78/5E/poYBAGNqCEiAOY5lAACQKi-Y2Jg482.jpg)
修改宏定义、头文件路径(宏定义:USE_STDPERIPH_DRIVER,GD32F310)
![image.png image.png](//file.elecfans.com/web2/M00/78/5E/poYBAGNqCEiAHp3PAACI2SnWQ6Q021.jpg)
debug界面修改如下
![image.png image.png](//file.elecfans.com/web2/M00/78/5E/poYBAGNqCEiAYmlIAABy4UdtzcU140.jpg)
完成配置后可以正常编译
![image.png image.png](//file.elecfans.com/web2/M00/78/5E/poYBAGNqCEiAOsYoAAAhNcgwJzg150.jpg)
接下来编写main.c函数
二.串口通信
首先在GD32F3x0固件库用户指南查找USART库函数说明,如下图所示
![image.png image.png](//file.elecfans.com/web2/M00/78/F0/pYYBAGNqCEiAd7i1AADU8Vnl7UU775.jpg)
硬件上只使用了USART0,TX用来传输信息至ESP8266,RX用来接收PM传感器信息
2.1与PM传感器通信
PM传感器与GD32开发板之间通过USART串口连接
连线方式:
PM2传感器 GD32开发板
TX
VCC
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)
{
usart0_gpio_config();
usart0_config();
while(1)
{
uint8_t res;
if(usart_flag_get(USART0, USART_FLAG_RBNE) != RESET)
{
res =usart_data_receive(USART0);
usart_data_transmit(USART0, res);
}
}
}
void usart0_gpio_config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
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);
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);
}
void usart0_config(void)
{
rcu_periph_clock_enable(RCU_USART0);
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);
}
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;
char serialBuffer[bufferLength];
void setup()
{
Serial.begin(9600);
delay(10);
}
void loop()
{
if (Serial.available())
{
Serial.readBytes(serialBuffer, bufferLength);
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 image.png](//file.elecfans.com/web2/M00/78/F0/pYYBAGNqCEiAeR58AAARVsLgRZ4588.jpg)
原作者:兆易创新GD32 MCU 31号