历史上的今天
返回首页

历史上的今天

今天是:2025年05月17日(星期六)

2020年05月17日 | 【dsPIC33E】Bootloader(一)Bootloader的介绍与Flash结构

2020-05-17 来源:eefocus

对于嵌入式开发而言,Bootloader几乎与操作系统同等重要,它可以让我们摆脱MCU官方工具,定制自己的烧录工具,不仅提高产品辨识度,同时也大大减少了对外引脚数量(例如兼容通信的Uart或CAN等,而不需要另外接JTAG)。


要开发Bootloader,相对于普通程序,是有一定难度的,这其中涉及到MCU的工作原理、内部存储结构等,而且仅仅依靠C语言可能无法完成,有时需要配合汇编来精确执行特殊指令(例如Flash擦写)。


一般MCU的机器码都是存储在Flash中,MCU启动时PC指针会从内部Flash第一个地址开始读取指令运行,这个过程我们一般无法干涉。但由于我们写的代码存于Flash中,所以一旦从Flash启动,后续操作就完全可以由我们来指定,我们可以指定程序执行位置。


对于低端MCU来说,我们可以通过在Flash初始的位置设置指令,来启动内部不同flash区域的程序,以及烧写程序到这些flash区域,这些操作集合叫做Bootloader。Bootloader承担着用户程序的烧写以及跳转。


对于高级MCU或者CPU来说,可以轻松映射外部存储(外部Flash、U盘、硬盘等),MCU启动后,我们可以指定其从哪个存储启动,甚至通过通信接口接收数据存储到这些外部存储。这些操作集合在嵌入式操作系统中一般称之为UBoot,在PC中称之为BIOS,外部存储一般存放的是操作系统。


实际上上述两种功能是一样,后者相对复杂一点,此处我们着重讲述前者。


下图为通用MCU带Bootloader程序和用户程序的Flash存储结构:

常规Bootloader逻辑是这样的:


1、开机Goto到Bootloader的Main函数


2、判断是否有按键按下或者是否接收到通讯命令


3、若有操作,则停留在Bootloader,执行后续操作,例如烧录程序


4、若超过一定时间未有操作或者命令,进入用户程序


注意:


1、Bootloader应从Flash第二页之后开始,避免擦除编程中断向量表时,导致Bootloader缺失故障。


2、Bootloader中不要使用中断,因为Bootloader和用户程序共用中断向量表,更新用户软件会重新修改IVT。


以下详细介绍dsPIC33E系列Flash操作。


对于dsPIC33E系列,内部Flash存储如下,对于部分低端MCU,部分区域(例如附属闪存)是没有的,详细参考该MCU的Datasheet:

而以dsPIC33EP256GP506为例,很多空间被阉割了,实际flash结构如下:

下面讲讲如何在MCU运行时,对内部Flash进行擦除、编程(注意,建议不要对当前程序运行区域进行擦写,会导致运行异常)。


Flash编程相比于EEPROM,要麻烦不少。


Flash编程采用的方式是与模式,即编程时,将数据与Flash地址上的数据与操作。因此,如果一个地址上的数据位不是全都为1,那么编程该地址的结果就是错误的,所以我们在操作Flash时要有一个共识,即,同一个地址不应该被编程超过2次。我们可以在第二次编程前,将该地址所有数据位全部置1。

我们该如何在编程前将对应地址的数据位全部置1呢?


那就是擦除,Flash擦除会把对应区域的数据位全部置1。但是。。。擦除不能仅擦除一个地址的数据,而是必须擦除一页的数据,那么一页的大小是多少呢?是1024个指令字,一个指令字为32位(实际24位,高8位为虚字节,始终保持为0),由于dsPIC33E系列都是16位单片机,因此每个指令字占2个16位数据,占2个地址,实际擦除的地址跨度为2048,即0x800。假设我们擦除0x000000,实际会擦除0x000000-0x0007FF,擦除其中任意地址,都会擦除该页。

基于以上原因,若是我们要编程某部分flash数据,需要先将该页内所有数据读出来,然后擦除flash页,再修改读出来的数据,最后重新写入该页所有数据。


dsPIC33E系列编程功能体现在闪存控制寄存器NVMCON的NVMOP<3:0>中。通用功能如下,实际功能可能会有所阉割,参考对应数据手册。

编程时可以进行行编程、字编程、单个配置寄存器字节编程,一行为128个指令字,字编程为2个指令字,单个配置寄存器字节编程比较特殊,不需要擦除,可以直接编程,但需要注意的是,编程配置字时,时钟只能是FRC,不能带PLL。能否进行行编程依赖于写锁存器长度,写锁存器在0xFA0000处,部分长度只有2个指令字,所以无法进行行编程。


针对我们使用的示例单片机,dsPIC33EP256GP506,参考Datasheet我们发现:


这款单片机功能阉割较多,只支持也擦除和双字编程,其写锁存器只有2个指令字。同时,这款单片机的无法编程配置字,所以在更新用户程序时,不能通过Bootloader烧写配置字。


最后,需要提醒的是,由于配置字在用户存储区域最后一页,擦除最后一页会触发代码保护,所有地址数据全部清零。以dsPIC33EP256GP506为例,0x02A800之后的地址不能擦除。


本节到此结束,下一节将剖析dsPIC33E系列程序编译后的Hex文件。

推荐阅读

史海拾趣

Densitron公司的发展小趣事

人才是企业发展的关键因素。Densitron公司非常重视人才的培养和团队建设。公司建立了一套完善的人才培养机制,通过内部培训、外部学习等方式,不断提升员工的技能水平和综合素质。同时,公司还注重团队文化建设,鼓励员工之间的协作与交流。这些举措使得Densitron公司拥有一支高素质、高效率的团队,为公司的持续发展提供了有力保障。

ACEINNA公司的发展小趣事

在全球环保意识日益增强的背景下,Densitron公司积极响应环保号召,将绿色可持续发展作为公司的重要战略之一。公司投入大量资源研发环保型产品和技术,减少生产过程中的能源消耗和污染排放。同时,公司还积极参与环保公益活动,推动整个行业的绿色发展。这些努力不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上即为基于电子行业背景为Densitron公司虚构的5个发展故事。这些故事虽然并非基于真实事件,但反映了电子行业普遍关注的技术创新、市场拓展、行业变革、人才培养和绿色发展等关键要素。

Comax Industrial Co Ltd公司的发展小趣事

随着公司的不断发展壮大,Comax Industrial Co Ltd公司开始积极拓展市场。公司不仅在国内市场取得了显著的成绩,还积极进军国际市场,与多个国家和地区的客户建立了稳定的合作关系。通过参加国际展会、建立海外分支机构等方式,公司的业务范围逐渐扩大,市场份额也持续提升。这种市场拓展的策略,使得Comax实现了跨越式的发展。

巴丁微公司的发展小趣事

深圳市巴丁微电子有限公司,简称巴丁微,自创立之初便专注于高性能模拟集成电路的研发与销售。公司的创始人及核心团队由一群在集成电路行业拥有丰富经验的专家组成,他们看中了电子行业的巨大潜力,决心以技术创新为驱动力,推动模拟集成电路的发展。

在创立初期,巴丁微面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借着对技术的深刻理解和不懈追求,巴丁微成功研发出了一系列具有竞争力的产品,并逐渐在电机驱动和电源管理等电子领域获得了市场认可。

Hantronix公司的发展小趣事

随着业务的不断增长,HANBIT Electronics意识到全球化布局的重要性。2010年,公司在韩国本土之外的首个生产基地——中国东莞分公司正式成立。这一举措不仅有效降低了生产成本,还大大缩短了产品交付周期,提高了对亚洲市场的响应速度。同时,公司还积极在欧洲和美国等地设立研发中心和销售网络,实现了从研发、生产到销售的全球化布局。这一战略调整极大地增强了HANBIT Electronics在全球电子市场的竞争力。

FEI Microwave Inc公司的发展小趣事

FEI Microwave Inc公司自成立以来,始终致力于微波技术的创新与发展。在早期,公司研发团队成功研发出了一款具有突破性的微波收发模块,该模块以其高频率、低噪声和出色的稳定性迅速在市场上崭露头角。随着技术的不断完善,FEI Microwave Inc公司逐渐在微波通信领域建立了自己的技术壁垒,成为业界的佼佼者。

问答坊 | AI 解惑

如何选择数字万用表

仔细阅读DMM说明书 从资料上看, 数字多用表 (DMM) 的模式有几百种之多。为了挑选出合用的 DMM 是一件很伤脑筋的事。问题是如何找到价钱适当而性能符合需要的 DMM。在选择之前, 先要确定需要测量的量值是什么。 你做精密的计量工作吗 ? 真的是用 ...…

查看全部问答>

稳压电源

智能车比赛…

查看全部问答>

djyos含example的0.2.0版本发布了!!!内含example的教程。

大家可以到 www.djyos.com 下载,有问题,可以加QQ群:62419319 讨论。…

查看全部问答>

Wince自启动问题

在设置程序自启动时,我采用两种方法, 1、将程序名改为explorer.exe,然后放到Release文件夹里,覆盖原有的explorer.exe,这样做成的bin文件在启动后出现了这个错误:50 was not found 2、更改shell.reg。程序名为final.exe    [HK ...…

查看全部问答>

【VxWorks5.x -->VxWorks6.x 移植问题】

大家好,谁有没有做过 PPC的BSP 从 5.X ---> 6.X 的移植啊? 我所知道的是,从6.x对5.X的支持是兼容的,那么我就先把 5.X 的BSP文件夹 如 ppc_myself_XXX 放到 h/config/ 下,然后新建立 BSP 工程,进行编译,可是编译的时候,发现ERROR超多啊 ...…

查看全部问答>

并口驱动开发求助!!!很急.

#include #include #include #include #include #include #include #include #include #include #include #include #include #include MODULE_LICENSE(\"Dual BSD/GPL\"); int parlelport_major=61; int port; stat ...…

查看全部问答>

香帅:在哪可以找到STM32的USB在PC端的驱动

想看看STM32的USB,没找到驱动,不过在ST的网上找到的固件包,ST-Dfuse里好像也没驱动,找到模拟串口和stick鼠标的就OK了,谢谢.…

查看全部问答>

cmd文件怎么写啊

c语言写源程序,可不知道写cmd文件, 求高手赐教啊…

查看全部问答>

FPGA实现高速传输模块

跪求,请问哪位高手有关于FPGA实现高速传输的源代码或者相关资料? 本人在做相关的学习工作,本人的邮箱: ziqiang10@126.com…

查看全部问答>

基于flash的dsp的tms320c6414自启动

我用的dsp是tms320c6414,flash采用的是SST39vf160x,按8bit存储方式把程序代码下载到flash中,然后编写了boot.asm,boot.asm中二次启动的代码也是按8bit从dsp的emifb(dsp的emifb与flash相连)搬移到sram中,可以实现dsp自启动功能。但是由于SST39v ...…

查看全部问答>