搜索

[STM32F2] 我把IAP改为串口指令升级,不用开机按住键,问题如下

[复制链接]
3975|30
手机看帖
扫描二维码
随时随地手机跟帖
netjob|  楼主 | 2021-7-15 13:39 | 显示全部楼层 |阅读模式
我把IAP改为串口指令升级,不用开机按住键,问题如下


BOOT还是在地址 800000~8003000 ,  APP在800300之后。
两个代码独立, 两个HEX文件用工具合并为HEX, 然后转BIN  烧录便可。

开机  BOOT  直接跳到  APP运行。

APP 运行的时候如果从串口接收到 升级指令。 需要跳转到指定的BOOT 函数。
这个函数的地址 就如何固定,我还不知道,这就是问题点。

这个函数就是 IAP的函数。这个函数的地址如何可以从APP 跳转到这个函数运行? 这个是函数指针可以做到。但是我不知道这个函数地址在是多少啊。 大家有什么建议?



使用特权

评论回复
netjob|  楼主 | 2021-7-15 13:53 | 显示全部楼层
本帖最后由 netjob 于 2021-7-15 13:54 编辑

比如  我要跳入  IAP的  Main_Menu()这个函数,
然后在MAP 文件看到如下  [Anonymous Symbol]                 0x080010d4   Section        0  menu.o(.text.Main_Menu)
Main_Menu                                0x080010d5   Thumb Code   240  menu.o(.text.Main_Menu)
0x080010d4   0x080010d4   0x000000f0   Code   RO          613    .text.Main_Menu     menu.o

是不是这个地址?  (0x080010d4)

使用特权

评论回复
小叶三千| | 2021-7-15 13:56 | 显示全部楼层
BOOT 函数的地址就是0x08000000啊,直接复位就行。因为你的地址是800000~8003000,如果不是从0x08000000开始的,直接跳转到你的地址就行了啊。不太理解你说的“需要跳转到指定的BOOT 函数。这个函数的地址 就如何固定”
9512960efce1518977.png

使用特权

评论回复
小叶三千| | 2021-7-15 14:01 | 显示全部楼层
netjob 发表于 2021-7-15 13:53
比如  我要跳入  IAP的  Main_Menu()这个函数,
然后在MAP 文件看到如下  [Anonymous Symbol]           ...

直接跳入函数的地址没有试过行不行,我一般都是跳入程序段的首地址的

使用特权

评论回复
netjob|  楼主 | 2021-7-15 14:37 | 显示全部楼层
小叶三千 发表于 2021-7-15 14:01
直接跳入函数的地址没有试过行不行,我一般都是跳入程序段的首地址的

现在的BOOT 要改为开机就  跳入 APP的 。  然后在APP里面 跳到BOOT的 一个函数里面 ,好比MAIN_MENU那个函数,如此。 的啊。 因此就要看MAP文件这个函数的地址在哪里,然后红函数指针在APP里面跳到去,同时把SRAM映射改为ROM映射,在BOOT里面重新初始化动脑筋,然后进入 串口升级的YMODEM啊
意思就是现在   上位机可以操作升级。 不用 按ST 的DEMO那样,要上电按住按钮才能升级, 不方便啊

使用特权

评论回复
小叶三千| | 2021-7-15 14:42 | 显示全部楼层
netjob 发表于 2021-7-15 14:37
现在的BOOT 要改为开机就  跳入 APP的 。  然后在APP里面 跳到BOOT的 一个函数里面 ,好比MAIN_MENU那个函 ...

我都是搞一个标志位记录在Flash里或者EE里,APP程序有效,开机直接重BOOT里跳到APP。如果在APP中收到了升级指令,就修改这个标志位,然后复位到BOOT里,BOOT检测这个标志位

使用特权

评论回复
小叶三千| | 2021-7-15 14:48 | 显示全部楼层
4590860efda2062f45.png 这个流程图就是我做的bootloader的流程,希望对你有帮助

使用特权

评论回复
netjob|  楼主 | 2021-7-15 16:02 | 显示全部楼层
我现在是 在APP里面可以随意升级, 只要发送特定的指令,就从APP 跳到IAP的升级函数去。

目前这个函数我在MAP中知道地址。好比0x080011d0  ,那么这个地址是不是要+4后作为函数指针跳转?

使用特权

评论回复
小叶三千| | 2021-7-15 16:22 | 显示全部楼层
netjob 发表于 2021-7-15 16:02
我现在是 在APP里面可以随意升级, 只要发送特定的指令,就从APP 跳到IAP的升级函数去。

目前这个函数我在 ...

跳到具体的函数还真没有用过,不知道这样行不行。为什么要跳到具体的函数里呢

使用特权

评论回复
香水城| | 2021-7-15 19:37 | 显示全部楼层
本帖最后由 香水城 于 2021-7-15 19:54 编辑

你要那样的话,那就将函数定位在指定的已知地址,这个操作你可以百度下或看看相关IDE的编译手册。
另外,ST官方的应用笔记AN4296就有相关内容可以参考。


使用特权

评论回复
zchong| | 2021-7-16 07:26 | 显示全部楼层
本帖最后由 zchong 于 2021-7-16 07:28 编辑

有没有eeprom之类的,或者把内部flash用起来,APP接收到升级指令后写标志重启,boot启动后判标志确定升级程序还是跳转APP运行,这个流程更通用一些,你这种直接跳转boot中的函数运行也是可以的,但升级过程出意外的话就要重新用仿真器或其它方式烧写了。

使用特权

评论回复
netjob|  楼主 | 2021-7-16 09:10 | 显示全部楼层
香水城 发表于 2021-7-15 19:37
你要那样的话,那就将函数定位在指定的已知地址,这个操作你可以百度下或看看相关IDE的编译手册。
另外,ST ...

看 MAP 文件才是输出实在的地址。 我按你的说法去做, 但是输出的地址MAP中的地址与定位方法的地址完全不一样啊。

使用特权

评论回复
ayb_ice| | 2021-7-16 09:18 | 显示全部楼层
收到指令后,
设置特殊变量,
然后软件复位,
运行BOOT,
BOOT检测到特殊变量值,
真正运行BOOT升级

使用特权

评论回复
zlf1208| | 2021-7-16 09:25 | 显示全部楼层
要通过串口实现IAP,MCU上电或软件复位CPU的时候必须首先进入BOOT程序段,通过设置在FALSH确定位置的标志来判断程序是跳转到APP还是留在BOOT程序等待升级。
要从APP跳转到BOOT,只需设置FLASH标志,然后用CPU复位指令复位CPU,程序就会进入到BOOT程序段;在升级完成后,在BOOT程序段修改FLASH标志,然后用CPU复位指令复位CPU,程序就会跳转到APP

使用特权

评论回复
yklstudent| | 2021-7-16 11:18 | 显示全部楼层
楼上观点不能同意再多

使用特权

评论回复
netjob|  楼主 | 2021-7-16 11:28 | 显示全部楼层
楼上几位的做法。都是用到标志,FLASH固定地址的。 也提到 升级失败的风险问题。
我这个做法风险就是失败后可能就不能运行了。

但是用 标志的方法一样有同样的风险吧。 当标志有效,而APP代码有BUG,一样挂掉啊。是不是?

对这种问题大家有什么建议?



使用特权

评论回复
ccd007| | 2021-7-16 11:37 | 显示全部楼层
不光是升级失败的问题,两个程序的初始化是不一样的。你想不做标志直接跳回去要么就是像刚开机一样跳回搭配APP程序,要么就是寄存器中断向量表等都没有按IAP方式初始化,程序乱套了。怕升级失败,你可以升级完毕检查校验和之后再清除标志位。

使用特权

评论回复
xiaofei558008| | 2021-7-16 11:42 | 显示全部楼层
ST 官方有IAP例子

使用特权

评论回复
zlf1208| | 2021-7-16 12:18 | 显示全部楼层
本帖最后由 zlf1208 于 2021-7-16 12:21 编辑
netjob 发表于 2021-7-16 11:28
楼上几位的做法。都是用到标志,FLASH固定地址的。 也提到 升级失败的风险问题。
我这个做法风险就是失败后 ...

我的做法是分配二个APP的FALSH块,称作区块A和区块B,有一个工作区块标志,假定现在是A区块运行APP,则升级的APP程序写入B区块,升级成功后设置B区块工作标志,如果升级不成功,则工作区块标志不变,以此类推。

如果升级后发现有BUG,可以退回上一个版本,也可以再升级一次来解决。

使用特权

评论回复
小叶三千| | 2021-7-16 13:05 | 显示全部楼层
zlf1208 发表于 2021-7-16 12:18
我的做法是分配二个APP的FALSH块,称作区块A和区块B,有一个工作区块标志,假定现在是A区块运行APP,则升 ...

回滚,空间富于的话推荐使用。或者双Boot

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 kk的回忆 得到打赏 ¥561.01
  • 2 火星国务卿 得到打赏 ¥518.00
  • 3 呐咯密密 得到打赏 ¥295.00
  • 4 小叶三千 得到打赏 ¥210.00
  • 5 jinglixixi 得到打赏 ¥190.00
  • 6 Gavin3389 得到打赏 ¥180.00
  • 7 神圣雅诗人 得到打赏 ¥170.00
  • 8 xyz549040622 得到打赏 ¥150.00
  • 9 linghz 得到打赏 ¥120.00
  • 10 137017878 得到打赏 ¥115.00
在线客服 快速回复 返回顶部 返回列表