关于STM32做IAP程序的一些问题

IAP实现方式

一般包括网上使用较多的方式是采用"bootloader" + "主程序"的方式来实现。bootloader提供升级及引导,主程序负责功能实现。

这样实现的好处:独立了升级部分,只需要在主程序中添加一条升级命令,即可实现程序升级。

暂时来看,唯一的缺点是占用空间比一个程序大,主要是两部分代码会有重合部分。

Bootloader部分

Bootloader必须实现如下功能:

  • 判断是否需要升级;
  • 接收升级文件,并写入ROM flash;
  • 升级失败处理(如升级出错/主程序无法正常运行,能够准确检测,并报错);

主程序部分

主程序除了需要添加一条命令外,还需要主程序能从非起始地址(如STM32的起始地址为0x8000000)启动并正常运行。

此处涉及到两处修改(以起始地址0x8000000为例):

第一修改程序的中断向量偏移

在文件“system_stm32f4xx.c”中有其定义:

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x0

上面这个值为默认偏移量。如果主程序放到0x8020000处,则这个偏移量需要修改为0x20000。可以看到这个值即为你需要的偏移地址。

第二 修改程序的下载地址

这个值,不同的编译环境,有不同的配置。

如sw4stm32中,用STM32CubeMX生成的在文件STM32F405VGTx_FLASH.ld中定义;直接创建的工程在LinkerScript.ld中定义。

FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K   -- STM32CubeMX生成的工程
ROM (rx)		: ORIGIN = 0x8000000, LENGTH = 1024K  -- 原始工程

如上,这是sw4stm32工程中关于FLASH起始地址及大小的定义。只需要将这个0x8000000修改为0x8020000即可,大小可改可不改建议改掉。

特别注意:修改这个需要先删除编译的DEBUG文件夹,以便进行重新编译。

keil环境中,修改Target配置中的IROM即可,用keil的可以找一下,不在此详述。

下载

由于gcc编译出来的为bin文件,不带有一些地址参数,所以用下载器或者其它工具下载代码时需要注意选择下载地址,不要配置为默认地址0x8000000了。

转载于:https://my.oschina.net/purplespace/blog/856244

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值