Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
怎么用u盘实现OTA升级,求大神指点
发布于 2020-04-23 22:26:43 浏览:2605
订阅该版
参考RT-thread官方的文章《stm32通用boodloader》 https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 我在线生成了一个bootloader,并且实现了Ymodem升级固件 然后我现在需要改成u盘升级 我的思路是这样的 1:把升级固件(也就是打包好的rbl文件)放到u盘 2:用usb host 读取rbl文件 3:把u盘的rbl文件复制到片外flash的download分区 4:OTA升级 但是现在遇到了几个问题 1:用usb host 刚开始读取rbl文件时,怎么知道整个rbl文件的大小,因为rbl文件比较大,需要分多次去读写 2:我用usb host读取rbl文件,读了前面2048字节,用字符串格式打印,只打印了一个字符串“RBL”,是我读取的数据有误还是不能用字符串打印 3:是不是完整的把rbl文件拷贝到download分区就可以升级了,还是说需要解压或者解密之后再存到download分区里面
查看更多
9
个回答
默认排序
按发布时间排序
aozima
2020-04-24
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
放到download分区就行了
晨起小酌
2020-04-24
这家伙很懒,什么也没写!
>放到download分区就行了 --- 我现在把u盘的固件拷贝到了download分区,然后重启,发现分区数据有错误,无法升级OTA 报错如下: [I]RT-Thread OTA package(V0.2.1) initialize success. [E]Get firmware header occur CRC32(calc.crc: 32616ffb != hdr.info_crc32: 00000000) error on 'download' partition! [E]Get OTA download partition firmware header failed! [E]Get firmware header occur CRC32(calc.crc: 7b93c5c8 != hdr.info_crc32: ffffffff) error on 'app' partition! [I]Begin to execute the program on app partition. 我用usb host读取rbl文件并以十六进制方式打印,和源文件进行比对,发现数据不一致,如果是用字符串打印,也只有一小部分和源文件的一些片段一致,这是读取数据错了还是打印的方式不对。
aozima
2020-04-24
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
U盘插电脑不就可以直接对比了嘛。
踩姑娘的小蘑菇
2020-04-24
这家伙很懒,什么也没写!
>我现在把u盘的固件拷贝到了download分区,然后重启,发现分区数据有错误,无法升级OTA >报错如下: >RT-Thr ... --- 我用过从SD卡把固件写到download分区,然后重启,可以正常更新的 看报错感觉可能是没写到正确的位置,固件头是空的,可以把搬运固件的代码贴出来,还有你的分区表贴一下
晨起小酌
2020-04-25
这家伙很懒,什么也没写!
>我用过从SD卡把固件写到download分区,然后重启,可以正常更新的 > >看报错感觉可能是没写到正确的位置,固 ... --- /* 以只读模式打开文件 */ fd = open("/rtthread.rbl", O_RDONLY); if (fd >= 0) { update_file_cur_size = 0; while(1) { /* 读取u盘的固件,一次读1024字节 */ size = read(fd, buf, sizeof(buf)); rt_kprintf("Read from file rtthread.rbl : %s \n", buf); /* 把固件写入片外flash的download分区 */ if (fal_partition_write(dl_part, update_file_cur_size, buf, size) < 0) { LOG_E("Firmware download failed! Partition (%s) write data error!", dl_part->name); return RYM_CODE_CAN; } update_file_cur_size += size; if(size != sizeof(buf)) { close(fd); break; } } } else { rt_kprintf("check: open file for read failed\n"); return 0; } rt_kprintf("Download firmware to flash success.\n"); rt_kprintf("System now will restart...\r\n"); /* wait some time for terminal response finish */ rt_thread_delay(rt_tick_from_millisecond(200)); /* Reset the device, Start new firmware */ extern void rt_hw_cpu_reset(void); rt_hw_cpu_reset(); /* wait some time for terminal response finish */ rt_thread_delay(rt_tick_from_millisecond(200)); return 0;
晨起小酌
2020-04-25
这家伙很懒,什么也没写!
>我用过从SD卡把固件写到download分区,然后重启,可以正常更新的 > >看报错感觉可能是没写到正确的位置,固 ... --- 我把u盘读取这部分代码贴出来了,前面还有擦除分区的代码,不够应该是没什么问题的,我也确定download分区的地址没错,有空帮忙看下呗,谢谢啦
踩姑娘的小蘑菇
2020-04-25
这家伙很懒,什么也没写!
``` static const struct fal_partition * dl_part = RT_NULL; int update_file_to_flash_and_reboot(void) { int count = 1; rt_kprintf("program date:%s,%s\n",__DATE__, __TIME__); while(1) { if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) { LOG_I("file system OK!\n"); //sdcard OK break; } else { LOG_E("file system ERROR!\n"); } rt_thread_mdelay(1000); } rt_int32_t file_size = my_read_file_size("/rtthread.rbl"); LOG_I("file size:%d",file_size); size_t update_file_cur_size=0; rt_uint8_t update_file_percentage = 0; if(file_size>0) { if ((dl_part = fal_partition_find("download")) == RT_NULL) { LOG_E("Firmware download failed! Partition (%s) find error!", "download"); goto exit; } if (fal_partition_erase(dl_part, 0, file_size) < 0) { LOG_E("Firmware download failed! Partition (%s) erase error!", dl_part->name); goto exit; } int fd,read_size=0; uint8_t buf[512] = { 0 }; fd = open("/rtthread.rbl", O_RDWR); while(1) { read_size = read(fd,buf,512); // LOG_I("read size:%d",read_size); if (fal_partition_write(dl_part, update_file_cur_size, buf, read_size) < 0) { LOG_E("Firmware download failed! Partition (%s) write data error!", dl_part->name); goto exit; } rt_thread_mdelay(5); update_file_cur_size += read_size; if(update_file_percentage!=(update_file_cur_size*100/file_size)) LOG_I("[move firmware]%3d%%",update_file_percentage); update_file_percentage = update_file_cur_size*100/file_size; if(read_size != 512) break; } close(fd); unlink("/rtthread.rbl"); rt_thread_mdelay(200); extern void rt_hw_cpu_reset(void); rt_hw_cpu_reset(); rt_thread_mdelay(200); } else { LOG_W("No rtthread.rbl"); } exit: LOG_I("file size to flash:%d",update_file_cur_size); return RT_EOK; } ``` 这个是我的代码,也是从ota的代码里改来的:lol看起来你的没啥区别,可以用我这个改来试试
踩姑娘的小蘑菇
2020-04-25
这家伙很懒,什么也没写!
还有要打印的话,因为.rbl是二进制文件,直接用%s打印,遇到0x0就会停止,肯定不能打印全 可以用%02X 循环打印读取到的文件数据
晨起小酌
2020-04-28
这家伙很懒,什么也没写!
已解决。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.6k
关于作者
晨起小酌
这家伙很懒,什么也没写!
提问
3
回答
8
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT Thread 源码分析笔记 :线程和调度器
2
RT-Thread项目助手v0.2.0 - 支持Env Windows
3
RttreadV5.10上,GD32F450Z RTC时间显示问题
4
rt-smart启动流程分析
5
EtherKit快速上手PROFINET
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部