基于MC9S12XS128 的BootLoader设计

  • 格式:pdf
  • 大小:290.09 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于MC9S12XS128 的BootLoader 设计

前言

接触飞思卡尔芯片大概有4个月的时间了,对这款16位寄存器有了一定的了解,但是因为飞思卡尔单片机的资料特别少,bootloader相关资料几乎没有,为此写下这篇设计书,方便大家学习参考交流,其中有不对的地方还请大家批评指正。本设计书主要讲解bootloader的实现过程,需对飞思卡尔16位单片机有一定的基础,了解该系列芯片的开发环境CodeWarrior5.1。

一、BootLoader的基石Prm 文件

我们在用CodeWarrior创建一个工程后会产生很多文件,其中有一个连接用的Prm文件,他的位置如图1.1所示。

图1.1

Codewarrior的Prm文件是用来划分代码段、数据段的,这类似于liunx中的连接脚本文件。程序一开始是进行初始化,然后跳转到main函数执行的,这段代码全部放在了ROM_C000处,而ROM_C000对应的地址是0xC000 到0xFEFF,具体实现代码如图1.2所示。第一部分是指明ROM_C000对的地址,第二部分是指明代码所存放的位置是ROM_C000。

我们知道bootloader和app必须在不同的ROM区域,bootloader接收到上位机发送的程序,先将其存储,后再跳转到app位置执行,所以prm文件可以帮我们实现bootloader与app程序的分离。

具体实现方法如下:

1、将原来的ROM_C000分成两个部分,ROM_BootLoader和ROM_App,因为bootloader代码较小需要保护,所以将其地址设置成0xf000-0xfeff,App的地址设置成0xc000-0xefff,这样这两块的总地址大小正好是原ROM_C000的大小。

图1.2

2、改写bootloader的代码映射地址到ROM_BootLoader;当然应用程序可以不用改,因为本身就是映射到C000的开始地方。

具体修改后的PRM如下图1.3所示,至此PRM文件修改结束。

图1.3

二、BootLoader服务对象S19文件

一般情况下,工程经过编译连接后,在“工程文件夹\bin\”下生成对应的二进制文件,可执行文件后缀主要有.s19.sx和.abs。其中以.s19和.sx为后缀的文件是文本格式的,它们是飞思卡尔推荐使用的标准文件传送格式.s文件格式将程序和数据用可打印的ASCII形式表示,包含了所需的基本协议,还包括了出错校验功能,一保证传输的正确性。下面对S格式的文件进行简单介绍。

S19文件中的每一行被称为一条记录,记录总是以字母S开头,后面跟一位数字表示此记录的类型,数字若是1代表此记录包含了程序数据,若是9则表示记录为整个文件的最末一条记录。

S记录的类型见表2.1。

我们对此结构进行说明,细节如表2.2

表2.2 S记录结构

三、实验:BootLoader原理实现

实验目的:加深对bootloader加载app的过程的理解

实验方法:创建一个bootloader工程,手动添加app工程代码,使其正常运行。

实验步骤:

1、创建一个App工程,修改prm文件,进行app和bootloader分区,修改地方与内容如图3.1所示。其他不需要改变。

图3.1 APP Prm文件修改

2、修改main函数,实现一个简单的小灯闪烁程序,程序清单如图3.2所示。

图3.2 App程序清单

3、编译生成.S19文件,选取S1开头的部分,这部分为程序的机器码。如图3.3所示。

图3.3 app 程序机器码

4、创建bootloader工程并对Prm文件作如下修改:

①修改分区,划分bootloader和app两个区域

②修改程序存放区域到ROM_BOOTLOADER区域

③定义APP程序存放区域APP_ROM

具体修改结果如下图3.4所示。

图3.4 bootloader prm 文件

5、修改bootloader的main函数,实现到app的跳转

①定义一全局数组,将机器码提取出来,并依次放入数组中。此数组必须在APP_ROM段中。

6、实现程序的跳转,其代码如下:

分别将APP工程程序和Bootloader程序烧进开发板,可以发现其运行效果一样,至此实验结束。

实验总结:

Bootloader的主要任务是将程序代码存放到相应的存储位置,然后主程序在跳转到相应的位置去执行APP代码,本次实验省略了下载存储的步骤,直接将APP代码放入了相应的存储位置,进行跳转执行;下面我们将通过串口刷写和CAN总线两种不同的方式实现程序的下载。

四、BootLoader的搬运工——串口