打印
[STM32F4]

IAP跳转疑问?

[复制链接]
1212|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuliang33|  楼主 | 2019-3-16 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从之前的STM32F0,F1都使用了IAP。
首先我使用的是根据判断STM32内部FLASH的方法来判断是否需要IAP升级。如在0x8004000处写入0xAABB,则需要更新。更新完写入0xBBAA,这样IAP程序来判断是否需要执行更新。
一直有个疑问,APP程序更新完后,跳转到APP。如果发送的的是正确的APP升级文件,那肯定没问题,这是如果发送错了APP升级文件(这不是我的意愿),就会出现问题,无法执行APP程序而进入到void HardFault_Handler(void)这个硬件中断函数。这时你就完全无能为力了,无法重现更新APP程序,这个情况不是我们想要的。
现在的处理方式是在IAP程序的void HardFault_Handler(void)函数中,写入IAP使能标记(即在0x8004000写入0xAABB)然后重启NVIC_SystemReset();这样可实现即时你更新选错了APP文件,也可以重新更新。
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
    STMFLASH_Write(IAP_FLAG_ADD,&IAP_Flag_ENABLE_Data,1);
    NVIC_SystemReset();
  while (1)
  {
  }
}
疑问1:这样的方式是否可行,会不会影响到APP的void HardFault_Handler(void)函数。
疑问2:
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.  

我在IAP程序中定义了一个120K的变量,跳转到APP时这个变量会释放吗?


沙发
零三翟邢止胃| | 2019-3-18 12:21 | 只看该作者
多谢分享啊! 感谢啊!

使用特权

评论回复
板凳
zwmasdf| | 2019-3-18 12:25 | 只看该作者
这样指标不治本,如果错误的APP程序能在该单片机上跑,就不会进入HardFault_Handler,比如针对该硬件的测试程序等等,这时还是无法完成升级
如果有人机交互的机制,可以通过上电判断特殊情况强制进入升级模式来解决比较合理

使用特权

评论回复
地板
yklstudent| | 2019-3-18 12:38 | 只看该作者
为什么会升错,加强管理啊

使用特权

评论回复
5
Prry| | 2019-3-18 23:37 | 只看该作者
这样的方式不可靠也不好拓展,IAP建议这样做:
1、boot只作拷贝的跳转,boot可以做的很小,可留给大空间给app;
2、app区分A、B区,A放app,正常跳转至A;B区存升级app;
3、升级时先将固件存放在B区,复位后boot拷贝B区app到A区;
4、通过校验手段,可以避免固件错误、中途断电等问题;如果固件大,还可以将B区备份区放在外置flash中(如spi flash)。


使用特权

评论回复
6
Prry| | 2019-3-18 23:39 | 只看该作者
疑问1:自行尝试,没这样做过,未知。
疑问2:会释放,跳出main已经释放。

使用特权

评论回复
7
zhuotuzi| | 2019-3-19 08:29 | 只看该作者
你的逻辑是错的。

使用特权

评论回复
8
zhuotuzi| | 2019-3-19 08:30 | 只看该作者
你应该判断是否接收到更新指令。而不是某个地方写了什么,你这种做法是一锤子买卖

使用特权

评论回复
9
zhuotuzi| | 2019-3-19 08:30 | 只看该作者
还有个补救icp

使用特权

评论回复
10
zhuotuzi| | 2019-3-19 08:30 | 只看该作者
isp都可以,直接更新你的bootloader部分

使用特权

评论回复
11
yuliang33|  楼主 | 2019-3-22 13:18 | 只看该作者
Prry 发表于 2019-3-18 23:37
这样的方式不可靠也不好拓展,IAP建议这样做:
1、boot只作拷贝的跳转,boot可以做的很小,可留给大空间给a ...

这是个好方法!赞

使用特权

评论回复
12
yuliang33|  楼主 | 2019-3-22 13:19 | 只看该作者
Prry 发表于 2019-3-18 23:39
疑问1:自行尝试,没这样做过,未知。
疑问2:会释放,跳出main已经释放。 ...

不是定义在main的函数中,是在全局变量中的也一样吗

使用特权

评论回复
13
yuliang33|  楼主 | 2019-3-22 13:21 | 只看该作者
zhuotuzi 发表于 2019-3-19 08:30
你应该判断是否接收到更新指令。而不是某个地方写了什么,你这种做法是一锤子买卖 ...

描述的不仔细,在接收到更新指令后,在FLASH中写入需更新状态,然后重启,IAP来判断

使用特权

评论回复
14
香水城| | 2019-3-25 11:34 | 只看该作者
不妨聊聊:

IAP能否得以执行一般不该依赖于APP程序本身的安全性、可靠性,难道APP程序异常了IAP升级都没得进行了?

如果从IAP到APP跳转成功了,一般来讲向量表就改动了,后面的HARD FAULT一般发生在app区了;如果说连最基本的跳转都没成功,矢量表没变,此时发送HARDFAULT
应该在IAP区;

至于那个内存缓存区,发生跳转后会发生堆栈的重新初始化,那个内存区域变得不可靠了,即使APP要用也得重新初始化了。

使用特权

评论回复
15
蝴蝶泉2018| | 2019-3-25 17:11 | 只看该作者
建议在IAP中做一个版本管理的判断。只要IAP保护起来不被改写掉,后面通过版本号都能再回来。  这个思路供参考

使用特权

评论回复
16
观海| | 2019-4-4 12:46 | 只看该作者
看不懂这个啊

使用特权

评论回复
17
guanjiaer| | 2019-4-4 12:48 | 只看该作者
对iap这块不太了解 啊

使用特权

评论回复
18
heimaojingzhang| | 2019-4-4 12:53 | 只看该作者
看这个帖子 我又涨了一个知识啊

使用特权

评论回复
19
labasi| | 2019-4-4 13:00 | 只看该作者
帮楼主顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

83

帖子

2

粉丝