|
讨论一种8051的bootloader的实现方式
[复制链接]
大虾网上的一个想法,觉得不错,设想了一种8051的bootloader实现方式,欢迎大家讨论
前提:单片机的所有FLASH可通过程序修改
FLASH内存划分:
0x0000-0x0fff:Bootloader
0x1000-0xffff:用户程序
Bootloader处理方式:
在startup.a51里,加入这样一段:将所有中断映射到0x1000开始的位置,根据单片机终端数目多少,可对这样一段做调整
ORG 00003H
LJMP 01003H
ORG 0000BH
LJMP 0100BH
ORG 00013H
LJMP 01013H
ORG 0001BH
LJMP 0101BH
ORG 00023H
LJMP 01023H
ORG 0002BH
LJMP 0102BH
ORG 00033H
LJMP 01033H
ORG 0003BH
LJMP 0103BH
Bootloader的程序要求:不能使用任何中断,只能使用查询方式。
Bootloader处理流程:
开机后,检测用户程序的校验,如果错误,则进入升级模式;然后检测用户输入,看是否有强制进入升级模式的需求,如果
有,则进入升级模式。
如果不进入升级模式,则跳转到0x1200
如果进入升级模式,则对于用户传过来的用户程序,只升级0x1000以后的部分,0x1000以前的部分抛弃
Bootloader可以用C语言来写,代码范围限制在4K以内
用户程序要求:
Startup.a51里,同样加入bootloader那一段。正在正常升级模式下,这一段是会被抛弃的,但是这样处理,可以让用户能在
离开bootloader的情况下单独调试。
在Keil 工程属性里,将Interrupt vector的位置改到0x1000,和bootloader里映射的中断向量表对应。
在KEIL 的BL51 Locate里,将?C_C51STARTUP函数定位到0x1200,和bootloader里设定的跳转位置对应。
除此之外,用户程序没有别的任何限制。
|
|