控制/MCU
介绍
这篇应用笔记描述了一个加载flash并执行(LFAE)次级bootloader的示例。这个应用是开发来增强AN2546中给出的加载RAM并执行主bootloader的,其中加入了允许随意写flash存储器的代码。
这篇文档的目的是向读者示范怎么实现一个次级bootloader。次级bootloader可以用来 在系统 或在个巨大的生产线中通过CAN或SCI接口将应用程序代码编程进设备,这样就不需要在生产中使用BDM接口来编程应用程序了。它假设主bootloader已经通过BDM或者第三方程序商编程进设备了。
一个运行在32位Windows操作系统PC上的接口小工具会传输所有的数据到MCU上。通信使用的是CAN或SCI。这个接口简单示例了怎么设置和监控传输。
下面是要进行的几个步骤。前提是LRAM主bootloader已经被加载进MCU的flash存储器中了。
接口和主bootloader决定了通信的方法和速度。
接口把LFAM次级bootloader传输给MCU并存储它到RAM中,然后执行它。
LFAM次级bootloader获得控制权并与接口重建链接。
接口传输应用程序代码到MCU,这样就把代码存储到了flash中。
在完成传输后,两个bootloader都会被移除,然后就会执行代码。
这篇文档中描述的bootloader和接口软件只用于示例,由此产生的任何后果概不负责。
这篇应用笔记的目的是使用(AN2546给出的)LRAM bootloader的改进版本来下载一个更大的次级bootloader,这个bootloader可以把应用程序代码写入flash中。
对应的软件是AN3391SW。
CAN — 控制器区域网络,Controller area network
LFAE — 加载flash并执行,Load flash and execute
LRAE — 加载RAM并执行,Load RAM and execute
LSB — 最低有效字节,Least significant byte
MCU — 微控制器单元,Microcontroller unit
MSB — 最高有效字节,Most significant byte
RAM — 随机访问存储器,Random access memory
SCI — 串行通信接口,Serial communication interface
BDM — 背景调试模块,Background Debug Module
bootloader能接受应用程序以S-resord(SREC)文件形式表示的二进制镜像。SREC文件给出用可印刷ASCII格式表示的二进制对象代码,使它们能很简单地在不同的系统间传输。SREC中的每一行都有一个前缀,如S1(头)或S9(尾)。与bootloader有关的前缀是S1和S2。
S1记录描述的是存储在逻辑地址中的数据,而S2记录描述的是放在全局地址中的数据。S1和S2行有同样的结构,如下:
Type字段包含前述的前缀。Record Length是一个1字节长(两个ASCII字符)的值,它说明了后面字段的字节数。Address字段给出了数据应该被写入的地址。在一个S1记录中,Address有两字节长(逻辑地址使用16位地址)。在S2记录中,Address有三字节长(标准的16位地址加上一个7bit PPAGE值)。Data字段包含要加载进存储器的数据。最后,通过加和Record Length、Address和Data字段对应的字节值然后取反来计算校验和。
需求
这个部分给出了通过主和次bootloader加载应用程序到MCU中所需的软硬件。
这篇应用笔记中描述的方法需要一个S12XE MCU,其flash中要预装好主bootloader。为了测试,使用了EVB9S12XEP100 Kit开发套件。
还需要一个装着兼容32位Windows的操作系统的PC来运行接口。PC必须有一个SCI端口或者如果使用CAN通信的话要有PC-CAN卡。为了测试,使用了Vector CANalyzer卡。
所有为MCU准备的代码都在CodeWarrior V5.70中测试。
为了保证主次bootloader间快速平滑的转换,LRAE需要一些小改动。
CANFlag结构中需要另外加一个flag来说明bootloader正在使用的是SCI还是CAN接口。
在把控制权交给次级bootloader前,需要清零CAN帧接收标志位(canrflg.rxf)。
这个部分详述了次级bootloader是怎么加载进RAM中的,还详述了其运行的基础以说明它是怎么与接口小工具协作以实现下载并运行一个应用程序的。
为了确保与主BootLoader兼容,次级bootloader被放置在内存中,于是SREC中的地址是严格顺序排放的(就是说,它包含一个,在记录的作用域内,用于所有内存地址的值)。图1 是接口小工具传输次级bootloader的SREC的基本流程图。
图 1.接口小工具传输bootloader的流程
如果选择SCI端口来传输数据,波特率必须为可用波特率之一。声明要使用PC的哪一个COM端口来建立串行通信。接口小工具然后就会传输 同步字节(0x55)然后等待 确认字节(0xAA)。如果等了50ms还没有收到确认字节,接口就会重复这个过程。在完成这步之后,就可以开始处理SREC文件了。
图 2.bootloader接口的主菜单
由于次级bootloader被放在本地RAM中,接口打开SREC文件并搜索第一个S1行。找到后,它获取并传输代码的起始地址,MSB优先。通过加和每一行中的长度字段中的值,计算出要被传输的所有数据的字节总数(去掉地址和校验和占的字节)。传输还是按MSB优先。然后bootloader就准备好接收数据了,接口小工具开始从SREC文件的每一行提取出数据并一次传输一个字节。在完成这一步后,再传输校验和(通过加和所有传输的字节的值然后模256)。如果校验和与bootloader计算结果一致,次级bootloader就会运行并获得S12XE的控制权。
如果选择使用CAN来传输数据,先选择使用哪个通道以及使用的比特率。然后就与使用SCI进行传输的流程大致相同了。但是由于CAN数据包可以存储最多8个字节,地址以及字节总和是使用特定标识符的独立消息来传输的。再进一步,数据也可以一次传输8个字节。
图 3.CAN比特率选择菜单
每类消息的特定标识符,以及对应的数据传输的格式可以在AN2546中找到。
次级bootloader位于本地RAM中,在逻辑地址0x2000 – 0x2525。为了运行,次级bootloader还需要访问主bootloader中的变量,这些变量位于0x3FD0 – 0x3FDA。主bootloader位于本地flash中,位于0x4000 – 0x440A。在执行次级bootloader前,S12XE的本地地址映射如图4。
图 4.装载次级bootloader后的地址映射
在次级bootloader获得S12XE的控制权后,它开始为接收应用程序的SREC做准备。为了辨认使用的是哪一个通信接口,次级bootloader会查看由主bootloader存储的一些变量。它之所以能够查看变量是因为变量在RAM中并且S12XE在转换过程中并没有经历重置。
首先要查看 变量 SCI_ 或 _CAN 来得知使用的是哪一个通信接口。通信中会使用指向实际硬件外设的指针 — SCI_Ptr 或 CAN_Ptr。所有的速度和耗时信息都由主bootloader之前设置好了。
由于flash不允许多次编程同个地址,包含重置向量和主bootloader程序的扇区会被擦除。这是一个必要操作,但是却有个严重的风险,如果在成功下载应用程序之前发生了任何错误或者电源故障,就无法恢复了。
不像次级bootloader,应用程序的SREC不必包含连续的地址。这使得重置向量能被放在任何SREC中。
图 5是接口小工具通过SCI或者CAN接口传输应用程序的流程图。
图 5.接口小工具的传输流程图
接口小工具会等待1000ms以保证次级bootloader有足够的时间运行并擦除需要的flash块。之后的步骤则与使用的通信接口有关。
SCI
如果发现了S2行,接口会提取 行长度 并把它传输给bootloader。然后,后面的3字节地址会以这个顺序传输:PPAGE 值、MSB然后LSB。完成这步后,数据会被每次传输一个字节。最后,校验和会从SREC行中提取出来并发送给bootloader以进行验证。如果校验和匹配,bootloader会答复0x80。否则,bootloader会重复这个SREC行的传输。
如果发现了S9行,接口必须告知bootloader下载已经完成。这时bootloader应该在等待的是下一个S2行的行长度。通过发送0,bootloader就知道下载已经完成了。
数据的大小是自动嵌入到CAN帧中的;因此,不需要在数据传输中包含这个信息。发送给bootloader的首个数据包包含地址字段。地址、数据和校验和帧分别使用特定的ID以简化接收算法。表1中是每种帧类型的ID。数据与校验和数据包跟随在地址帧之后。接口小工具会传输一个特殊的执行帧以启动应用程序。
表 1.数据包类型和它们对应的标识符
数据包 地址 数据 校验和 执行
标识符 0x020 0x040 0x080 0x010
接收并存储应用程序
这个部分详述了bootloader是怎么接收数据并将其写入flash中的。
CAN和SCI这两个版本的实现以相似的方式工作。每个SREC行都被单独处理。由于flash只能一次写入8个字节,数据会在接收时被存储在一个数组中。如果收到了校验和并验证通过,数据就被8个8个的写入。在每8个字节被写入后,地址指针就会自增8。
由于flash编程的特性,首个SREC的起始地址必须对齐8字节边界。
运行应用程序
在接收到接口小工具的执行指令后,bootloader会通过写一个未实现的内存地址来让S12XE重置。在重置之后,S12XE会从重置向量开始执行,这个时候重置向量指向了应用程序的首个指令。
与S12XD的兼容性
搭配这篇应用笔记的软件是为S12XE设计的,为了在S12XD上运行它,需要一些小的改动。头文件要改成S12XD对应的头文件。这样就可以解决不同设备寄存器位置不同的问题。还要检查一下代码中用到的寄存器在S12XD和S12XE中的位极性是否一致,因为不同的设备中经常会不同。
另一个不兼容的是flash编程方法。S12XE使用了纠错编码以强化对数据完整性的保护。而S12XD上没有ECC。这导致S12XD的flash每8字节都要多写入2字节。管理写操作的寄存器也与S12XD十分不同。
为了简化移植,负责flash写操作的代码被单独放在源文件S12XE_Flash.c中。只需要修改这个文件就可以了。
LFAE bootloader和随带的接口小工具是AN2546中开发的LRAE bootloader的一个很棒的插件。通过使用它们两个,不需要额外的昂贵设备就能将应用程序下载到一个新S12XE的flash中。
参考文献
Martyn Gallop, HCS12 Load RAM and Execute Bootloader User Guide, Freescale Application Note
AN2546, 2004
{译文}
S12XD and S12XE Family Compatibility, Freescale, 2006
Motorola S-Records
{译文}
Ramon de Klein, Serial library for C++, 2001
全部0条评论
快来发表一下你的评论吧 !