[STM32] STM32的IAP方法,如何写SRAM程序?

[复制链接]
 楼主| sio4 发表于 2018-11-13 16:15 | 显示全部楼层 |阅读模式
我是一个STM32F103RBT6+SIM800C的项目,需要增加网络更新固件的功能。
已经实现服务器发送固件通过SIM800C传输到SFLASH中。
现在需要实现的是STM32的IAP功能,我这两天看了原子哥的《实验47 串口IAP实验》,觉得有点麻烦,我的思路是:在原始项目中,增加一段SRAM代码(2~3K),在此代码中实现将SFLASH中的固件写入原始FLASH中,写入完成后复位,程序从头开始运行即可。
此方法与《实验47 串口IAP实验》相比更简单,不用管什么中断向量表,也不用管bin文件合并,当然风险是万一失败,就比较麻烦。
我的问题是:如何写一段SRAM程序?
千岁寒 发表于 2018-11-14 10:09 | 显示全部楼层
本帖最后由 千岁寒 于 2018-11-14 10:10 编辑

应该是可以的:
1、首先,需要有一个消息(中断或事件)通知程序运行 IAP 功能
2、跳转到IAP后,负责将接收到的内容写到Flash中

注:
         以STM32举例,一般的,Flash固定地址从 0x80000000开始,所以IAP功能程序要放在 主程序之后,且要保持一段安全距离。
holle 发表于 2018-11-14 11:01 | 显示全部楼层
本帖最后由 holle 于 2018-11-14 11:03 编辑

程序在SRAM中运行不可取,因为单片机不是虚拟地址,程序运行需要堆和栈,静态数据区,动态数据区,C语言程序安排不好容易出问题,除非汇编写地址无关程序。
STM32的Flash可以运行中擦写,可以利用看门狗超时进行跳转。
苏山人家 发表于 2018-12-11 10:58 | 显示全部楼层
如果空间足够还是建议先接受全部固件数据校验后整体擦出替换。可以避免数据传输错误,或者传输中断等问题
你可以写一个boot,再boo里面做固件搬运以及接受,这样哪怕固件有问题,也可以再次升级救回来。
当然这么做的坏处就是需要备份,如果你的数据能再内存保存(64K一般)那就可以不占用flash空间了
ayb_ice 发表于 2018-12-12 15:37 | 显示全部楼层
这就是典型的BOOT
airwill 发表于 2018-12-12 22:20 | 显示全部楼层
有一个办法, 可以将 FLASH 里的代码复制到 SRAM 里执行.
SmartEnergy 发表于 2025-5-20 14:19 | 显示全部楼层
airwill 发表于 2018-12-12 22:20
有一个办法, 可以将 FLASH 里的代码复制到 SRAM 里执行.

您好,请问有测试SRAM程序的代码?
airwill 发表于 2025-5-23 17:13 | 显示全部楼层
整个代码块复制到SRAM,跳转到正确的入口地址,是可以正确执行的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

74

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

16

主题

74

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部