转:http://blog.sina.com.cn/s/blog_b315f69b0102whtg.html

这篇文章摘自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 所示:

图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 所示:

图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选项卡,如图所示:

默认的条件下,图中 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选项卡,在

通过这一步设置,我们就可以在 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 (包含中断向量表详解)

STM32F10X的IAP编程详解——开发指南相关推荐

  1. JS中函数式编程详解版(FunctionalProgramming,FP)

    函数式编程详解 函数式编程的认识 函数式编程前置知识 函数是一等公民(First-class Function) 高阶函数 闭包 函数式编程基础 纯函数 lodash 模块 柯里化 函数组合 函子 函 ...

  2. iOS-NSThread编程详解

    note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...

  3. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  4. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...

    [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) --通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE P ...

  5. Java8函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  6. MapX编程详解(C++)----MapX发布技术

    MapX编程详解(C++) ----MapX发布 基于MapX的软件开发好后,安装在客户机上,需要MapX的支持,如果把所需的MapX的相关文件发布的客户机上,最简单的方法当然是在客户机上安装一套Ma ...

  7. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  8. 【第二篇】SAP HANA XS使用JavaScript编程详解

    前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 在第一篇的时候,我们说过如下内容: SAP HANA XS支持JavaScript中的服务器端应用程序编程.开发的服务器端 ...

  9. Linux的SOCKET编程详解

    Linux的SOCKET编程详解 一. 网络中进程之间如何通信 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统 ...

  10. Linux的SOCKET编程详解——非常叼

    http://blog.csdn.net/hguisu/article/details/7445768/ 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Linux的SOCKE ...

最新文章

  1. Eclipse主题更换方法
  2. MIT用19个神经元实现自动驾驶控制,灵感来自秀丽隐杆线虫
  3. for、while循环及其变体
  4. JavaScript数据结构与算法——集合
  5. ZOJ 3300 Mahjong DFS暴力解决。。
  6. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制
  7. Presto常用命令:查看版本号
  8. 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
  9. NLP【07】transformer原理、实现及如何与词向量做对接进行文本分类(附代码详解)
  10. 欧姆龙服务器数码管不显示问题,数显仪表常见故障的原理分析以及解决方案
  11. 动态菜单,根据登录用户权限返回不同菜单,登录完成跳转到不同的首页
  12. 利用VBA在Excel中批量画图
  13. Qt - QTChart绘制图表
  14. 两个字符串中最长公共单词 C语言
  15. 四川大学2014年数学分析考研试题
  16. GCC NOT FOUNT
  17. mysql修改初始化得到的密码
  18. 无聊的游戏 Beta 0.1
  19. ProGuard入门
  20. 让AURIX Development Studio变得更好用

热门文章

  1. linux终端文件名前特殊符号,Linux特殊符号大全
  2. Fbank特征与MFCC特征解析
  3. 学c语言学生智商要搞么,作为一个学渣,哥来告诉你如果你智商不够该怎么办...
  4. python123新版个人所得税计算请输入正数_Python训练的数字组合,个人所得税计算,完全平方数,python,之...
  5. 初识Python自动化运维(一)
  6. 计算机多媒体作业是什么,多媒体计算机技术作业一
  7. 梦三显示服务器列表,梦三国开服表_梦三国开服时间表_梦三国最新开服_9K9K手游网...
  8. Rest-assured框架详解
  9. 在windows 20003 下IIS6.0支持PHP的配置方
  10. gif动图怎么制作?gif在线制作方法,一键制作超简单