在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。这段说人话意思就是:工程中不会将JTAG等烧录口引出但是一定有一个对外的通信口我们升级程序时就可以利用可操作的通信接口把要升级的程序文件发送到芯片再擦写到对应地址的内存中,这样就实现了程序升级。
熊猫大概去年这个时候写的BootLoader工程(以下简称boot),最近正好被朋友问起发现好多细节已经记不清,就赶快写一篇关于boot专题加深记忆也把思路提供给大家。
概 述
针对飞思卡尔的MC9S12XET256芯片(熟悉吗?BMS最老的基础平台MCU)开发了下位机部分,上位机部分软件。上位机软件用的VS平台,语言是C#,下位机用的CW5.1,下载工具是USBCAN-2E-U。
目前一共有三种思路启动boot:
-
特殊硬件管脚:复位上电之后通过判断PP0管脚输入电平状态判断进入APP还是boot,PP0默认上拉高电平进入APP如果要进入boot则需要复位时按下按键,这种方式用作调试可以但是实际工程中我们根本没有条件操作按键,所以不推荐;

-
上电进入延时退出:每次上下电复位都先进去boot模式然后等待升级通信指令,如果收到升级指令则开始升级,反之延时耗完进入APP。这种方式适合可以方便操作上下电并且对上电时序响应没有严格要求的系统;
-
EEPROM控制字:每次上电先判断控制字。比如控制字为0x11表示进入boot模式,0x22表示进入APP模式。比如APP正常运行时这时候你要升级发送升级指令下位机执行:收到升级指令——擦写控制字为0x11——复位——读取控制字为0x11——进入boot模式——开始升级——升级完成——擦写控制字为0x22——复位——读取控制字为0x22——进入APP模式——正常运行新程序。这种方式比较灵活免去人工操作上下电,上电开机不用延时,适用的系统比较多而且很重要的一点只要不升级成功控制字永远不会被擦写,一直保持在boot模式直到升级成功为止,这就避免了升级过程出现不可抗力因素导致升级失败的状况。
内存划分
最难最关键的一步,你要编写这个芯片的boot就必须理解这个芯片的内存,让我们一起参照datasheet学习;

如图这个芯片资源有
P-Flash部分:16*16k=256K 一共16页每页16k(Number of 16K pages addressable via PPAGE register)所以一共265K;
RAM部分:4*4k=16k 一共4页每页4K(Number of 4K pages addressing the RAM. RAM can also be mapped to 0x4000 - 0x7FFF)一共16K;
D-Flash和buffer-RAM部分:D-Flash空间=32*1K=32K,buffer-RAM=4*1K=4K说明:D-Flash一个页窗就是 1K, 总共划分了 32 页, 所以有 32*1K 内存空间大小, 对应的全局地址就是0x10-0000 -- 0x10-7FFF;buffer RAM 一个页窗就是 1K, 总共划分了 4 页, 所以有 4*1K 内存空间大小,对应的全局地址就是 0x13-F000 -- 0x13-FFFF;这里 buffer RAM 和 D-Flash 总共 32 + 4K的空间模拟用作 EEPROM, 因为这个芯片没有 EEPROM, 所以用 buffer RAM 和 D-Flash 模拟用作 EEPROM, 简称 EEE, 同时 buffer RAM 也简称 EEE-RAM。叫什么不重要我们只要知道他们被用作EEPROM就可以了。
&nbs

本文深入探讨嵌入式系统中BootLoader的作用与实现,包括内存划分、通信接口设计及程序升级流程,适用于飞思卡尔MC9S12XET256芯片。

6289

被折叠的 条评论
为什么被折叠?



