IAP详解(转)

这篇文章摘自STM32开发指南,偶然在网上翻到了一次,经典的文章和大家一起分享。


IAP( In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产
品中的固件程序进行更新升级。 通常实现IAP 功能时,即用户程序运行中作自身的更新操作,
需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通
过某种通信方式(如 USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目
代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首
先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到 4)

3)执行更新操作

4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码可以使用第一部分代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新是再通过第一部分 IAP代码更新。我们将第一个项目代码称之为 Bootloader 程序,第二个项目代码称之为 APP 程序,他们存放在 STM32 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序(注意,如果 FLASH 容量足够,是可以设计很多 APP 程序的,这里只讨论一个 APP 程序的情况)。这样我们就是要实现 2 个程序:Bootloader 和 APP。STM32 的 APP 程序不仅可以放到 FLASH 里面运行,也可以放到 SRAM 里面运行,这里,我们将制作一个APP,用于 FLASH 运行。我们先来看看 STM32 正常的程序运行流程,如图 53.1.1 所示:STM32F10X的IAP编程详解——开发指南


图53.1.1 STM32 正常运行流程图

STM32 的内部闪存( FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32 F10X是基于 Cortex-M3 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是0x08000004,当中断来临, STM32 的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

在图 53.1.1 中, STM32 在复位后,先从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们的main 函数,如图标号②所示;而我们的main 函数一般都是一个死循环,在 main 函数执行过程中,如果收到中断请求(发生重中断),此时STM32 强制将 PC 指针指回中断向量表处,如图标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回main 函数执行,如图标号⑤所示。

当加入 IAP 程序之后,程序运行流程如图 53.1.2 所示:

STM32F10X的IAP编程详解——开发指南

图53.1.2 加入 IAP 之后程序运行流程图

在图 53.1.2 所示流程中, STM32 复位后,还是从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAP 的 main 函数,如图标号①所示,此部分同图53.1.1 一样;在执行完 IAP 以后(即将新的 APP 代码写入 STM32的FLASH,灰底部分。新程序的复位中断向量起始地址为 0X08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数,如图标号②和③所示,同样 main 函数为一个死循环,并且注意到此时 STM32 的FLASH,在不同位置上,共有两个中断向量表。在 main 函数执行过程中,如果 CPU 得到一个中断请求, PC 指针仍强制跳转到地址0X08000004 中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回 main 函数继续运行,如图标号⑥所示。通过以上两个过程的分析,我们知道 IAP 程序必须满足两个要求:

1) 新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;

2) 必须将新程序的中断向量表相应的移动,移动的偏移量为 x;

1.APP 程序起始地址设置方法
随便打开一个之前的实例工程,点击 Options for Targe-> Target选项卡,如图所示:STM32F10X的IAP编程详解——开发指南

 

 

图 53.1.3 FLASH APP Target 选项卡设置
    默认的条件下,图中 IROM1 的起始地址( Start)一般为 0X08000000,大小(Size)为0X80000,即从0X08000000 开始的512K 空间为我们的程序存储(假设使用的STM32F103ZET6,其 FLASH大小是 512K)。而图中,我们设置起始地址( Start)为 0X08010000,即偏移量为 0X10000( 64K字节),因而,留给 APP 用的 FLASH 空间( Size)只有0X80000-0X10000=0X70000( 448K 字节)大小了。设置好 Start 和Szie,就完成APP 程序的起始地址设置。

2.中断向量表的偏移量设置方法
之前我们讲解过,在系统启动的时候,会首先调用 systemInit 函数初始化时钟系统,同时systemInit 还完成了中断向量表的设置,我们可以打开 systemInit 函数,看看函数体的结尾处有这样几行代码:

#ifdef VECT_TAB_SRAM

SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;

 

#else

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;

 

#endif

从代码可以理解,VTOR寄存器存放的是中断向量表的起始地址。默认的情况VECT_TAB_SRAM 是没有定义,所以执行SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;对于 FLASH APP,我们设置为FLASH_BASE+偏移量0x10000,所以我们可以在FLASH APP 的main 函数最开头处添加如下代码实现中断向量表的起始地址的重设:

SCB->VTOR = FLASH_BASE | 0x10000;

以上是FLASH APP 的情况,当使用SRAM APP 的时候, 我们设置起始地址为:SRAM_bASE+0x1000,同样的方法,我们在 SRAM APP 的 main 函数最开始处,添加下面代码:

SCB->VTOR = SRAM_BASE | 0x1000;

这样,我们就完成了中断向量表偏移量的设置。

通过以上两个步骤的设置,我们就可以生成 APP 程序了,只要 APP 程序的 FLASH 大小不超过我们的设置即可。不过 MDK 默认生成的文件是.hex 文件,并不方便我们用作 IAP更新,我们希望生成的文件是.bin 文件,这样可以方便进行 IAP 升级,这里我们通过 MDK 自带的格式转换工具 fromelf.exe,来实现.axf文件到.bin 文件的转换。该工具在 MDK 的安装目录\ARM\BIN40 文件夹里面。

fromelf.exe 转换工具的语法格式为: fromelf [options] input_file。其中 options 有很多选项可以设置 .

本章,我们通过在 MDK 点击 Options for Targe->USER选项卡,在STM32F10X的IAP编程详解——开发指南


 

通过这一步设置,我们就可以在 MDK 编译成功之后,调用 fromelf.exe(注意,我的 MDK是安装在D:\Keil3.80A 文件夹下,如果你是安装在其他目录,请根据你自己的目录修改fromelf.exe 的路径),根据当前工程的 TEST.axf(如果是其他的名字,请记住修改,这个文件存放在 OBJ 目录下面,格式为 xxx.axf),生成一个 TEST.bin 的文件。并存放在 axf文件相同的目录下,即工程的 OBJ 文件夹里面。在得到.bin 文件之后,我们只需要将这个 bin 文件传送给单片机,即可执行 IAP 升级。

最后再来APP 程序的生成步骤:

1)    设置 APP 程序的起始地址和存储空间大小

 对于在 FLASH 里面运行的APP 程序, 我们可以按照图53.1.3 的设置。

2)    设置中断向量表偏移量

这一步按照上面讲解,重新设置 SCB->VTOR 的值即可。

3)    设置编译后运行 fromelf.exe,生成.bin 文件.

通过在User 选项卡,设置编译后调用 fromelf.exe,根据.axf 文件生成.bin 文件,用于IAP 更新。

以上 3 个步骤,我们就可以得到一个.bin 的 APP 程序,通过 Bootlader 程序即可实现更新。


参考类似文章:http://bbs.elecfans.com/jishu_422057_1_1.html (包含中断向量表详解)


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103是一款基于ARM Cortex-M3内核的微控制器系列,支持内部IAP(In-Application Programming)功能,可以通过软件方式进行固件更新。 要将STM32F103IAP模式,需要进行以下步骤: 1. 确保正确配置BOOT0引脚:在引脚配置中,将BOOT0引脚设置为高电平。这将导致芯片在下次重启时从内部Flash启动。 2. 编写IAP代码:根据ST官方提供的IAP库和相关文档,编写适配芯片的IAP代码。这些库和文档通常可以从ST网站上下载。 3. 运行IAP代码:在代码中确定好更新的固件位置、大小和格式。通过调用IAP库提供的接口,将新固件加载到内部Flash中,并执行更新操作。 值得注意的是,IAP模式可能涉及一些底层的硬件配置和驱动程序的设置。需要确保正确配置和初始化系统时钟、Flash存储器的起始地址和大小等参数。 另外,注意在进行IAP时应谨慎操作,确保固件的正确性和完整性。在进行IAP操作前,最好备份原始固件,以防止发生不可预测的问题。 如果无法成功IAP模式,可能是由于以下原因导致: 1. 引脚配置不正确:确保BOOT0引脚被正确配置为高电平。 2. 编写的IAP代码有问题:检查IAP代码的正确性和适配性。 3. 系统时钟设置有误:IAP操作需要正确的系统时钟配置。 4. Flash存储器配置有问题:确保内部Flash的起始地址、大小和访问权限正确配置。 综上所述,要将STM32F103IAP模式,需要正确配置引脚、编写适配代码,并确保正确的系统时钟和Flash存储器配置。如有问题,请仔细检查配置和代码,并参考ST官方文档和资源进行调试。 ### 回答2: STM32F103是一款常用的低功耗芯片,具有强大的处理能力和丰富的外设接口。在实际应用中,经常需要对其进行固件升级或者更新,这时就需要使用IAP(In-Application Programming)方式进行固件的换。 以下是IAP不成功的一些常见原因和可能的解决方法: 1. 未正确配置引导向量表:在使用IAP时,需要将引导向量基址(Bootloader Address)指向IAP程序的起始地址。如果没有正确配置引导向量表,芯片会一直从默认代码区启动,无法进入IAP。解决方法是在程序开始的地方设置正确的引导向量地址。 2. IAP程序编写不正确:IAP程序需要与具体芯片型号和硬件设计相匹配。如果IAP程序编写有误,可能导致无法进入IAP模式,此时需要检查IAP程序的正确性,并根据具体需求进行修改。 3. 未正确触发进入IAP模式:进入IAP模式需要通过特定的触发方式,如按下某个按键、发送特定的串口命令等。如果触发方式设置不正确或者触发方式的硬件连接有问题,就无法进入IAP模式。解决方法是检查触发方式设置和硬件连接是否正确。 4. 安全机制的限制:有些STM32F103的型号或者芯片内部的安全位限制了IAP的操作,需要通过特殊流程解锁或者禁用某些安全功能才能进入IAP模式。请参考芯片的相关手册,了解具体的安全机制限制和解除方法。 以上是一些可能导致STM32F103无法成功IAP的常见原因和解决方法。具体情况需要根据具体的硬件设计和应用需求进行调试和解决。 ### 回答3: ST32F103是一款功能强大的微控制器芯片。IAP(In-Application Programming)是一种能够在嵌入式系统中对程序进行在线更新和修改的技术。但在某些情况下,可能会遇到无法成功IAP模式的问题。以下是一些可能的原因和解决方法: 1. 代码错误:首先要检查代码中是否存在错误。确保正确地配置了IAP模式所需的寄存器和引脚设置。可以借助官方提供的开发工具或参考参考手册来确认设置是否正确。 2. 芯片状态:确保芯片处于正确的工作状态。在换到IAP模式前,可能需要关闭一些外设或特定的中断。同时,还要确保正确连接到目标系统,并使用正确的复位方式。 3. 访问权限:某些存储区域(如Flash和RAM)可能需要特定的访问权限才能进行IAP操作。检查代码中是否正确设置了合适的权限位。 4. 版本兼容性:请确保使用的IAP工具和固件版本与目标芯片兼容。在使用第三方工具时,需要确认其支持的芯片型号和固件版本。 5. 电源供应:在换到IAP模式期间,确保芯片的电源供应是稳定和可靠的。任何电源不稳定或非法的操作都可能导致IAP失败。 如果遇到无法成功IAP模式的问题,可以逐一排除以上可能的原因,并查看相关的错误提示和日志信息,以帮助定位问题。同时,与开发社区或芯片厂商进行交流和咨询也是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值