STM32F10X的IAP编程详解——开发指南
转: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 所示:
1) 新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;
2) 必须将新程序的中断向量表相应的移动,移动的偏移量为 x;
1.APP 程序起始地址设置方法
随便打开一个之前的实例工程,点击 Options for Targe-> Target选项卡,如图所示:
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编程详解——开发指南相关推荐
- JS中函数式编程详解版(FunctionalProgramming,FP)
函数式编程详解 函数式编程的认识 函数式编程前置知识 函数是一等公民(First-class Function) 高阶函数 闭包 函数式编程基础 纯函数 lodash 模块 柯里化 函数组合 函子 函 ...
- iOS-NSThread编程详解
note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...
- Java高并发编程详解系列-Java线程入门
根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面. 首先介绍一下这个系列的东西是什么,这个系列自己 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...
[强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) --通过知识共享树立个人品牌. 继上七篇: [推荐]ORACLE P ...
- Java8函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- MapX编程详解(C++)----MapX发布技术
MapX编程详解(C++) ----MapX发布 基于MapX的软件开发好后,安装在客户机上,需要MapX的支持,如果把所需的MapX的相关文件发布的客户机上,最简单的方法当然是在客户机上安装一套Ma ...
- Oracle PL/SQL编程详解
Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84 文章- 0 评论- 0 & ...
- 【第二篇】SAP HANA XS使用JavaScript编程详解
前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 在第一篇的时候,我们说过如下内容: SAP HANA XS支持JavaScript中的服务器端应用程序编程.开发的服务器端 ...
- Linux的SOCKET编程详解
Linux的SOCKET编程详解 一. 网络中进程之间如何通信 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统 ...
- Linux的SOCKET编程详解——非常叼
http://blog.csdn.net/hguisu/article/details/7445768/ 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Linux的SOCKE ...
最新文章
- Eclipse主题更换方法
- MIT用19个神经元实现自动驾驶控制,灵感来自秀丽隐杆线虫
- for、while循环及其变体
- JavaScript数据结构与算法——集合
- ZOJ 3300 Mahjong DFS暴力解决。。
- mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制
- Presto常用命令:查看版本号
- 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
- NLP【07】transformer原理、实现及如何与词向量做对接进行文本分类(附代码详解)
- 欧姆龙服务器数码管不显示问题,数显仪表常见故障的原理分析以及解决方案
- 动态菜单,根据登录用户权限返回不同菜单,登录完成跳转到不同的首页
- 利用VBA在Excel中批量画图
- Qt - QTChart绘制图表
- 两个字符串中最长公共单词 C语言
- 四川大学2014年数学分析考研试题
- GCC NOT FOUNT
- mysql修改初始化得到的密码
- 无聊的游戏 Beta 0.1
- ProGuard入门
- 让AURIX Development Studio变得更好用
热门文章
- linux终端文件名前特殊符号,Linux特殊符号大全
- Fbank特征与MFCC特征解析
- 学c语言学生智商要搞么,作为一个学渣,哥来告诉你如果你智商不够该怎么办...
- python123新版个人所得税计算请输入正数_Python训练的数字组合,个人所得税计算,完全平方数,python,之...
- 初识Python自动化运维(一)
- 计算机多媒体作业是什么,多媒体计算机技术作业一
- 梦三显示服务器列表,梦三国开服表_梦三国开服时间表_梦三国最新开服_9K9K手游网...
- Rest-assured框架详解
- 在windows 20003 下IIS6.0支持PHP的配置方
- gif动图怎么制作?gif在线制作方法,一键制作超简单