对于嵌入式开发而言,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(一)Bootloader的介绍与Flash结构相关推荐

  1. linux bootloader原理,Bootloader原理详解

    文章一: 1.BootLoader 的介绍 引导加载程序BootLoader 是系统加电后运行的第一段代码.我们熟悉的PC 中的引导程序一般由BIOS 和位于硬盘MBR中的OS bootloader( ...

  2. 【MPC5744P】Flash 结构、启动原理以及内存映射

    与大部分的MCU相同,MPC5744P的Flash.RAM以及外设都映射到内存地址中了.以下为映射地址范围: MPC5744P Flash结构如下: 0x00000000-0x003FFFFF -- ...

  3. SMBIOS介绍(2):结构表

    从 SMBIOS 2.3 版本开始,兼容 SMBIOS 的实现必须包含以下 10 个数据表结构: BIOS 信息 (Type 0) .系统信息 (Type 1) .系统外围或底架 (Type 3) . ...

  4. 智能音箱硬件和软件介绍[上] 硬件结构解析[Soomal]

    科大讯飞 VBOX 智能音箱 - 电路板 Google 谷歌 Google Home 智能音箱 从2014年起,我们先后通过自购和合作厂商获得多个智能语音识别"流派"的品牌音箱产品 ...

  5. Metronic干货系列-介绍和目录结构

    Metronic干货系列 Metronic干货系列-介绍和目录结构 Metronic干货系列-首页(未更新) Metronic干货系列-核心文件js(未更新) Metronic干货系列-核心文件css ...

  6. 多种期权知识点介绍与损益结构模拟

    多种期权知识点介绍与损益结构模拟 前言 一:期权基础知识介绍 二:期权定价理论简介期权定价要素 三:普通香草期权的payoff组合 四:障碍奇异期权的payoff 五:总结 前言 期权是人们为了规避市 ...

  7. 【VUE项目实战】37、商品分类功能介绍和基本结构搭建

    接上篇<36.用户分配角色功能> 上一篇我们完成了为用户分配角色的功能,结束了权限管理模块.本篇我们开启新模块"分类管理"的开发,先进行模块的介绍和基本结构的搭建. 一 ...

  8. 【bootloader】bootloader启动过程分析

    一.    Boot Loader的概念和功能 1.嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分: (1)引导加载程序:其中包括内部ROM中的固化启动代码和 ...

  9. SPI协议分析仪的使用介绍及flash无法启动两种案例分析

    SPI协议分析仪的使用介绍及案例分析 一.协议分析仪介绍 Kingst LA5016 USB 协议分析仪,支持众多标准协议解析,包括:UART/RS232/485,I2C,SPI,CAN,SMBUS等 ...

最新文章

  1. R语言使用subset函数基于组合逻辑筛选dataframe符合条件的数据行(select observations)、并指定需要保留的dataframe数据列或者字段
  2. 概率论快速学习03:概率公理补充
  3. android studio无法新建工程,我刚刚升级了Android Studio3.3.2,但是我不能创建一个新的项目。这里是错误日志。我使用的开发语言是Java。...
  4. C#自定义控件一下拉颜色框
  5. Linux安装/升级pip
  6. 合并BN层到卷积层的原理及实验
  7. 刷新器-Java EE 7后端十大功能
  8. python中的常量可以修改吗_深入理解Python变量与常量
  9. git 学习1--查看全局配置
  10. 【Hadoop Summit Tokyo 2016】数据流与Apache NiFi
  11. tensorflow RGB三通道图转换为灰度图
  12. 多线程小结-----线程参数和 Invoke 机制
  13. 按顺序取html中多个输入框的值,JS获得多个同name的input输入框的值的实现方法
  14. 7-4 华氏度转摄氏度 (5分) java
  15. 计算机自检后反复重启 主引导,电脑开机老是重复重启的解决方法
  16. 创业商业计划PPT模板
  17. 基于R统计分析——样本与分布
  18. 基于JAVA健康生活网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  19. python 比较好的社区
  20. 优雅编程之阿里巴巴开发规范分享及扩展学习(三十八)

热门文章

  1. 系统提测测试阶段准入准出要求
  2. 机器人自主导航 | ROS与移动底盘通信
  3. 为什么学人工智能专业后悔死了?
  4. 抖音火山版(原火山小视频)无水印视频获取
  5. C语言 栈的链表实现
  6. 直流微电网matlab仿真模型,直流微电网控制与仿真.pdf
  7. X.509、PKCS文件格式介绍
  8. Vue 实现拖拽模块(一)拖拽添加组件
  9. 火爆全网的老照片修复技术,今天手把手教你用怎么玩
  10. 教你一招,让你摆脱ftp工具上因为权限不足而删不了想删除文件夹的苦恼