【PC电脑windows-[jetson-orin-NX]-Linux串口OTA-学习他人文章【ESP32-S2 Linux串口OTA升级】-基础样例学习+复刻】
1、概述
最近想调试一个ESP32串口相关升级,不是http的ota,但是http对自己新手而言有太大了,表示看着费劲,不知道怎么弄才好。
然后在网上看到了一篇【ESP32-S2 Linux串口OTA升级】文章,解决了自己需求吧。
2、实验环境
硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
其它硬件:杜邦线,两个usb-type-c连接线,USB转ttl电平模块。
软件环境:ESP-IDF 5.0 PowerShell 、vscode
3、 物品说明
ESP32对自己来说还是比较新的,最近也是刚刚接触,这里对自己使用ESP32进行简单说明。
博文链接:【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】
另外如果对ESP32相关型号比较感兴趣,可以去官网查看,或者找些资。
官网文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitm-1.html
4-1、参考文章-鸣谢
首先在这里感谢CSDN的博主“李法师_”和文章【ESP32-S2 Linux串口OTA升级】,开始说没有这篇文章,自己新手也不太会做,也就没有本篇文章。
文档连接:https://blog.csdn.net/maomaochong666/article/details/126646135
4-2、自我总结
(1)先做后理解概念
在做这个之前,看了很多资料吧,但是因为没有实际操作,没有人引导你,告诉你怎么做,很多知识,其实很难理解,不知道为啥要说这个。比如在博文说到的分区表,自己开始并不理解。这个我在官网找到原文。
文档链接:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-guides/partition-tables.html添加链接描述
(2)需要了解空中升级(OTA)和分区表这个概念
首先需要了解下,什么时候空中升级(ota),可以直接看官网文档,如下为截图,简单了解下。
文档链接:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-reference/system/ota.html?highlight=ota
自己总结来说:设备在正常运行下的时候,以某种方式(包括不限于,uart,can,http或者其它等等),进行升级固件,升级版本的功能,就叫做ota。
另外需要了解分区表,也是官网文档,如何理解呢。
自己总结来说:分区表,就是官网已经给你定义了分区方式,如果你不用ota,采用一种分区方式(内存分配方式),使用ota,就使用已经给你弄好的分区方式(内存分配方式),你不必自己麻烦分区了。直接往对应位置放就可以了。
文档链接:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-guides/partition-tables.html
当然你说,你自己就要特立独行,也行,可以自定义分区。
(3)理解代码,了解相关功能函数。
自己实际操作一遍后,要反过来理解相关函数,知道每个函数做了什么,为什么能实现相关功能,大致流程要心中有数。
文档链接:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-reference/system/ota.html?highlight=esp_ota_begin
5、本次实验说明
本次实验是使用样例博主“李法师_”的代码,当然不能完全照抄,这边自己在APP端,加入一个串口打印,所以实验分为3个部分:
- 简单串口样例
- 复刻他人的ota程序
- 结合在一起的程序
(1)简单串口样例
我们需要做个简单串口程序,使用调试传进行打印程序,可以使用之前弄好的模板改,也可以重新建立一个。
具体可以看自己之前博文:【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加±基础样例学习】
这里直接将代码放在下面了,不在一步步说了,直接一步到位。
代码链接:https://download.csdn.net/download/qq_22146161/88504364
如下将代码下载后,设置芯片,编译下载如下图。
然后进行验证,注意波特率为115200.
功能描述:使用ESP32的调试串口,收到信息后,发回来。
(2)复刻他人的ota程序
然后就是使用李法师代码了,
如下下载后,应该有如下两个文件夹,一个是升级文件,一个是esp32文件。
window下我们进入OTA相关目录。
1、Windows下操作
(1)下载点后,进入相关目录
(2)设置芯片
这块需要根据自己芯片来进行设置。
idf.py set-target esp32s3
(3)进入菜单模式,选择ota模式
这里需要设置两个部分,一个是flash,一个是ota方式
命令:
idf.py menuconfig
(1)flash
(2)ota模式
退出后保存
(4)编译下载然后复位
(1)编译
idf.py build
(2)下载:实际串口要根据自己串口更换,按住boot键,按一下rst键,然后撒开boot下载。
idf.py -p com6 flash
(3)复位按下rst
如果有类似内容,就代表ESP32设置好。
以下为自己实际调试的时候,收到调试串口消息
以下为博主“李法师_”说明的。
2、Linux 下(jetson orin nx 或者 Linux 环境PC也可以)
(1)编译文件
将其中另一个文件放到Linux下,进行编译下,其实也有了,不编译也行。
gcc download.c -o download2 -pthread
(2)导入升级固件
这块记得原博文提过一次,说只放一个文件。怕冲突还是有其他问题来着。
(3)硬件连接
这块还是要注意一下的,一旦连接有问题,就下不进去。
GPIO6和GPIO7,自己开始作为新手的时候,都不敢确实是这两个标号6和7的,在原博主(“李发师”)指点下确认下,才确定就是这两个。
(1)三根线 RX TX GND
GND --- GND
RX --- GPIO6
TX --- GPIO7
(2)使用串口模块连接
这块我自己没找到转换器,只能暂时借用开发板子的串口模块,但是记得好像那个大串口转换器,需要驱动的,只要是能完成转换,并被Linux 识别到就行。
(4)下载
下载前,要找下串口,看看Linux识别到是否,一般是如下两个设备
/dev/ttyUSB0
/dev/ttyACM0
如下图为查看设备,多了之后,很容易不知道是哪个,比如下面xxAMA0就不是。
命令:
./download2 /dev/ttyUSB0 app_main_ota.bin
3、结合在一起
然后我们将上述代码结合在一起,练习一下,如果加入代码的话,直接在app理解加,不需要在Windows下,重新下载了,但是需要在Windows下编写代码。
(1)vscode 打开代码
(2)编写代码功能
#include "bsp_ota.h"
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#define UART_PORT UART_NUM_0 //选择串口端口
void uart_task(void *pvParameters){
uint8_t data;
while(1){
// printf("this is my——test,helloworld!",data);
// sleep(1);
//从串口读取输入数据
if(uart_read_bytes(UART_PORT,&data,1,pdMS_TO_TICKS(10))>0){
//打印读到的字符
printf("Received:%c\n",data);
}
}
}
void app_main(void)
{
UART_OTA_Init();
// //初始化 USB的串口
// printf("Hello,USB Serial!\n");
// while(1){
// printf("output data:this is my app_usb_uart_test!\n");
// vTaskDelay(pdMS_TO_TICKS(1000));
// }
//配置串口参数
uart_config_t uart_config={
.baud_rate = 9600, /*!< UART baud rate*/
.data_bits = UART_DATA_8_BITS, /*!< UART byte size*/
.parity = UART_PARITY_DISABLE, /*!< UART parity mode*/
.stop_bits = UART_STOP_BITS_1, /*!< UART stop bits*/
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE /*!< UART HW flow control mode (cts/rts)*/
};
uart_param_config(UART_PORT,&uart_config);
uart_set_pin(UART_PORT,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE);
uart_driver_install(UART_PORT,1024,0,0,NULL,0);
//创建串口任务
xTaskCreate(uart_task,"uart_task",2048,NULL,10,NULL);
}
(3)编译
(4)传到Linux
windows下,将app文件转到Linux下
linux 下
(5)升级
(6)功能验证
在windows下验证或者Linux下验证,使用串口软件链接debug串口,如下为win环境验证。
7、代码连接
(1)esp串口样例
代码链接:https://download.csdn.net/download/qq_22146161/88504364
(2)参考文章“李法师_”样例代码
代码链接:https://download.csdn.net/download/qq_22146161/88504657
(3)添加功能后的代码
代码链接:https://download.csdn.net/download/qq_22146161/88504662
8、相关细节
(1)空中升级OTA相关资料
(个人见解)其实本章严格来说,不能完全算是是OTA,ota应该像它定义的那样,空中升级,ESP因为有wifi和蓝牙,所以对它而言,使用http方式,才算是。
这里展示http相关连接,有兴趣可以研究下,不在本章讲解范围。
文档链接:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-reference/system/esp_https_ota.html?highlight=ota
(2)OTA升级与esptool下载的区别。
无论使用你使用那种方式ota,串口也好,http也好,其实只能更新app.bin文件。而esptool下载或编译下载,意味着所以文件都可能更换,bootloader.bin,partition-table.bin和app.bin文件,以下为示意图。
(3)调试串口,不能更改波特率
这块还是很神奇的,记得和jetson orin 的调试串口一样一样的,我这里明明设置了9600波特率,但是实际使用时,用的是115200.
这块暂时不影响调试,应该是有地方可以改动动
或许是(注意:这块暂时不关心,就没去验证)
idf.py menuconfig
如下图,为代码部分设置波特率。
(4)硬件IO接法
这块特意请教了博主“李法师_”,他给画了示意图,当然他说的也可以换。
(5)超时 timeout
如下实际操作是,超时了,基本是线路插错了,没有连接上,检查GPIO6和GPIO7和GND。
(5)代码报错
应该是版本更新,有些函数明发了变化,需要改下。
下边也告诉你如何更改了。
(6)问题:是否可以下载其它工程的app.bin
这个问题也问了原博主,答案是否定的,因为其它app.bin,不带升级程序,所以不能进行相关升级。
9、总结
想着快点写完,一写,加上重新做实验,花了自己3个小时。