05.ESP01s开发环境的配置以及和立创梁山派GD32建立通信

  • 此系列文章源于SYSU 2024电信学院通信工程专业工训课的训练题目,同时也是2024电子设计校内赛的题目。题目的要求描述如下:
    无线手持二维码识别器是一个通过图像识别技术,对二维码图片进行识别,并解析出二维码的内容数据,并通过无线传输给手机或电脑的一种设备,通过这个设备,可以快速对物品进行扫描并在电脑端进行归档。要求能够对二维码图片进行扫描,二维码可自行生成,源信息包含字母和数字,能够支持将扫描数据上传到电脑,并在电脑端设计上位机进行数据显示,能够支持识别特殊二维码时,进行报警鸣叫处理,同时要使用3D建模软件对识别器进行建模并制作,大小符合手持。
  • 项目使用的主控为立创梁山派GD32F470ZGT6,项目源码存放地址为https://github.com/liangbm3/GD32_QR_Decoder
  • 此系列文章更多的是对开发过程的记录和思路的呈现,文章分则可以作为教程实现单个功能,合则可以作为复现整个项目的教程。
  • 文章的撰写部分参考了立创官方文档
  • 文章未经作者许可,不得转载。


前言

由于需要将识别的结果传输到上位机,这里使用ESP01s模块,开发方式选择Arduino+VScode+PlatformIO。同时GD32和ESP01s之间采用串口通讯。


一、相关知识介绍

1.ESP01s模块的介绍

(1)简介

在这里插入图片描述

ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266EX的低功耗UART-WiFi芯片模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。

模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。

ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能。
  在这里插入图片描述

(2)管脚定义

在这里插入图片描述
为了方便烧录,可以购买esp01s烧录模块,也可以使用usb转ttl模块,引脚连线如下

USB转TTL模块ESP01S模块
3V33V3
GNDGND
RXTX
TXRX
EN(接高电平)
IO0(下载时下拉,运行时上拉)

2.Arduino介绍

Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。我们这里指的是ArduinoIDE

由于该模块使用的是乐鑫的esp8266芯片,而乐鑫公司为esp系列芯片添加了对arduino开发环境的支持,允许使用熟悉的 Arduino 函数和库编写 sketches,并直接在 ESP8266 上运行,无需外部微控制器。

由于使用ESP-IDF开发需要复杂的环境配置和各种接口函数,使用AT指令开发需要学习各种AT指令,且开发过程不方便。使用Arduino开发ESP01S则可以避免上述情况,更加方便快捷。

3.PlatformIO介绍

PlatformIO是一款开源的跨平台嵌入式开发环境,为嵌入式开发者提供了一种更加便捷和高效的开发解决方案。它支持多种主流嵌入式平台和开发板,提供了丰富的开发工具和库,并且具备强大的生态系统和社区支持。

PlatformIO 是独立于平台运行的,实际上它只依赖于 python,然而 python 在 macOS、linux 和 windows 都能完美适配. 也就是说 PlatformIO 的工程从一个电脑很容易迁移到另一个电脑,只需要拷贝再使用 PlatformIO 就能完美打开,不管团队中的成员使用什么操作系统 PlatformIO 可以让工程共享变得异常简单. 除此之外, PlatformIO 不仅可以在笔记本和台式机上运行,同样可以运行在没有显示桌面的服务器。PlatformIO 的核心(PlatformIO Core) 就是一个终端程序, 它能配合您喜欢的多款云 IDE、桌面 IDE 或者 通用代码编辑器构建 PlatformIO 的 IDE,比如 Atom, CLion, Eclipse, Emacs, NetBeans, Qt Creator, Sublime Text, VIM, Visual Studio, VSCode 等等。目前官方推荐的 IDE 使用方案就是 VSCode + PlatformIO IDE 插件。

二、Arduino+VScode+PlatformIO开发环境的配置

(1)安装软件

1.下载ArduinoIDE,下载地址:https://www.arduino.cc/en/software

我下载的是1.8.x版本的,如图
在这里插入图片描述
2.下载安装完成后,系统应该会自动添加环境变量,如果没有则自己添加,如图
在这里插入图片描述
3.在vscode中安装PlatformIO插件,安装完成后的界面如下
在这里插入图片描述

(2)创建工程

1.点击New Project,根据所用的模块选择合适的开发板,如图
在这里插入图片描述
2.等待一段时间后工程创建完成,在src文件夹下找到main.cpp
在这里插入图片描述
3.在下方找到√图形,点击进行编译,再点击➡进行烧录

在这里插入图片描述
如图,烧录完成,环境配置成功

三、ESP01S与GD32的串口通讯

这个实现的思路也很简单,对于GD32,配置与前面的所讲的类似;对于ESP01s,可以用Arduino中的串口发送函数和串口接收函数。只需在两者之间指定一定的通信规则即可,这里指定回车位一条字符串的结尾。

1.ESP01S串口通信的编写

#include <Arduino.h>

String inputString = "";        // 定义一个字符串用来接收
boolean stringComplete = false; // 一条字符串接收完成的标志位

void serialEvent();
void setup()
{
    Serial.begin(115200);
    Serial.println("esp01s初始化成功!");
}
void loop()
{
    if (stringComplete)
    {
        Serial.println("esp01s接收到字符串:");
        Serial.println(inputString);
        inputString = "";
        stringComplete = false;
    }
    delay(20);
    serialEvent();
}

/************************************************
 * @brief : 串口事件函数,在该函数中实现串口接收字符串
 * @date : 2024-05-19
 *************************************************/
void serialEvent()
{
    while (Serial.available() > 0)//当缓冲区有接收到数据时
    {
        char inChar = Serial.read();//读取一个字符
        inputString += inChar;//加到字符串中
        if (inChar == '\n')//当读到回车,说明该字符串发送完成
        {
            stringComplete = true;
        }
    }
}

2.GD32串口通信的编写

通过查看数据手册,如图
在这里插入图片描述

选择PB10和PB11端口作为串口通讯端口,所用的是USART2,引脚复用位AF7,配置流程可以参考之前的文章,关键代码如下
头文件部分

#define ESP_USART_TX_RCU  RCU_GPIOD
#define ESP_USART_RX_RCU  RCU_GPIOD
#define ESP_USART_TX_PORT GPIOD
#define ESP_USART_RX_PORT GPIOD
#define ESP_USART_TX_PIN  GPIO_PIN_8
#define ESP_USART_RX_PIN  GPIO_PIN_9
#define ESP_USART_RCU     RCU_USART2
#define ESP_USART_RECEIVE_LENGTH  4096
extern uint8_t esp_g_recv_buff[ESP_USART_RECEIVE_LENGTH];
extern uint16_t esp_g_recv_length;
extern uint8_t esp_g_recv_complete_flag; 

实现文件部分
变量的定义:

uint8_t esp_g_recv_buff[ESP_USART_RECEIVE_LENGTH];
uint16_t esp_g_recv_length;
uint8_t esp_g_recv_complete_flag;

初始化函数:

void esp_usart_gpio_config(uint32_t band_rate)
{
    /* 开启时钟 */
    rcu_periph_clock_enable(ESP_USART_TX_RCU);
    rcu_periph_clock_enable(ESP_USART_RX_RCU);
    rcu_periph_clock_enable(ESP_USART_RCU);

    /* 配置GPIO复用功能 */
    gpio_af_set(ESP_USART_TX_PORT, ESP_USART_AF, ESP_USART_TX_PIN);
    gpio_af_set(ESP_USART_RX_PORT, ESP_USART_AF, ESP_USART_RX_PIN);

    /* 配置GPIO的模式 */
    /* 配置TX为复用模式 上拉模式 */
    gpio_mode_set(ESP_USART_TX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, ESP_USART_TX_PIN);
    /* 配置RX为复用模式 上拉模式 */
    gpio_mode_set(ESP_USART_RX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, ESP_USART_RX_PIN);

    /* 配置TX为推挽输出 50MHZ */
    gpio_output_options_set(ESP_USART_TX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, ESP_USART_TX_PIN);
    /* 配置RX为推挽输出 50MHZ */
    gpio_output_options_set(ESP_USART_RX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, ESP_USART_RX_PIN);

    /* 配置串口的参数 */
    usart_deinit(ESP_USART);                         // 复位串口
    usart_baudrate_set(ESP_USART, band_rate);        // 设置波特率
    usart_parity_config(ESP_USART, USART_PM_NONE);   // 无校验位
    usart_word_length_set(ESP_USART, USART_WL_8BIT); // 8位数据位
    usart_stop_bit_set(ESP_USART, USART_STB_1BIT);   // 1位停止位

    /* 使能串口 */
    usart_enable(ESP_USART);
    usart_transmit_config(ESP_USART, USART_TRANSMIT_ENABLE); // 使能发送
    usart_receive_config(ESP_USART, USART_RECEIVE_ENABLE);   // 使能接收

    nvic_irq_enable(USART2_IRQn, 2, 2);            // 配置中断优先级
    usart_interrupt_enable(ESP_USART,USART_INT_RBNE);//非空中断
    usart_interrupt_enable(ESP_USART, USART_INT_IDLE); // 空闲检测中断,在一帧数据传输完成后触发中断
}

空闲中断:

void USART2_IRQHandler(void)
{
    if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_RBNE) == SET)   // 接收缓冲区不为空
	{
		esp_g_recv_buff[esp_g_recv_length++] = usart_data_receive(ESP_USART);      // 把收到的数据放在缓冲区中
	}
	
	if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_IDLE) == SET)   // 检测到帧中断
	{
		usart_data_receive(ESP_USART);                                     // 必须读,读出来的值不能要
		esp_g_recv_buff[esp_g_recv_length] = '\0';																 // 数据接收完毕,数组结束标志
		esp_g_recv_complete_flag = 1;                                          // 接收完成
	}
}

发送一个字节的函数:

void esp_usart_send_data(uint8_t ucch)
{
    usart_data_transmit(ESP_USART, (uint8_t)ucch);
    while (RESET == usart_flag_get(ESP_USART, USART_FLAG_TBE))
        ;
}

发送字符串函数:

void esp_send_string(uint8_t *ucstr)
{
    while (ucstr && *ucstr)
    {
        usart_send_data(*ucstr++);
    }
    usart_send_data('\n');
}

3.进行测试

将上述ESP01s的程序编译烧录进ESP01s后,ESP01s的RX引脚接GD32的PB10,ESP01s的TX引脚接GD32的PB11。GD32的测试程序如下

int main()
{
	usart_gpio_config(115200);
	esp_usart_gpio_config(115200);
	dma_config();
	systick_config();
	while (1)
	{
		delay_1ms(1000);
		if (g_recv_complete_flag)
		{
			g_recv_complete_flag = 0;
			printf("字节长度:%d ", g_recv_length);
			printf("内容:%s\r\n", g_recv_buff);
			memset(g_recv_buff, 0, g_recv_length);
			g_recv_length = 0;
		}
		if (esp_g_recv_complete_flag)
		{
			esp_g_recv_complete_flag = 0;
			printf("收到esp01s的字节长度:%d ", esp_g_recv_length);
			printf("收到esp01s内容:%s\r\n", esp_g_recv_buff);
			memset(esp_g_recv_buff, 0, esp_g_recv_length);
			esp_g_recv_length = 0;
		}
		esp_send_string("发送命令");
	}
}

测试结果如下在这里插入图片描述


本移植代码在我的二维码识别项目的USART分支下,源码发布地址:https://github.com/liangbm3/GD32_QR_Decoder/releases/tag/USART
如果觉得文章有帮助,请点赞收藏关注

  • 41
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值