-
KEIL----
单片机实现自定义
bootl
oader
,用于程序更新
2013-04-07 15:45:05|
分类:
我的自学实践
|
举报
|
字号
订阅
关于
8051
的
bootloader
实现方式
一,
基本硬件需求
要实现
IAP
功能,需要
51
单片机
可以在程序里修改代码空间的
Flash
,或者至少可
以修改用户程序区的
Flash
,新出的
51
大部分都能满足这个要求
二,
空间划分
一般
bootloader
位于单片机代码空间的起始地址,用户程序在后面。这个需要根
据
实际的需求来决定,
bootloader
< br>功能简单,就少占用一些,
bootloader
功能复
杂的
就多占用一些。除此之外,一般还要根据
Flash
的页为界线划分。附带的工程模板
里,
boo
tloader
使用
0x0000-0x0fff
区间,用户程序使用
0x1000
以后的空间。
p>
三,
中断的处理
51
单片机的中断入口一般位于
0
地址开始的区间,无法修改,
但是根据上面的空间
划分方式,这个区间位于
bootload
er
的范围,是不能随意更改的。所以代码里用了
一个软件的方
式对中断入口做了重映射处理,后面将结合具体的代码介绍实现方
式。
< br>
四,
Bootloader
的处理
1
,
建立
工程的时候,选择把
Startup.a51
添加到工程
2
,
在
Startup.a51
里添加如下代码:<
/p>
ORG 0003H
LJMP 2003H
ORG 000BH
LJMP 200BH
ORG 0013H
LJMP 2013H
ORG 001BH
LJMP 201BH
ORG 0023H
LJMP 2023H
………………………….
根据具体型
号的中断数量和地址,添加中断跳转代码,格式为
ORG XXH LJMP <
/p>
2000+XXH,
这样做,是为了将中断映射到用户程序区的<
/p>
0x2000
开始的空间,在
用户程序里
,还要做一些对应的设置,后面将介绍。
3
,
Bootloader
的处理流程。
Bootloader
的主要作
用一般是开机初始化,自检和
升级用户程序,以及引导用户程序。因为上面已经把中断映
射到用户程序空间,
所以
bootloader
里最好就不要用中断了。
五,
用户程序的处理。
1
,
用户
程序的
Startup.a51
无特殊需求,可以根据需要选择
添加到工程,然后自
己做修改,也可以不添加到工程,由编译器连接一个默认的
startup.a51
2
,
用户
程序的所有普通函数和中断函数也没有特殊要求,可以按正常的方式编写
3
,
用户
程序的工程设置。因为用户程序不再是从
0
地址开始,所以需要
在工程设
置里做定位处理:设置用代码的范围,定位用户代码入口地址。具体设定如下<
/p>
图:
因为用户代码规划到
0x1000
以后的空间,所以设置
code ra
nge
从
0x1000
开始
为了让
bootloader
< br>能准确跳到用户程序入口,所以需要将
C_C51STARTUP
定位到
0x1000
位置。(
C_STARTUP
位于
startup.a51
里,它才是程序的真正入口,而不
是
main
函数;另外,入口也并不是必须定位在这个位置,只要位于用户代码空
间就可以)
4
,
中断
映射。在
bootloader
里,将中断入口定位在了
0x2000
开始的空间,在用
户程序里,也
必须做一个对应的设置。方法如下:
这样处理之后,便完成了中断的映
射。当中断发生时,会先进入位于
bootloader
里的硬
件中断入口,然后在那里跳转到
0x2000
开始的一个软件重
定
义的向量表,再跳转到中断入口函数。和没有
bootloa
der
的方式比起来,这样
做会多一次
LJMP
跳转,但是一般情况下影响不大。
关于
bootloader
存放位置:
备注:其实,最好是将
bootloader
程序放到最后,这样,应用程序起始地址,
中断地址等不用设置,默认程序从
0x0000h
开始执行,然后用函数指针跳转到
bootloader
程
序起始地址,让其先执行。通过
bootloader
内部程序
选择是否
升级应用程序还是直接跳转回应用程序区执行。
若升级,就读写
flas
h
的应用程序部分。若不升级,就跳转回应用程序继
续运行。<
/p>
-
-
-
-
-
-
-
-
-
上一篇:水杨酸与茉莉酸调控植物抗性综述
下一篇:新闻十则