STM32F0/F4BootLoader之IAP与APP工作中的事

型号:STM32F407/429
真实工作场景
  1. F407环境下,iap开机跳转到APP运行程序,APP接受更新指令后,跳转回IAP并通过Ymodem协议接受UART数据,更新APP程序。更新完成后等待重启,
  • 该项目中无难点。
  1. F030环境下,iap开机跳转到APP中,接受更新指令,跳回iap更新程序。
  • F030没有偏移中断向量寄存器SCB->VTOR,只能通过在SRAM中复制IAP的中断向量表才能工作,这其中按照网上失能中断会导致芯片某些不能掉电的引脚掉电,
  • 更新过程:更新包 -> F407设备转发 -> F030。F030又控制着更新包设备的电源,这其中不能有任何设备掉电。
  1. 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的大小,嫌麻烦没改也没出过问题)
    OPTION设置找到你项目中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的过程中:
  1. 需要两个工程项目,iap和APP。
  2. iap中唯一要做的是提供一个APP的具体地址值,让程序运行IAP核心代码。
  3. app中需要修改地址偏移值,具体体现在:
    a. 魔术棒中Target里IROM1的Start值改成APP的偏移值(具体地址值减去0x8000000),
    b. 修改SCB->VTOR为APP的具体地址值。
OVER
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值