一、英飞凌单片机BootLoader实现机制

英飞凌多个系列的单片机都提供了BootLoader机制,即能够在不连接烧写器的情况下,通过CAN、UART等传输协议实现自身程序的更新,便于产品使用过程中软件的更新迭代。我这次用的是XC2000系列单片机,基于CAN实现BootLoader。

关于实现机制,总的来说有以下几步:
1.通过配置单片机的复位状态寄存器或外部与之相关的引脚,使单片机复位后进入BootLoader模式;
2.上位机通过英飞凌预定义好的传输协议给单片机发送一段程序(下文称为CAN_Loader),CAN_Loader包括和上位机之间的通信协议以及操作单片机Flash的Flash driver;单片机在接收CAN_Loader的过程中自动按顺序逐字节将其写入到PSRAM(单片机Flash中预留的一段空间,可以灵活读写,专门用来存储临时程序)中,接收完毕后自动跳转到PSRAM的起始地址开始执行CAN_Loader程序;
3.使用CAN_Loader中定义的通信协议,对单片机Flash进行操作,先将旧程序所在存储空间擦除,然后将新程序传输给单片机,CAN_Loader便可以依据指令将新程序写入指定的存储空间;
4.新程序写入完毕后,将复位状态寄存器恢复默认状态,即从Flash启动的模式,重启单片机即可执行新的程序代码。

英飞凌官方给了例程代码和说明文档,我这次实现也是基于官方的这个例程,需要的同学可从官网下载,如果嫌麻烦也可从下面的链接下载:

https://download.csdn.net/download/weixin_42967006/11686233

官方的实现方法是用两块单片机,一块做主机,一块做从机(即待更新程序的单片机),主机与上位机PC之间通过串口连接,与从机之间通过CAN连接。官方给了三段程序,程序在主从机内存分布如下图所示(左侧为主机):

其中:

CAN_BSLMaster只存在于主机中,作用是和PC进行通信,依据PC的指令,执行将CAN_Loader程序传给从机、擦除Flash、传输MainAPP等操作。
CAN_Loader即我们上文提到的需要写入从机PSRAM中的程序。
MainAPP是新的APP,里面实现了简单的CAN通信和复位功能。

有关这三段程序的详细介绍在上文提到的英飞凌官方说明文档中有,这三段程序提前被烧写进主机相应的地址处,然后主机执行CAN_BSLMaster程序,依次将CAN_Loader和MainAPP写入从机相应地址。

我这次只采用了官方的CAN_Loader程序,没有采用主从机的模式,而是以CANoe作为上位机,用CAPL编写脚本直接给XC2000发CAN报文指令的形式,实现了一个简单的流水灯小程序的更新。下面就详细说一下实现方法。

二、XC2000 CAN BootLoader的实现

1.进入CAN BootLoader模式:我这次采用硬件方法进入,也可以软件给复位状态寄存器赋值后重启进入,英飞凌官方也给了一段汇编代码,执行即可进入CAN BootLoader模式,官方例程中ToolFile文件夹中的hex文件就是。本次采用硬件方法。依据芯片手册,当单片机的P10[3:0]=(1101)b,且TRST引脚=1时,重启单片机,单片机会进入CAN BootLoader模式。图中的x代表不关心,可为任意值。

2.传输CAN_Loader程序:进入CAN BootLoader模式后,需要按照英飞凌预定义好的传输协议将CAN_Loader程序传给单片机。传输协议在CAN_BSL说明文档和XC2000的芯片手册中都有说明,下图为说明文档中的定义:

整个过程分为三个阶段:

初始化阶段:单片机进入CAN BootLoader模式后,会一直处于等待初始化帧的状态,使用Node 0作为CAN收发节点,即Tx=P2.5,Rx=P2.6。上位机应首先向单片机发送初始化帧,波特率可为125-500K之间任意值,单片机收到后会自动检测波特率。初始化帧的内容如上图所示,ID随意,DLC=8,字节0-1为0x5555,用来检测波特率,字节2-3为应答报文的ID,注意这两个字节是完整的MOARH寄存器的值,使用bit[13:0],其中bit13=IDE,本次IDE置1,bit[12:2]是11位ID,故如果想设置ID=0x123,则字节2-3=0x4000 | (0x123<<2);字节4-5是传输CAN_Loader程序所要用的帧数量(MSG_CNT),例如程序大小是4K字节,那么MSG_CNT=4K/8=0x200;要注意的是MSG_CNT的低字节放在字节4,高字节放在字节5,当时就被这个问题折磨了好久。。。XC2000有64K的PSRAM,但最后255字节被芯片固件使用,如果在最后255字节写入程序,之后将会被擦除,所以允许的最大CAN_Loader程序的大小是64K-255字节,MSG_CNT最大为8192-32;字节6-7是之后发送程序数据时用的CAN-ID,填入规则与字节2-3相同。

应答阶段:单片机在接收到上位机发送的初始化报文后,自动检测波特率,成功后发送应答报文。**上位机应一直发送初始化报文直到单片机检测波特率成功并发出应答报文。**应答报文的ID是初始化报文中的ACK_ID,DLC=4,字节0-1是单片机中BTR寄存器的值,反应检测出来的波特率;字节2-3复制初始化报文中的字节2-3。

数据传输阶段:上位机在收到单片机返回的应答报文后,开始逐帧向单片机发送CAN_Loader程序数据,数据帧的ID应为初始化报文中得MSG_ID;DLC=8,每帧传输8字节,直到所有数据传输完毕,所传输的数据帧的总数应等于初始化报文中的MSG_CNT。在这期间单片机不发送响应。单片机在接收数据帧时将程序数据逐字节写入PSRAM,对于XC2000来说是从0xE00000处开始写。直到接收完MSG_CNT数量的数据帧后,自动跳转到0xE00000处开始执行CAN_Loader程序。

至此,CAN_Loader程序下载完毕,单片机进入CAN_Loader程序。

3.更新程序:当单片机运行CAN_Loader程序后,上位机再和单片机进行通信时就不再遵循上一部分的通信协议,而是遵循CAN_Loader程序中定义的通信协议。如果使用的是官方的CAN_Loader程序,那么其中包含的命令可在CAN_BSL说明文档的第5章中找到。主要有以下几个命令:

(1)擦除扇区操作:在写入程序之前必须先把待写入的Flash区域擦除。擦除指令报文的DLC=2,数据场为:0x03+SectorNumber,其中Flash地址空间对应的SectorNumber如下图所示。如果擦除成功,单片机返回一个数据场全为0的响应,如果擦除失败返回0x01。

(2)下载示例程序:使用该命令可以将一段大小为64K的程序传给单片机,单片机会从地址0xC00000处(也是单片机复位后程序执行的起始地址)开始存储该段程序,程序小于64K可用0x00填充,大于64K可用下一个命令按页编程命令继续将程序存储在其他地址空间。该命令首先发送一帧命令报文,DLC=1,数据场的一个字节是0x51,单片机状态满足的时候会回复为0的响应。在收到响应后即可连续发送数据帧,DLC=8,每帧传输8字节,每传输16帧(128字节,Flash一页的大小)后需等待单片机的响应,如果写入成功单片机会返回两个字节的响应,第一个字节是0,第二个字节是当前页的序号。持续发送数据帧直到16K数据全部发送完毕,如果还有数据剩余,可用下一步的按页编程继续写入,如果传输完毕,可执行下文(4)命令重启,即可从Flash中执行刚刚更新后的程序。

(3)Flash按页编程:该指令只能在下载实例程序的状态下使用,即上文所述的情况下。该操作首先发送一帧指令报文,DLC=4,数据场第一个字节=0x01,第2-4字节是三字节长度的Flash页地址,即想要编程的Flash页的起始地址。然后发送数据帧,和上一步相同,每帧传输8字节,每传输16帧为一页,一页完毕后,需重新发送带有新的地址的指令报文,然后再发送数据。以此类推直到所有数据传输完毕。

(4)重启进入标准模式,从Flash开始执行程序。当所有程序数据用以上两个指令被正确写入到内存中相应的地址后,即可发送本指令,单片机即可从Flash开始执行更新后的程序。指令报文DLC=1,数据场的一个字节是0x21.

(5)重启进入CAN BootLoader模式。如果程序更新过程中出错,需要重新来,可使用本命令重新进入CAN BootLoader模式,然后需重新下载CAN_Loader程序。指令报文DLC=1,数据场的一个字节是0x20.

4.恢复复位状态寄存器:以上步骤其实已经完成了程序的更新,但如果你像我一样是通过配置外部引脚的方法进入的CAN BootLoader模式,要记得再将引脚配置成从内部Flash启动的模式,否则下次重启时单片机又会进入CAN BootLoader模式了。

以上就是用CANoe作为上位机(需要上位机程序的同学可以单独联系我),利用英飞凌XC2000系列单片机内置CAN_BSL功能实现程序更新的方法。这种方法的优点是利用英飞凌内置的机制,开发难度相对较小,可靠性较高,缺点是BootLoader程序(即上文的CAN_Loader程序)需每次重新下载,且下载该程序的协议固定,无法实现定制化。要想实现BootLoader常驻Flash,可将Flash划分成两个区域,一部分存储BootLoader程序,一部分存储应用程序,上电后先执行BootLoader,如果应用程序有效且无程序更新请求,则跳转到应用程序执行,否则停留在BootLoader,进行应用程序更新。我正在研究这种方法的实现,争取下一篇文章来和大家分享。

英飞凌XC2000系列CAN BootLoader(CAN_BSL)的实现相关推荐

  1. 英飞凌XMC系列单片机教程 第一章,开发环境的搭建

    文章目录 1.xmc4500单片机简介 2.xmc4500开发环境 2.2,硬件开发环境 2.3 DAVE开发环境的使用 3.总结 1.xmc4500单片机简介 XMC4500 系列属于工业微控制器 ...

  2. 英飞凌XMC4000系列开发板软件系统复位死机的问题

    英飞凌XMC4000系列开发板一般都带有J-link仿真器,该仿真器连接了调试对象XMC4000微处理器的启动模式控制引脚.当开发板的DEBUG USB接口通电后开发板上的XMC4200为控制器开始工 ...

  3. 英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> <英飞凌 AURIX 系列单片机的HSM详解(3)--开发方法> ...

  4. 英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  5. 英飞凌 AURIX 系列单片机的HSM详解(5)——HSM硬件加速模块的使用

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  6. 英飞凌 AURIX 系列单片机的HSM详解(4)——Tricore核与HSM核之间的通信方法

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  7. 英飞凌TC3xx系列GTM系统介绍

    本文框架 1. 本系列前言 2. GTM模块系统介绍 2.1 GTM模块常用缩略语 3. 系列介绍规划 1. 本系列前言 英飞凌TC3xx是英飞凌AURIX 2G系列单片机,该系列单片机是32位微控制 ...

  8. 浅谈英飞凌XMC1xxx系列单片机的BMI功能

    文章目录 前言 一.BMI是什么? 二.BMI的作用? 1. 为什么要有BMI这个东西? 2. BMI可以选择哪些启动模式? 三.BMI怎么用? 1. 每种启动模式对应的BMI值 2. BMI值的修改 ...

  9. 魅蓝2 刷 android,魅蓝2全系列-解锁BootLoader完整版+刷入第三方recovery+刷入第三方ROM教程...

    本教程适合于魅族魅蓝2手机,由于魅族解锁BL门槛较高,如果你真的是小白,不敢折腾 请不要往下看,如何你是敢于动手,那么就继续往下看,跟着教程走,百分百可以成功 文件下载: 也可以关注微信公众号:ROM ...

  10. OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主

    首先准备好所有要使用到的文件 下载链接:https://share.weiyun.com/5WgQHtx 步骤1. 首先安装驱动 解压后执行 Install.bat 部分电脑需要禁用驱动程序签名才可以 ...

最新文章

  1. matlab编程实现基于密度的聚类(DBSCAN)
  2. mysql实现俩个属性加减运算_SQL实现相邻两行数据的加减乘除操作
  3. 大文本导入mysql_大文本数据,导入导出到数据库
  4. 缠论中枢python源码_缠论画中枢主图指标 源码 通达信 贴图
  5. 五千字说清汽车基础软件及国产现状
  6. 06 暗语转换+ 人民币和卢布币值兑换+星座判断应用
  7. cout, endl的使用
  8. 常用商务英语词汇集锦(转载)
  9. Java最新面试题及答案
  10. python打印一年的日历_使用Python打印日历
  11. 基于深度学习的医学图像分割学习笔记(九)UNet 3+
  12. 开源软件新时代:55个经典开源Windows工具
  13. LeetCode刷题(168)~矩阵中的幸运数
  14. Android获取重力加速度和磁场强度
  15. 图像归一化概念和作用
  16. PLC课程设计--台车呼叫
  17. oracle数据库的基本教程 pdf,Oracle数据库技术基础教程 PDF 下载
  18. C++ 输出颜色字体
  19. 中国电信2019笔试题——求前后重叠的最长子字符串长度,基于java语言
  20. 医院wifi解决方案靠谱吗

热门文章

  1. umi hooks里的mutate使用方法
  2. 卡塞格林光学系统_卡塞格林红外光学系统装调技术研究
  3. 近代光学系统设计概论学习笔记-第四章双胶合和双分离消色差物镜
  4. QT Andriod U盘检测
  5. [论文笔记]Fader Networks: Manipulating Images by Sliding Attributes(2017 NIPS)
  6. 马尔可夫毯/马尔科夫链/因果图/贝叶斯网络
  7. Could not locate executable null\bin\winutils.exe in the Hadoop binaries
  8. 三维气象数据可视化系统介绍
  9. [Rootkit] dll 隐藏 - VAD
  10. iOS开发雕虫小技之傻瓜式定位神器-超简单方式解决iOS后台定时定位