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

版权声明:本文为CSDN博主「jax_fanyang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jax_fanyang/article/details/121380877

生成海报
点赞 0

jax_fanyang

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf

基于STM32的室内环境监测系统

设计简介: 本设计是基于单片机的室内环境监测器,主要实现以下功能: 可实现LCD1602显示环境数据实时监测一氧化碳、甲烷、烟雾值空气质量大于各自限值报警,并通过TTS报警 标签&#x

实验一 stm32F407VETx点亮流水灯

二、设计指标 使电路板上的8个LED轮流点亮,并按键控制点亮速度。 三、操作 1、CubeMX操作 1.1依据开发板LED引脚设置CubeMX中8个LED的引脚为GPIO_Output模式, 2、按键设置