首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» STM32的BootLoader 从SD卡更新固件(2)
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
STM32的BootLoader 从SD卡更新固件(2)
发短消息
加为好友
yuyang911220
当前离线
UID
1029342
帖子
9914
精华
0
积分
4959
阅读权限
90
在线时间
286 小时
注册时间
2014-5-22
最后登录
2017-7-24
论坛元老
UID
1029342
性别
男
1
#
打印
字体大小:
t
T
yuyang911220
发表于 2015-3-29 12:03
|
只看该作者
STM32的BootLoader 从SD卡更新固件(2)
BootLoader
3.3
分散加载文件相关
这一节涉及的内容主要属于分散加载文件,大家具体上网了解,这里只是介绍了能够实现
BootLoader
的一小部分。
3.3.1
C
语言的函数地址
我们知道
C
语言的函数名就是函数的地址,并且
STM32
单片机
ROM
的起始地址是在
0x08000000
,那么使用编译器编译程序的话(这里使用的是
RVMDK
),函数的地址默认都在以
0x08000000
为首的一段
ROM
里面了。比如我们一个函数
Delay()
,它的地址可以是
0x08000167
(
CortexM3
中函数的地址
0bit
位一般是
1
),也就是
Delay
函数的代码在
0x08000167
,
C
语言函数调用
Delay
时,就是执行
0x08000167
的代码。
3.3.2
BootLoader
占用的
ROM
我们需要注意的问题是,如果不修改程序默认的起始地址的话,那么
BootLoader
和新
App
程序的起始地址都是
0x08000000
,也就是他们重叠了(代码重叠),这样的话肯定相互之间有影响,程序是不能正常工作的。
这里的解决方法是,
BootLoader
程序依然占用
0x08000000
为首的那段
ROM
,因为
STM32
的默认就是从
0x08000000
运行程序的。保持
BootLoader
程序先能正确运行。然后
App
使用除
BootLoader
占用
ROM
以外的空间。这里需要知道
BootLoader
到底占用了多少
ROM
,很简单,查看
MAP
文件就行了。这里以我的
BootLoader
的
MAP
文件为例说明一下,看截图:
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
文件,直接写进
STM32
的
Flash
里面,地址信息的话就是上一节的
IROM
,
0x08070000
,从
0x08070000
开始连续写入,中间不间断。
3.5
Bin
文件生成
默认情况下编译后生成的是
hex
文件,不过很轻松可以生成
bin
文件。介绍具体怎么生成
bin
文件,工具的话是使用
fromelf.exe
(目录一般是在
Keil
安装目录里面,本人的
fromelf.exe
目录是在
C:\Keil\ARM\ARMCC\bin
),我们是使用
fromelf
工具将
axf
文件转换为
bin
文件。
熟悉命令行的同学可能会选择直接敲命令,不过这里介绍使用
RVMDK
提供的用户命令(编译时可以自动生成
bin
,省去每次生成
bin
文件都要敲命令的过程)。
收藏
分享
评分
继承事业,薪火相传
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议