赞
踩
最为新手,想要快速入门相关设备,比如ESP32,可能最好的方式就是直接手动去敲一遍代码,而串口算是单片机入门中,必不可少的一个基础课程,很多通讯,以及打印各种信息,都需要,而加入一些交互,能让我们更好调试单片机。
我打算出3章,像之前STM32那种单片机,调试串口一样。
本次第二章张,就是要结合GPIO,对ESP32上的IO做简单控制。
第一章,也就是串口基础篇,简单调试ESP32,进行交互。
第二章,将会结合GPIO,进行一些简单外围控制。
第三章,将会结合上位机,使用自制上位机进行联合调试。
ESP32说明:ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
调试环境:Windows下
串口工具:USB转串口TTL/232等
其他硬件:逻辑分析仪,杜邦线,两个usb-type-c连接线等。
有了调试串口的经验,再加上调试IO的经验,其实我们就很容易合在一起,就像那个很有意思的笑话,苹果的英文单词和笔的因为单词,组合在一起的就是笔记本了。
如下,请允许我在原本应该严肃的科技博文中,加入一个搞笑的部分。
但是这个道理是相通的,我们学习一个东西的时候,其实一块一块学的,或者说以小见大。
举个例子,我们之前学习了ESP32的串口,
【PC电脑windows编写代码-学习uart0串口编写代码-串口程序-ESP32-简单通讯交互-基础样例学习】
同时又做了ESP32的IO实验,
【PC电脑windows-学习样例generic_gpio-拓展GPIO-ESP32的GPIO程序-问题解决-GPIO输出实验-基础样例学习(2)】
那么现在组合起来就可以了。
也就有了本次实验,以及这篇文章。
找个空白工厂,或者复制一个,相关可以看一下工程。
不过本次是依照下面文章,继续做的实验,不会调试串口的小伙伴,可以想看这个。
【PC电脑windows编写代码-学习uart0串口编写代码-串口程序-ESP32-简单通讯交互-基础样例学习】
代码链接:https://download.csdn.net/download/qq_22146161/88666274
编写代码,如下,将主要代码直接放在下面。
#include <stdio.h> #include <stdbool.h> #include <unistd.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #include "string.h" #include "driver/gpio.h" #define TX_PIN 18 #define RX_PIN 19 #define BUF_SIZE 1024 const char *expected_string0 = "990"; const char *expected_string1 = "991"; const char *expected_string2 = "992"; const char *expected_string3 = "993"; const char *expected_string4 = "994"; const char *expected_string5 = "995"; const char *expected_string6 = "996"; #define GPIO_OUTPUT_IO_0 35 #define GPIO_OUTPUT_IO_1 36 #define GPIO_OUTPUT_IO_2 37 #define GPIO_OUTPUT_IO_3 38 #define GPIO_OUTPUT_PIN_SEL ((1ULL<<GPIO_OUTPUT_IO_0) |(1ULL<<GPIO_OUTPUT_IO_1) | (1ULL<<GPIO_OUTPUT_IO_2) | (1ULL<<GPIO_OUTPUT_IO_3)) // 配置GPIO_OUT位寄存器 void gpio_init(void) { gpio_config_t io_conf; // 定义一个gpio_config类型的结构体,下面的都算对其进行的配置 io_conf.intr_type = GPIO_INTR_DISABLE; // 禁止中断 io_conf.mode = GPIO_MODE_OUTPUT; // 选择输出模式 io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器 io_conf.pull_down_en = 0; // 禁止下拉 io_conf.pull_up_en = 1; // 禁止上拉 gpio_config(&io_conf); // 最后配置使能 } void app_main(void) { gpio_init(); // 配置UART参数 uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; uart_param_config(UART_NUM_0, &uart_config); // 设置UART1使用的TX和RX引脚 uart_set_pin(UART_NUM_0, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); // 安装UART驱动程序,使用默认缓冲区大小 uart_driver_install(UART_NUM_0, BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, 0); // 发送和接收数据的缓冲区 uint8_t *data = (uint8_t *)malloc(BUF_SIZE); const char *test_str0 = "write_this_is_990"; const char *test_str1 = "write_this_is_991"; const char *test_str2 = "write_this_is_992"; const char *test_str3 = "write_this_is_993"; const char *test_str4 = "write_this_is_994"; const char *test_str5 = "write_this_is_995"; const char *test_str6 = "write_this_is_996"; while (1) { // 发送数据 const char *test_str = "Hello from UART01!"; uart_write_bytes(UART_NUM_0, test_str, strlen(test_str)); // 从UART接收数据 int length = 0; ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM_0, (size_t *)&length)); length = uart_read_bytes(UART_NUM_0, data, length, 20 / portTICK_PERIOD_MS); if (length > 0) { data[length] = 0; // 确保字符串以null终止 printf("Received data: '%s'\n", (char *)data); //控制第一个IO上下 if(strstr ((const char *)data, expected_string0)!=NULL ) { gpio_set_level(GPIO_OUTPUT_IO_0, 1); // 把这个GPIO输出地高平 vTaskDelay(1000 / portTICK_PERIOD_MS); printf("this is 990!"); // break; } if(strstr ((const char *)data, expected_string1) !=NULL ) { uart_write_bytes(UART_NUM_0, test_str1, strlen(test_str1)); gpio_set_level(GPIO_OUTPUT_IO_0, 0); // 把这个GPIO输出低电平 printf("this is 991!"); // break; } //控制第二个IO上下 if(strstr ((const char *)data, expected_string2)!=NULL ) { uart_write_bytes(UART_NUM_0, test_str2, strlen(test_str2)); gpio_set_level(GPIO_OUTPUT_IO_1, 1); // 把这个GPIO输出高电平 printf("this is 992!"); // break; } if(strstr ((const char *)data, expected_string3)!=NULL ) { uart_write_bytes(UART_NUM_0, test_str3, strlen(test_str3)); gpio_set_level(GPIO_OUTPUT_IO_1, 0); // 把这个GPIO输出低电平 printf("this is 993!"); // break; } //控制第三个IO上下 if(strstr ((const char *)data, expected_string4)!=NULL ) { uart_write_bytes(UART_NUM_0, test_str4, strlen(test_str4)); gpio_set_level(GPIO_OUTPUT_IO_2, 1); // 把这个GPIO输出高电平 printf("this is 994"); // break; } if(strstr ((const char *)data, expected_string5)!=NULL ) { uart_write_bytes(UART_NUM_0, test_str5, strlen(test_str5)); gpio_set_level(GPIO_OUTPUT_IO_2, 0); // 把这个GPIO输出低电平 printf("this is 995!"); // break; } //单独功能 if(strstr ((const char *)data, expected_string6)!=NULL ) { uart_write_bytes(UART_NUM_0, test_str6, strlen(test_str6)); //gpio_set_level(GPIO_OUTPUT_IO_2, 0); // 把这个GPIO输出低电平 printf("this is 996!"); // break; } } vTaskDelay(2000 / portTICK_PERIOD_MS); } }
下载完了按下复位
这里使用逻辑分析仪,接4个引脚 35-36-37-38。
(1)串口软件输入
(2)逻辑分析仪抓取波形
(1)串口输入
(2)波形抓取
(1)验证1-GPIO37
(2)验证2-GPIO36
代码链接:https://download.csdn.net/download/qq_22146161/88678030
调试单片机的时候,或者说调试串口的时候,其实很难问题穷尽,但是一些方式,可以帮我们更快定位。
为了解决这个问题,可以尝试以下步骤:
感觉ESP无法下载都可以单独出一篇文章里,今天又发现无法下载的一个样例。
和USB转换TTL转换器,相互冲突,这就很神奇。
解决方式: 先拔掉串口转换器
我有一个苹果,我有一个钢笔,组合在一起就是苹果笔~~!!。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。