历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2020年09月16日 | KEIL-51单片机实现自定义bootloader,用于程序更新

2020-09-16 来源:51hei

本文原创作者: 少占鱼大神
关于8051的bootloader实现方式

一,基本硬件需求

要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求

二,空间划分

一般bootloader位于单片机代码空间的起始地址,用户程序在后面。这个需要根据实际的需求来决定,bootloader功能简单,就少占用一些,bootloader功能复杂的就多占用一些。除此之外,一般还要根据Flash的页为界线划分。附带的工程模板里,bootloader使用0x0000-0x0fff区间,用户程序使用0x1000以后的空间。

三,中断的处理

51单片机的中断入口一般位于0地址开始的区间,无法修改,但是根据上面的空间划分方式,这个区间位于bootloader的范围,是不能随意更改的。所以代码里用了一个软件的方式对中断入口做了重映射处理,后面将结合具体的代码介绍实现方式。

四,Bootloader的处理

1, 建立工程的时候,选择把Startup.a51添加到工程
2, 在Startup.a51里添加如下代码:

ORG      0003H

                                     LJMP     2003H

                                     ORG      000BH

                                     LJMP     200BH

                                     ORG      0013H

                                     LJMP     2013H

                                     ORG      001BH

                                     LJMP     201BH

                                     ORG      0023H

                                     LJMP     2023H

                           ………………………….

根据具体型号的中断数量和地址,添加中断跳转代码,格式为ORG  XXH   LJMP 2000+XXH,这样做,是为了将中断映射到用户程序区的0x2000开始的空间,在用户程序里,还要做一些对应的设置,后面将介绍。

3, Bootloader的处理流程。Bootloader的主要作用一般是开机初始化,自检和升级用户程序,以及引导用户程序。因为上面已经把中断映射到用户程序空间,所以bootloader里最好就不要用中断了。



五,用户程序的处理。

1, 用户程序的Startup.a51无特殊需求,可以根据需要选择添加到工程,然后自己做修改,也可以不添加到工程,由编译器连接一个默认的startup.a51

2, 用户程序的所有普通函数和中断函数也没有特殊要求,可以按正常的方式编写

3, 用户程序的工程设置。因为用户程序不再是从0地址开始,所以需要在工程设置里做定位处理:设置用代码的范围,定位用户代码入口地址。具体设定如下图:

因为用户代码规划到0x1000以后的空间,所以设置code range从0x1000开始

为了让bootloader能准确跳到用户程序入口,所以需要将C_C51STARTUP定位到0x1000位置。(C_STARTUP位于startup.a51里,它才是程序的真正入口,而不是main函数;另外,入口也并不是必须定位在这个位置,只要位于用户代码空间就可以)


4,  中断映射。在bootloader里,将中断入口定位在了0x2000开始的空间,在用户程序里,也必须做一个对应的设置。方法如下:


这样处理之后,便完成了中断的映射。当中断发生时,会先进入位于bootloader里的硬件中断入口,然后在那里跳转到0x2000开始的一个软件重定义的向量表,再跳转到中断入口函数。和没有bootloader的方式比起来,这样做会多一次LJMP跳转,但是一般情况下影响不大。

关于bootloader存放位置:
备注:其实,最好是将bootloader程序放到最后,这样,应用程序起始地址,中断地址等不用设置,默认程序从0x0000h开始执行,然后用函数指针跳转到bootloader 程序起始地址,让其先执行。通过bootloader内部程序选择是否升级应用程序还是直接跳转回应用程序区执行。
若升级,就读写flash的应用程序部分。若不升级,就跳转回应用程序继续运行。


BOOTLOADER 程序举例:

#include

//用户程序起始地址

#define USER_APP_ADDR        0x1000



char power_on_test(void);

char check_upgrade_request(void);

char upgrade(void);



void main(void)

{

//定义一个函数指针,用于跳转到用户程序

void (*boot)() = USER_APP_ADDR;

//bootloader里不能开启中断

EA = 0;

//添加系统初始化代码

if(power_on_test()){//开机自检

upgrade();

}

else if
(check_upgrade_request()){//检查是否有升级需求

upgrade();

}

//如果不需要升级,或者升级已经完成,执行下面的代码进入用户程序

(*boot)();

//正常情况下不会运行到这里,以防万一

while(1);

}



char power_on_test(void)

{

//添加开机自检代码,如果自检错误,进入升级模式

return 0;

}

char check_upgrade_request(void)

{

//添加检查用户是否有升级要求的代码,例如输入命令或按下按键,如果有,则进入升级模式

return 0;

}

char upgrade(void)

{

//添加传输升级文件和升级用户程序区的代码

return 1;

}


用户程序:

#include

//main函数无特殊要求

void main(void)

{

while(1);

}

//中断函数无特殊需求,可根据需求随意添加

void UART_ISR(void) interrupt 4

{



return;

}
工程配置如下
 

六,关于升级文件

升级文件的传输可以根据需要使用任何方式,例如串口,网络,USB,存储卡等。升级文件的传输可以做在bootloader里,也可以做在用户程序里,或者两种方式都有。一般来说,bootloader的代码比较简单,不适合做复杂的传输方式。如果传输方式比较复杂,可以在用户程序里传输升级文件,暂存到一个外部存储器,然后跳转到bootloader,让bootloader从外部存储器读出并升级用户程序。升级的时候要注意用户代码的范围。

为了传输的可靠性,升级文件一般还会添加一个文件头,里面包含一些基本的文件信息,例如长度,校验等,这些可以通过编写一些简单的工具来完成。

另外,推荐一些升级文件的传输方式,做bootloader的时候可以考虑

1 ,串口。可以考虑使用XMODEM协议传输升级文件,因为这是一个比较标准的传输协议,很多现成的软件可以支持,例如Windows下自带的超级终端就可以实现(XP以后的系统没有超级终端,但是也有一些别的软件可以代替,例如SecureCRT)


2, USB主机。可以用U盘方式升级。升级文件取一个特定文件名,放在特定位置,主机读取到文件后自动升级

3, USB从机。可以让从机虚拟成一个U盘,PC把文件复制到这个虚拟U盘就完成升级。这样就不需要编写专门的升级软件

4, 以太网。

a)TFTP,这是标准的文件传输命令,Windows自带,而且协议简单

b)Web。用网页的方式,界面有好直观,用网页浏览器就可以实现,也不用单独开发专用的升级软件。

推荐阅读

史海拾趣

广州基安彼(GMB)公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,机顶盒是指任何能与电视机连接的网络终端设备,它不仅是传统电视信号的接收与转换装置,更是连接电视与互联网的桥梁。

机顶盒的核心功能在于接收并处理来自各种传输介质的数字信号,包括有线电视、卫星广播、地面广播以及宽带网络等,然后将这些信号转换成电视机能够识别的视频和音频格式。这一过程涉及信号的接收、解码和显示三大环节,确保了用户能够享受到高清乃至超高清的电视节目。

随着技术的不断进步,机顶盒的功能日益丰富。除了基本的电视播放功能外,现代机顶盒还具备了网络交互能力,支持在线购物、浏览网页、观看网络视频、玩游戏等多种应用。此外,一些先进的机顶盒还集成了人工智能技术,实现了语音助手、智能推荐等便捷功能,极大地提升了用户体验。

总的来说,机顶盒作为家庭娱乐的重要组成部分,不仅丰富了人们的观看选择,还通过其强大的网络交互能力,为用户提供了更为广泛的内容和娱乐体验。随着技术的不断升级和市场需求的不断变化,机顶盒的未来发展将更加值得期待。

Avic公司的发展小趣事

随着中国航空工业的快速发展,Avic公司不断加强在航空电子技术领域的研发和创新。公司成功研制出一系列先进的航空电子系统,这些系统不仅提高了飞机的性能和安全性,也为中国航空工业的国际竞争力奠定了坚实基础。Avic公司在航空电子领域的突破,不仅推动了国内航空工业的发展,也为国际航空市场带来了新的选择。

Ferroperm公司的发展小趣事

Ferroperm公司成立于XXXX年,由一群热衷于电磁材料研究的科学家和工程师共同创立。创立之初,公司便致力于电磁材料和相关产品的研发和生产。通过对市场需求的精准把握和对技术创新的持续投入,Ferroperm很快在电磁材料领域取得了初步的成功,并积累了一定的客户基础。

Greenlee公司的发展小趣事

为了进一步扩大市场份额,GREEGOO公司积极实施全球化战略。公司首先在欧洲市场设立了分支机构,通过参加国际展会、建立销售渠道等方式,成功打入欧洲市场。随后,GREEGOO又陆续在北美、亚洲等地设立分支机构,形成了覆盖全球的营销网络。在全球化布局的过程中,GREEGOO不仅注重产品的本地化适应和品牌建设,还积极与当地企业开展合作,共同开拓新市场。

First Sensor公司的发展小趣事

为了进一步扩大市场份额,GREEGOO公司积极实施全球化战略。公司首先在欧洲市场设立了分支机构,通过参加国际展会、建立销售渠道等方式,成功打入欧洲市场。随后,GREEGOO又陆续在北美、亚洲等地设立分支机构,形成了覆盖全球的营销网络。在全球化布局的过程中,GREEGOO不仅注重产品的本地化适应和品牌建设,还积极与当地企业开展合作,共同开拓新市场。

Galaxy Semi-Conductor Co Ltd公司的发展小趣事

飞虹光电科技集团在转型过程中,相继成立了多家高科技企业,如山西飞虹微纳米光电科技有限公司、山西飞虹半导体照明有限公司等。这些企业之间形成了良好的协同发展机制,共同推进半导体激光器和LED材料的研发与应用。通过产学研一体化模式,飞虹系列企业依托多所高等院校技术平台,不断提升自身研发实力和市场竞争力,为中国电子行业的发展贡献了重要力量。

问答坊 | AI 解惑

新产品快递Allegro’s LED Backlight Driver IC for Large Displays

Allegro’s LED Backlight Driver IC for Large Displays The new device integrates a scalable-output boost controller operating in constant-frequency current mode control – adjustable between 300kHz and 1MHz - drivin ...…

查看全部问答>

【FPGA设计问题】Xilinx的IOBUF移植到Altera器件中,RTL代码如何修改?

Xilinx的IOBUF移植到Altera器件中,RTL代码如何修改? Xilinx的IOBUF移植到Altera器件中,RTL代码如何修改?本人以前使用的是Xilinx的FPGA,现在改用Altera的FPGA,不知道在对双向端口的控制在Altera中是怎样实现的,直接用下面的assign语句可以保 ...…

查看全部问答>

关于WINCE应用程序

我把整个的NAND FLASH读出来,然后通过一些办法把NK文件读出来了。。 但是我发现里面的都是系统文件,里面原先写入NAND FLASH文件的文件不能导出来。请问有什么办法把这些导出来。。 我写个示意图: 00000000H:xx xx xx xx xx xx xx xx xx xx ...…

查看全部问答>

GSM家居电器控制和远程数据采集大讨论,大家快来,有积分!!!

GSM家居电器控制和远程数据采集大讨论大串联,大家快来,有积分!!!…

查看全部问答>

wince驱动新手新手新新手[2]

在一本书里面有着样一段 \"先安装了wince5.0 然后将优龙提供的wince5.0 的BSP,即bvdmain文件夹拷贝到 wince500\\platform目录下\" 请问  是不是必须要 “优龙提供的wince5.0 的BSP”吗? 还是人人的bsp都可以??如果不可以 又请 ...…

查看全部问答>

招聘WINCE人才

招聘:要求计算机专业毕业,一年至三年工作经验,应届话需要优秀才会考虑。       熟练掌握C++或VC编程。       工作环境平台:嵌入式系统跑WINCE操作系统。     公司名:广州日创科技 &nb ...…

查看全部问答>

embedded visual c++4.0安装过程中 sp4安装不成功

尝试很多次,一直安不成功。 本人使用电脑为联想的笔记本,自带操作系统,是不是因为他里面装了一些软件导致冲突造成。 错误提示 Internal Error2349! 非常感谢各位大虾! 另,我是一初学者,还请各位指教本书来尽快上手。…

查看全部问答>

【M4开发板Hanker试用狂-Shower.Xu】9、有容乃大-基于USB设备的SD读卡器实现

失败了无数次之后,一瞬间竟然可以了。成功和失败只隔了一层纸,但是个中滋味却相差甚远...简单记录一下移植过程:1、在SD实现读写的移植基础上展开。2、usb端口初始化和USB鼠标一样,无需改变。3、在此基础上加入下图几个文件usb_msc_structs.c是 ...…

查看全部问答>

菜鸟疑问

各位老鸟们:         我在ccs3.1中定义了一个数组,是全局变量。然后对他赋值,数组前面的元素赋对了,可后面的赋不上,在watch window中后面的元素也不能修改。有没有老鸟遇到过此类情况啊,求分析!!…

查看全部问答>

atmega48ADC两路采集问题

单路采集的时候可以。两路采集的切换也只能采集到一路的信号。我已经把采集到的第一个数据对调了。用的是单次转换…

查看全部问答>