Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
IAP_在线更新
Bootloader
Ymodem
STM32 IAP升级全流程说明
发布于 2022-03-06 11:54:37 浏览:2755
订阅该版
[tocm] # STM32 IAP升级主要是几个步骤: IAP升级的本质就是将固件文件(.bin文件)写入到flash区域的某个地方,便于程序PC指针能够访问到代码数据。 ## 注意有以下几点: 1.需要类似于BootLoader的一段程序。作用是将下载到备份区域的固件数据,从备份区域复制到APP运行区域。 实现: - ①需要实现flash读写驱动,用于复制读写在flash区域中的固件数据 - ②需要跳转程序`BootLoader-->APP`运行 - ③需要在跳转的过程中,将所用的外设全部`deinit` - ④设置栈指针,并跳转: (部分代码) ```c /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */ if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); JumpToApplication(); } ``` 2.APP程序作用是将远程固件通过某种通信方式获取下来(一般是串口,或者是基于串口的网络通信方式;或者是网口等)。将获取下来的固件写入到指定的flash区域中,并设置升级标记,使BootLoader能够知道并且复制固件。 实现: - ①需要通过串口获取固件数据。使用Ymodem协议,协议中有整一套的数据传输校验和可靠逻辑。我们仅仅需要实现串口驱动API和flash读写API即可 ②固件写入完成后,需要重启系统,使之能够运行BootLoader程序,对备份区的固件进行复制。 - ③也是APP中最重要的一点,需要再APP--main函数一开始的位置就设置中断向量表偏移值: `SCB->VTOR = FLASH_BASE | 0x00004000; /* Vector Table Relocation in Internal FLASH */`。 0x00004000为人为指定的偏移值(可以根据自己的APP和BootLoader程序的大小进行合理的选择,但是要注意此值必须要是0x200的整数倍,STM32源码中有说明,请注意。否则跳转不成功)。 3.Keil的设置: - ①BootLoader项目工程需要将target里面的IROM1设置为`0x8000000` - ②APP项目中需要将target里面的IROM1设置为`0x8004000`(也就是你设置的实际偏移值,但是基础都是以`0x8000000`为主,然后`|`上偏移值) 4.关于Ymodem协议要注意一点: - ①协议中这行代码`Serial_PutByte(CRC16);`在`Serial_PutByte(ACK);`之后,建议将`CRC16`这行代码删除,有时候会造成协议错乱。 (这个我也调试了很久,坑死了哈哈哈!!!)。 整个传输的过程使用的是串口轮询方式发送和接收,所以要注意轮询的阻塞时间,根据实际情况调整。 5.建议几点: - ①BootLoader中不要有重试和死循环,出现异常后直接跳转到APP正常运行,等待下一次升级请求 - ②APP中需要有标记位用于和BootLoader通信,让BootLoader知道是否需要升级和升级信息相关。 - ③BootLoader跳转的时候一定要注意将其他外设deinit。(如果用到某些应用类型的中断可以尝试关闭调试一下。我的代码在跳转程序过程中并没有关闭中断,仅仅将外设deinit) 相关文件可点击链接 知乎:https://zhuanlan.zhihu.com/p/81133050
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Liutao
这家伙很懒,什么也没写!
文章
9
回答
0
被采纳
0
关注TA
发私信
相关文章
1
Linux下通过USBTinyISP为Arduino开发板烧?写Bootloader
2
请教修改NVIC后RTT调度函数失效的问题[已解决 bootloader中打开了不必要的中断]
3
进入bootloader的方式探讨
4
求助:IAP里的APP使用的RTT,跳转后出错。[已解决]
5
有没有人在STM32F103上用UART IAP跑过RT-Thread?
6
想做网口的IAP远程升级,不知可不可行
7
IAP问题
8
[已解决]请教基于RTT的IAP程序切换到应用程序不成功的问题(基于STM32F4)?
9
stm32f4xx-----IAP移植APP程序需要注意的地方
10
在调试IAP网络升级遇到跳转之后bootloader程序网络不通
推荐文章
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组件
热门标签
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部