【智能网络台灯】10. Esp32-S2驱动UART
[复制链接]
本帖最后由 hehung 于 2022-10-12 22:10 编辑
过往分享
【2022得捷电子创新设计大赛】最晚开箱帖
【2022得捷电子创新设计大赛】1. ESP32-S2环境搭建及点灯
【智能网络台灯】2. 设置系统时间以及打印
【智能网络台灯】3. ESP32-S2 + lvgl使用
【智能网络台灯】4. ESP32-S2 板载按键使用
【智能网络台灯】5. ESP32-S2 使用sntp进行网络校时
【智能网络台灯】6. ESP32-S2解决RAM空间开销过大的问题
【智能网络台灯】7. 获取实时天气信息并解析
【智能网络台灯】8. Maix bit驱动RGB
【智能网络台灯】9. Maix bit驱动串口
前言
上一篇帖子讲解了使用Maix Bit来驱动UART,为了和ESP32-S2进行通信,ESP32-S2也需要驱动UART,之后两个板子的串口连接在一起,共地之后就可以正常通信了。
本帖讲解如何使用ESP32-S2来驱动UART。
硬件连接
通过查看ESP32-S2手册可知,UART可以在任何端口上使用,如下图所示
因为ESP32-S2的相机我并不会使用,所以我就使用GPIO4来作为TX,GPIO5作为RX。
还是和上一篇帖子一样使用USB-TTL来做调试,连接如下:
USB-TTL ESP32-S2
RX GPIO4
TX GPIO5
代码实现
代码实现,创建一个任务用来接收串口的数据,然后将接收的数据在发送出去,实现如下:
注意:main入口需要调用Uart_TaskInit先初始化UART任务。
/*
* app_uart.c
*
* Created on: 2022年10月11日
* Author: hehung
*/
#include "app_uart.h"
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp_log.h"
#define TAG ("app_uart")
#define UART_TXD (4)
#define UART_RXD (5)
#define UART_RTS (UART_PIN_NO_CHANGE)
#define UART_CTS (UART_PIN_NO_CHANGE)
#define UART_PORT_NUM (1)
#define UART_BUAD_NUM (115200)
#define UART_BUF_SIZE (1024)
//任务优先级
#define UART_TASK_PRIO (3U)
//任务堆栈大小 (单位为字,在32位处理器下,一个字等于4个字节)
#define UART_TASK_SIZE (1024U)
//任务句柄
static TaskHandle_t Uart_TaskHandle;
static void Uart_TaskCtrl(void *pvParameters);
// 设置一个初始的时间
void Uart_TaskInit(void)
{
portBASE_TYPE xReturn = pdPASS;
xReturn = xTaskCreatePinnedToCore(&Uart_TaskCtrl,
"Uart_task",
UART_TASK_SIZE,
NULL,
UART_TASK_PRIO,
Uart_TaskHandle,
CONFIG_ESP_MAIN_TASK_AFFINITY);
if(pdPASS != xReturn)
ESP_LOGE(TAG, "Button task create failed!");
}
static void Uart_TaskCtrl(void *pvParameters)
{
/* Configure parameters of an UART driver,
* communication pins and install the driver */
uart_config_t uart_config = {
.baud_rate = UART_BUAD_NUM,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_APB,
};
int intr_alloc_flags = 0;
#if CONFIG_UART_ISR_IN_IRAM
intr_alloc_flags = ESP_INTR_FLAG_IRAM;
#endif
ESP_ERROR_CHECK(uart_driver_install(UART_PORT_NUM, UART_BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags));
ESP_ERROR_CHECK(uart_param_config(UART_PORT_NUM, &uart_config));
ESP_ERROR_CHECK(uart_set_pin(UART_PORT_NUM, UART_TXD, UART_RXD, UART_RTS, UART_CTS));
// Configure a temporary buffer for the incoming data
uint8_t *data = (uint8_t *) malloc(UART_BUF_SIZE);
while (1)
{
// Read data from the UART
int len = uart_read_bytes(UART_PORT_NUM, data, UART_BUF_SIZE, 20 / portTICK_RATE_MS);
// Write data back to the UART
uart_write_bytes(UART_PORT_NUM, (const char *) data, len);
}
}
效果展示
如下图为实验结果,接下来就是两个板子串接起来就可以实现通信了。
|