ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

yangyang
Posts: 7
Joined: Mon Jun 06, 2022 7:09 am

ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby yangyang » Mon Jun 06, 2022 10:08 am

[/Codebox]是这样的,有个问题困扰了我很久,就是我将(图0)
0.png
0.png (1.16 KiB) Viewed 8920 times
这个HTTP OTA升级的程序移植到我的程序当中,但是我把HTTP通讯拿到数据的方式移植成了UART通讯方式,首先我使用(图1)
1.png
1.png (86.69 KiB) Viewed 8920 times
这些用来获取下一个OTA分区信息,在第一包的校验的时候已经校验过了,开始ota_begin(图2)
2.png
2.png (29.56 KiB) Viewed 8920 times
,然后再一包一包的写入,在写入完成之后参照例程的进行结束(图3)
,在写入之后校验也通过了显示reset cpu(图4)
,但是他没有自动重启,于是我给他手动重启之后,它是这样显示的(图5)
,具体问题显示说校验失败和没有boot(图6)
,我也搞不懂到底是什么原因,我在网上也找了很久关于这个,也没有结果,分区表我是给他这样分配的(图7)
,我使用的是ESP32S3 idf4.4版本
不知道当中写入得时候有一些什么奥妙,我该怎么去解决呢

ESP_Yake
Posts: 109
Joined: Mon Mar 06, 2017 12:23 pm

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby ESP_Yake » Tue Jun 07, 2022 2:19 am

你的很多图看不到,但是你说 “具体问题显示说校验失败和没有boot” 我怀疑问题就跟这个有关,你可以试一下从flash读出来这个分区的数据,然后和下载的数据对比一下,如果数据不匹配说明数据传输有问题

yangyang
Posts: 7
Joined: Mon Jun 06, 2022 7:09 am

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby yangyang » Tue Jun 07, 2022 2:22 am

3.png
3.png (68.92 KiB) Viewed 8880 times
4.png
4.png (75.28 KiB) Viewed 8880 times
5.png
5.png (247.17 KiB) Viewed 8880 times

yangyang
Posts: 7
Joined: Mon Jun 06, 2022 7:09 am

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby yangyang » Tue Jun 07, 2022 3:09 am

ESP_Yake wrote:
Tue Jun 07, 2022 2:19 am
你的很多图看不到,但是你说 “具体问题显示说校验失败和没有boot” 我怀疑问题就跟这个有关,你可以试一下从flash读出来这个分区的数据,然后和下载的数据对比一下,如果数据不匹配说明数据传输有问题
我不太理解这个底层,我在想的是idf在往分区表分配的地址里面写东西的时候是把升级包从分区表分配的首地址从头到尾的写还是说,有一定规律的呢,比如说我在往ota1分区写升级程序的时候,idf就会把里面分成几个区,然后朝各个分区里面写不同的信息,如果是从头到尾写的话,那我是否是可以直接从0x00220000地址读取2M字节的数据然后跟写入文件的数据作为比对呢
10.png
10.png (595.61 KiB) Viewed 8832 times
,在询问axk官方人员的时候,人家跟我讲说在uart升级的时候无法写入一些校验信息,所以导致校验无法通过从而导致uart升级不行,但是这个时候我就不知道具体如何实现了

yangyang
Posts: 7
Joined: Mon Jun 06, 2022 7:09 am

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby yangyang » Wed Jun 08, 2022 10:05 am

显示写入字节是没错的
11.png
11.png (313.7 KiB) Viewed 8829 times
,写入也成功了,在手动重启之后显示另外一个分区也有标记,但是说是一些信息丢失,导致不切换
12.png
12.png (355.57 KiB) Viewed 8829 times

yangyang
Posts: 7
Joined: Mon Jun 06, 2022 7:09 am

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby yangyang » Thu Jun 09, 2022 6:13 am

尝试写入300k的程序包,可以升级成功,但是换成1M多的程序就会显示校验过不了

ESP_Yake
Posts: 109
Joined: Mon Mar 06, 2017 12:23 pm

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby ESP_Yake » Thu Jun 09, 2022 6:29 am

没有关系的,如何读取 flash 参考我们 esp_tool 的文档: https://docs.espressif.com/projects/esp ... read-flash
这个问题跟签名没有关系,因为 HTTP 下载的和UART传输的没有区别,问题在于 UART 传输没有使用硬件流控的话容易出现 FIFO溢出的情况,而你那个错误看看像是固件有错误导致的。

yangyang
Posts: 7
Joined: Mon Jun 06, 2022 7:09 am

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby yangyang » Thu Jun 09, 2022 6:42 am

ESP_Yake wrote:
Thu Jun 09, 2022 6:29 am
没有关系的,如何读取 flash 参考我们 esp_tool 的文档: https://docs.espressif.com/projects/esp ... read-flash
这个问题跟签名没有关系,因为 HTTP 下载的和UART传输的没有区别,问题在于 UART 传输没有使用硬件流控的话容易出现 FIFO溢出的情况,而你那个错误看看像是固件有错误导致的。
您好,我检查了一下写入数据的最后的一包的数据和写入的字节数都是跟源文件相同的,这应该证明数据是没有问题的,
13.png
13.png (320.14 KiB) Viewed 8783 times
这次的升级校验虽然失败了,但是之前是有成功过的,
4.png
4.png (75.28 KiB) Viewed 8783 times
,我上午在升级了一个大概三百K大小的包的时候就成功了,当时还连续升级了几次,然后我就换成一个1.5M大小的包进行升级,有的时候写入完成的时候显示校验失败,但存在校验成功的情况,但是再手动重启之后都是显示的这个样子
6.png
6.png (77.12 KiB) Viewed 8783 times
,这大概是什么原因呢

ESP_Yake
Posts: 109
Joined: Mon Mar 06, 2017 12:23 pm

Re: ESP32使用uart进行串口升级,通过esp_ota_write写入数据校验没错,esp_ota_end之后也显示重启,但在重启之后分区不切换

Postby ESP_Yake » Fri Jun 10, 2022 1:43 am

只比较最后一包是不对的,请将flash中下载的分区固件读出来与原始数据进行对比,可以使用 Beyond compare 工具操作。你的问题很明确,就是加固固件时发现固件错误。

Who is online

Users browsing this forum: No registered users and 36 guests