【dsPIC33E】Bootloader(一)Bootloader的介绍与Flash结构

发布者:GoldenDream最新更新时间:2020-05-17 来源: eefocus关键字:dsPIC33E  Bootloader  Flash结构 手机看文章 扫描二维码
随时随地手机看文章

对于嵌入式开发而言,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文件。

关键字:dsPIC33E  Bootloader  Flash结构 引用地址:【dsPIC33E】Bootloader(一)Bootloader的介绍与Flash结构

上一篇:【PIC32MZ】PWM呼吸灯
下一篇:【dsPIC33E】Bootloader(二)Microchip的Hex文件结构介绍

推荐阅读最新更新时间:2024-11-12 18:00

MSP430单片机的FLASH与存储器结构(1)
简介: 我们这节课的主要内容有: ·存储器结构 ·片内ROM组织 ·RAM和外围模块组织 ·FLASH存储器 ·FLASH操作程序设计 1,存储器结构 1.1存储空间的组织结构 我们先来看一下MSP430的存储空间的组织结构,大家可以看到,MSP430是按照64K的存储空间来处理的,只不过不同型号的单片机它内部的容量发生了一些变化。像有些单片机RAM会很大,flash想回会小一些;还有一些flash和RAM都很小,中间空出来的就是作为保留区域,像我们使用的这个149单片机的话,使用的60K的flash,flash空间就是从0FFFFh-01100h。还有就是1K的启动ROM,然后这是RAM的地址,然后下面这里的地址都是
[单片机]
MSP430单片机的<font color='red'>FLASH</font>与存储器<font color='red'>结构</font>(1)
STM8做IAP(Bootloader)时在RAM中执行Flash块擦写函数问题
1、STM8的外设库驱动提供了很多代码,要求不高的话直接用库驱动即可 2、Flash块擦写速度快,但是必须要把函数放到RAM中执行(因为MCU的是NorFlash,普通的函数都是直接在Flash上执行的) 官方库如下 /** * @brief Erases a block in the program or data memory. * @note This function should be executed from RAM. * @param FLASH_MemType : The type of memory to erase * @param BlockNum : Indicates the bl
[单片机]
BootLoader —— S3C2440
先来看看扬创的bootloader的实现方法: 首先:在汇编中初始化堆栈,中断向量表,MMU,时钟,串口等,然后跳到C语言的Main函数。这部分代码小于4K,放在block0。这个Main函数用来将第二段代码拷备到DRAM中并执行。 其次:进入第二段代码。第二段代码也是先在汇编中初始化堆栈,中断向量表等,然后跳到C语言的Main函数。这部分代码就不用有4K限制了,具体大小由第一段代码决定,因为它本身由第一段代码来搬运。这个Main函数用来显示开机图片以及进度条。然后视串口接收信息运行带有USB下载NK的Eboot或是读取NK映像,启动WINCE系统。 最后:进入第三段代码。这段代码用于通过USB将PC上的NK.nb0或
[单片机]
AVR-atmega16 BOOTLoader 程序
本程序参照马潮mega128的编写。可支持485或232接口。变异软件ICCAVR,上位机软件应用超级终端或avrubd等,Xmodem,9600,8,1,n #include iom16v.h #include macros.h #include eeprom.h #define SPM_PAGESIZE 128 //M16的一个Flash页为128字节(64字),共128页 #define BAUD 9600 //波特率采用9600bps #define CRYSTAL 14745600 //系统时钟 ?? M Hz //计算和定义M16的波特率设置参数 #define BAUD_SETTING (
[单片机]
stm32最简单的实现BootLoader
在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序。也就是IAP升级。 在了解完基本的实现原理后,可以做到用上位机升级(一般的产品大多采用这种方式,显得非常专业 有专用的升级软件,其实背后原理就是BootLoader升级方式)。当然还有一些联网在线升级也是如此。 网上有非常多的文件有介绍过stm32 BootLoader的实现。但是讲的可能比较深入难以理解, 实现更是无从下手。今天这里注意介绍最简单实现的方式,关键代码只有几行,每错,真的就只有 几行。 主要实现芯片是stm32f103c8t6,rom是64K 我实现的基本思路: 我们需要为BootLoader程序和APP程序分配空间,因为BootLoader
[单片机]
__main() 和 main()
__main() 和 main()(转载) 因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置,可能会与我们的初始化发生冲突,故在我们做好初始化后最好别调用__main()。仿真时若调了__main()且没设置entry会报警告,__main()库函数代码不太了解,估计跟ADS初始化有关,库函数__main()要慎用。 当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是: IMPORT main B
[单片机]
2440的flash、linux、bootloader
开始拿到2440板的时候不知道norflash ,nandflash等等干什么的,还有SDRAM有是什么,还有linux系统装在哪里,怎么装,supervivi有是什么等等很多的问题,今天大概简单的理清楚这里关系。 首先分开flash与SDRAM,这俩个其实我们都使用过,flash,U盘就是一块flash,主要是掉电不易失,至于norflash和nandflash都是flash只是工艺,读写速度,性能,造价等等不同,一般说nandflash可以做的很大,现在大的可以有几G了,好多开发板上面都是1G的了,而且造价便宜,但是nandflash容易产生坏块。而norflash一般比较小,几M,造价比较贵,但是不容易产生坏块,性能较好
[单片机]
14.Bootloader设计思路
在前面,已经了解了很多裸机的知识,也建立了一个测试汇编代码的工程。这些工作其实是为这里来学习Bootloader做铺垫的。 这一节的索引:图1-1: 图1-1 一个嵌入式的存储设备通过通常包括四个分区: 第一分区:存放的当然是u-boot 第二个分区:存放着u-boot要传给系统内核的参数 第三个分区:是系统内核(kernel) 第四个分区:则是根文件系统 Bootloader的作用: 其实Bootloader主要的必须的作用只有一个:就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行,我们称之为启动加载模式,该过程没有用户的介入,是它正常工作的模式。它的步骤如下: Stage1: 1. 硬件设备初始化。
[单片机]
14.<font color='red'>Bootloader</font>设计思路
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved