首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32的BootLoader 从SD卡更新固件(2)

STM32的BootLoader 从SD卡更新固件(2)

3.3       分散加载文件相关这一节涉及的内容主要属于分散加载文件,大家具体上网了解,这里只是介绍了能够实现BootLoader的一小部分。
3.3.1   C语言的函数地址我们知道C语言的函数名就是函数的地址,并且STM32单片机ROM的起始地址是在0x08000000,那么使用编译器编译程序的话(这里使用的是RVMDK),函数的地址默认都在以0x08000000为首的一段ROM里面了。比如我们一个函数Delay(),它的地址可以是0x08000167CortexM3中函数的地址0bit位一般是1),也就是Delay函数的代码在0x08000167C语言函数调用Delay时,就是执行0x08000167的代码。
3.3.2   BootLoader占用的ROM我们需要注意的问题是,如果不修改程序默认的起始地址的话,那么BootLoader和新App程序的起始地址都是0x08000000,也就是他们重叠了(代码重叠),这样的话肯定相互之间有影响,程序是不能正常工作的。
这里的解决方法是,BootLoader程序依然占用0x08000000为首的那段ROM,因为STM32的默认就是从0x08000000运行程序的。保持BootLoader程序先能正确运行。然后App使用除BootLoader占用ROM以外的空间。这里需要知道BootLoader到底占用了多少ROM,很简单,查看MAP文件就行了。这里以我的BootLoaderMAP文件为例说明一下,看截图:
Memory Map of the image
  Image Entry point :0x08000131
  Load Region LR_IROM1 (Base: 0x08000000,Size: 0x00006da4, Max: 0x00080000, ABSOLUTE)
   Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00006d54, Max:0x00080000, ABSOLUTE)
主要是这句话“Base:0x08000000, Size: 0x00006da4, Max: 0x00080000这句话说明了我的BootLoader程序是从0x08000000开始,占用了0x00006DA4大小。只要我们的App不要和BootLoader程序占用的空间冲突就可以了。我的App程序的起始地址选择为0x08070000,不与BootLoader程序冲突。具体怎么修改ROM起始地址,下面介绍。
3.3.3   修改ROM起始地址编译新程序的时候,我们要修改程序的起始地址,我的修改方法如下(开发环境是RVMDK):打开TargetOption...,切换到Target选项卡,如下
从SD卡更新固件">
修改IROM1的起始地址和长度:
比如,为了不产生地址冲突,我将起始地址0x08000000修改成0x0807000,将ROM长度0x80000修改成0x10000。如下图所示(左图为修改前、右图为修改后):
从SD卡更新固件">  从SD卡更新固件">
注意:BootLoader程序是不需要修改的,只是App需要修改(App就是使用BootLoader下载的程序)。
3.4       hex文件和bin文件3.4.1   hex文件平时我们用j-Link或者串口下载程序的话,都是打开hex文件下载的,因为hex文件包含地址信息,下载程序的时候知道程序下载到ROM的哪个区域。从另一个角度上说,也就是hex文件是不能直接写进ROM的,一边写需要一边转换(解码出地址信息,将对应内容写入ROM)。
3.4.2   bin文件bin文件的话,很好理解,是直接的可执行代码。也就是bin文件的内容跟下载ROM里面的内容是一样的。bin文件是没有包含地址信息的,所以在下载之前要知道bin文件是要下载到ROM的那个区域。
我们的BootLoader下载的是bin文件,直接写进STM32Flash里面,地址信息的话就是上一节的IROM0x08070000,从0x08070000开始连续写入,中间不间断。
3.5       Bin文件生成默认情况下编译后生成的是hex文件,不过很轻松可以生成bin文件。介绍具体怎么生成bin文件,工具的话是使用fromelf.exe(目录一般是在Keil安装目录里面,本人的fromelf.exe目录是在C:\Keil\ARM\ARMCC\bin),我们是使用fromelf工具将axf文件转换为bin文件。
熟悉命令行的同学可能会选择直接敲命令,不过这里介绍使用RVMDK提供的用户命令(编译时可以自动生成bin,省去每次生成bin文件都要敲命令的过程)。
继承事业,薪火相传
返回列表