【原创】基于飞思卡尔微控制器的CAN Bootloader的实现与应用
0赞1引言
Bootloader又称引导加载程序, 它是系统加电后运行的第一段软件代码, 它能实现用户程序的引导启动和固件自更新两个功能。其中固件自更新需要向芯片提供额外的数据传输介质使得芯片能将接收到的机器代码写入自身的Flash中。传统的方法是使用UART或J1850等廉价的低速通信接口实现Bootloader的更新功能, 对于飞思卡尔芯片来说, 通常还可以使用P&E或BDM 等专门的烧写工具现场更新程序。然而很多环境中不适合进行现场调试, 比如汽车网络中ECU 节点的升级[ 1] , 并且这样的操作需要能快速而稳定地进行。而CAN 总线有着高速、实时性好、具备错误诊断等优点, 满足了ECU 节点升级的需求, 因此网络中带CAN 控制器的节点都普遍采用了CAN 总线作为Boot loader的通信介质。基于CAN 总线的Boo tloader需要在CAN 协议的基础上实现一个数据传输和命令执行的协议。尽管已存在许多CAN 高层协议, 例如CCP 或CANOpen等[ 2] , 本文使用了一个简洁的自定义数据传输和命令执行的协议, 设计了一个基于飞思卡尔16位微控制器的通用CAN Bootloader, 它实现了软件自更新和引导用户程序的功能。实验证明, 这个Boo tloader具有稳定、快速和扩展性好等优点。
2 MC9S12系列微控制器的CAN Bootloader系统配置
2. 1 MSCAN模块的配置
飞思卡尔MSCAN 是当前汽车控制器中最流行的CAN 控制器架构。在Bootloader中, MSCAN模块负责下载Bootloader所需的数据并进行主从机之间的命令交互。飞思卡尔16位微控制器系列的MSCAN 模块都有64个字节的配置寄存器, 为了能正常进行数据通信, 需要对这些寄存器进行配置。要求如下:
( 1) 时钟源的选取。时钟源的选取必须以CAN协议为基础。若使用了锁相环, 则最好选择振荡器时钟而不是总线时钟。给定DP256的时钟源频率为16MHz, 那么设置MSCAN 寄存器CANCTL1_CLKSRC = 0后,MSCAN 的时钟源频率即为16MH z。
( 2) 确定通信速率。由于MSCAN 支持最高到1M 的波特率, 因此在数据传输方面与UART等通信协议相比有着很高的优势, 在这里推荐使用500kbps的传输速率, 并根据芯片手册上的计算公式求出MSCAN 的时序参数。
( 3) 确定MSCAN 滤波参数。Boo tloader相关的数据传输需要特定的帧来完成, 这里我们选择标准帧格式, 并设置好相应的滤波器, 使得MSCAN 能接收来自一个ID 段的CAN 报文。
( 4) 关于MSCAN 寄存器的使能位。MSCAN 的使能位CANCTL1_CANE 在正常情况下只能写一次, 因此Bootloader中若事先开启了MSCAN模块, 在芯片下一次复位前, 是无法将其关闭的。
2. 2 F lash模块的配置
目前的微控制器内部一般都集成F lash, 它是只读的, 不会因运行时掉电而丢失数据, 它能存储程序运行所需要的代码和数据。DP256内部256kB 的F lash被分成四块, 从B lock0到B lock3。B lock0底部有16字节的F lash保护设置寄存器, 它可以确定被保护的区域的大小。在复位时将从此区域加载数据到F lash保护寄存器FPROT中。可以操作此寄存器设置Bootloader所在代码段的写保护功能。节点使用的晶振必须大于2MH z来保证能够对Flash进行编程和擦除, 由于时钟同步对功能定时精度的影响, 若外部参考时钟小于2MH z, 无法完成编程和擦除功能。
Bootloader初始化F lash模块时, 要注意设置合理的F lash时钟分配寄存器FCLKD IV 的值, 设置后的F lash工作时钟必须为150~ 200kH z, 否则, 若Flash时钟频率小于150kH z, 编程时间过长, Flash会由于过载而损坏;若F lash时钟频率大于200kH z, 又会导致不完全的编程和擦除。
2. 3 复位和中断向量的安排
S12系列微控制器的复位向量表默认安排在3F页的最后部分, 其中复位向量在地址0xFFFE 处, 其余的向量包括用户向量依次往低字节的内存方向安排。
由于Boot loader接管了复位向量, 使它指向了确定的地址, 而用户程序的复位向量指向的地址是未知的,
为了能顺利引导用户程序启动, 需要在下载过程中检测用户的复位向量, 并把它安排在F lash中的另一个确定的位置, 留给Boo tloader引导时自动调用。由于Bootloader一般不需要使用其他的中断向量, 因此中断向量表中除复位向量外的所有部分可以保留在原地址不变。
2. 4 S19下载文件格式
S19文件中的每一行被称为一条记录, 记录总是以字母/ S0开头, 后面跟一位数字表示此记录的类型, 数字是/ 00表示S19文件的起始说明字符串; 数字若是/ 10或/ 20代表此记录包含了程序数据( / 10为16位地址, / 20为24位地址); 若是/ 90则表明此记录为整个文件的最末一条记录。接下来一个字节表示了此记录所包含的字节数, 有效数据字节由起始地址、数据字节和位于末端的校验字节组成。其中的校验字节算法为: 校验字节= 0xFF- 除去/ S10和校验字节的所有字节的和。每个记录的末尾一般是回车+ 换行符( CR + LF) , 但不一定是必须的。
在下载过程中, Bootloader将按顺序接收S19文件中的每一个字符, 并对S19 文件末的校验字节进行验证, 同时将有用的数据字节写入自身F lash。
3 基于CAN总线的Flash Bootloader的实现
3. 1 CAN Bootloader的链接参数配置
根据上述讨论, 通过修改链接参数文件, 将Bootloader程序定位于地址0xF0C0开始的Flash中, 将用户的复位向量置于地址0xEFFE所在的2个字节的Flash空间中, 其余的复位向量仍保留在原地址不变。设置默认内存起始地址为0x5000, 大小为0x323个字节。同时将一块新的内存块命名为/ FLASHROUT INES0, 它是用来在内存执行F lash写入函数的, 从地址0x5323开始, 直至0x53F8。所有使用的内存合计1 016字节, 小于HCS12系列芯片中最小内存1 024字节。使用编译预处理指令, 将F lash写入函数置于/ FLASHROUTINES0这块内存中, 并由启动代码自动初始化这块内存。本文并未将Boo tloader自身所在的flash写保护, 实际应用时
可通过修改F lash相关寄存器实现。
3. 2 CAN Bootloader下载模式的进入和初始化流程
让目标节点执行Bootloader下载程序, 则需要让节点知道自身处于Boo tloader下载状态下, 我们在其一个引脚PORTK_B IT2上放置开关, 并通过外部操作改变此引脚的电平来选择进入Boo tloader下载程序还是用户程序。如图1所示, 其引脚使用了内部上拉, 当节点复位后检测到高电平时, 并且判断用户的复位向量所在地址0xEFFE 已被写入, 则使用JMP跳转语句直接跳向地址0xEFFE 所保存的首地址运行用户程序, 反之进入Bootloader的下载程序。
进入下载模式后, Boot loader首先初始化RAM 基址和EEPROM基址, 接着初始化堆栈, 关闭看门狗, 随后初始化全局变量, 并将内存写Flash的代码拷贝到FLASHROUTINES这个内存块中, 以完成Bootloader自身环境初始化的过程。最后使用JMP语句跳转到ma in函数。程序首先初始化F lash模块和MSCAN 模块, 并把CAN 的波特率设置为500kbps, 最后进入一个循环, 通过检测MSCAN 接收缓冲区的标志位来读取CAN 报文,解析命令并进行进一步的判断。CAN Boot loader初始化流程如图2所示。
3. 3 Bootloader主从机协议
在CAN 数据通信过程中, 使用了标准帧, 并设置ID从0x13A ~ 0x13F为Boo tloader的命令和数据传输帧,除了ID为0x13F的数据帧数据段长度为8个字节外, 其余的数据帧数据段长度均为1个字节[ 3] 。其内容如附表所示。
主机在这里是连接了USB转CAN设备的PC 机, 其上运行着由我们制作的上位机程序, 它基于Borland
Delphi 7集成开发环境构建, 主要作用是向Boo tloader逐行发送S19 记录, 同时还显示传输过程和传输的结果。由于CAN报文数据帧数据段最大长度为8, 所以一条S19记录可能需要几个数据帧才能发送完毕。从机负责实时解析S19文件并在一条记录接收完毕后, 将此记录写入相应的F lash中。当然, 也可以在主机上预先解析S19文件并发送有用的数据字节, 这样能简化从机Boo tloader的逻辑。根据以上的协议内容, 由主机控制的工作流程如图3所示。
此流程中, 从机负责执行主机传来的命令, 以实现整个下载过程。当从机收到擦除命令后, Boot loader启动擦除函数, 将相应的区块整体擦除, 同时擦除用户的复位向量。擦除后再一次返回ID为0x13A 的数据帧,表明擦除结束; 而当主机向从机逐条发送S19记录时, 从机解析, 丢弃S0和S9记录, 并将S1和S2中的数据字节记录写入Flash, 写函数在内存中运行, 同时计算累加和, 其余函数仍在Flash中运行; 当发送完所有的记录后, 主机会将记录的每个字节取累加和并传给从机; 从机接收到后与自身计算的累加和进行比对, 若相等,在数据帧0x13E的数据段中, 返回0x80, 否则返回0x01; 需要从机自身复位, 主机向从机发送ID为0x13C 的报文, 从机收到后设置看门狗模块让其触发复位。
嘿嘿,欢迎拍砖,更欢迎交流,bootloader是在下载器不给力的情况下一种有效的下载手段。