文章目录[隐藏]
型号:STM32F407/429
真实工作场景
- F407环境下,iap开机跳转到APP运行程序,APP接受更新指令后,跳转回IAP并通过Ymodem协议接受UART数据,更新APP程序。更新完成后等待重启,
- 该项目中无难点。
- F030环境下,iap开机跳转到APP中,接受更新指令,跳回iap更新程序。
- F030没有偏移中断向量寄存器SCB->VTOR,只能通过在SRAM中复制IAP的中断向量表才能工作,这其中按照网上失能中断会导致芯片某些不能掉电的引脚掉电,
- 更新过程:更新包 -> F407设备转发 -> F030。F030又控制着更新包设备的电源,这其中不能有任何设备掉电。
- F407设备iap程序发现了BUG,且无法直接对其烧录,只能通过更新包来修复iAP,如何设计APP反向更新IAP的程序呢?
会陆续更新
-
入门难度
-
具体场景:一个简单的IAP跳转到APP的过程。
-
运行环境:win 10/ keil5.31/stl库或HAL均可/ IAP地址:0x8000000/APP地址:0x8020000
以下困难点是给小白看的: -
困难点:新入门时只会复制,不知道还需要配置,了解其他基础的东西。
-
APP中设置keil里面的option。APP中OPTION需要设置的(笔者是2M的FLASH所以是20万Size->2048*1024,理论上APPSize应该是20万-IAP的大小,嫌麻烦没改也没出过问题)
找到你项目中SCB->VTOR中断向量偏移寄存器,笔者在system_stm32f4xx.c中。其中有个VECT_TAB_OFFSET,将其设置成0x20000 -
APP中需要设置VECT_TAB_OFFSET地址偏移值。
-
USER_START_ADDRESS:存储APP程序的地址值 笔者用的是0x8020000即第128K空间。换算方式:打开计算器->选择程序员->HEX中输入20000,点到十进制DEC->再除以1024得出128。
-
代码说话
/*IAP程序核心代码*/
/* STM32F407VG MSP 0x20020000, So I've changed 0x2FFE0000 => 0x2FFD0000 */
if (((*(__IO uint32_t*)USER_START_ADDRESS) & 0x2FFD0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (USER_START_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) USER_START_ADDRESS);
JumpToApplication();
}
- 总结:从IAP跳到APP的过程中:
- 需要两个工程项目,iap和APP。
- iap中唯一要做的是提供一个APP的具体地址值,让程序运行IAP核心代码。
- app中需要修改地址偏移值,具体体现在:
a. 魔术棒中Target里IROM1的Start值改成APP的偏移值(具体地址值减去0x8000000),
b. 修改SCB->VTOR为APP的具体地址值。
OVER
版权声明:本文为CSDN博主「jax_fanyang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jax_fanyang/article/details/121380877
暂无评论