在利用MCU开发数字电源项目中,对于嵌入式开发而言,Bootloader几乎与软件算法同等重要,它可以让我们摆脱MCU官方工具,定制自己的烧录工具,不仅提高产品辨识度,同时也大大减少了对外引脚数量(例如兼容通信的Uart或CAN等,而不需要另外接JTAG。接下来,我会通过这个专题对BootLoader做一个入门的介绍,针对dspic33做两种不同的方式来实现,第一种是采用修改.gld文件的方式;另外一种是采用MCC。
一般MCU的机器码都是存储在Flash中,MCU启动时PC指针会从内部Flash第一个地址开始读取指令运行,这个过程我们一般无法干涉。但由于我们写的代码存于Flash中,所以一旦从Flash启动,后续操作就完全可以由我们来指定,我们可以指定程序执行位置。
对于低端MCU来说,我们可以通过在Flash初始的位置设置指令,来启动内部不同flash区域的程序,以及烧写程序到这些flash区域,这些操作集合叫做Bootloader。Bootloader承担着用户程序的烧写以及跳转。
BootLoader是在单片机上电复位时执行的一段程序。也称作Bootlader固件,通过这段程序,可以不使用编程器对应用程序在线升级,来实现应用程序的更新。在单片机上电/复位后,一般都是先运行Bootloader程序。Bootloader运行后,先判断当前是否需要进入升级状态。如果不需要升级,就直接运行Flash中原有的应用程序;如果需要升级,首先擦除旧的应用程序,然后从通讯接口接收应用程序代码,并写入指定Flash中。直到把新的应用程序全部都写入Flash,最后进行校验,确保新的应用程序是正确的、完整的。再跳转去运行新的应用程序。
对于高级MCU或者CPU来说,可以轻松映射外部存储(外部Flash、U盘、硬盘等),MCU启动后,我们可以指定其从哪个存储启动,甚至通过通信接口接收数据存储到这些外部存储。这些操作集合在嵌入式操作系统中一般称之为UBoot,在PC中称之为BIOS,外部存储一般存放的是操作系统。
dspic33的Flash内部执行流程如下:
通讯接口可以是UART、I2C、SPI、CAN、USB等。通讯速率直接影响整个升级的完成时间,在升级的过程中应用程序是不能被运行的 。CAN Bootloader就是通过CAN总线来传输应用程序文件,来实现对应用程序代码的升级。
在做CAN BootLoader时,一般有两种形式作为HOST来对目标板进行升级。
1.使用另外一个主MCU,比如用一个UART-CAN的转接板,主要用到USB转UART芯片MCP2221A和带CAN 控制器的MCU PIC18F66K80,66K80作为Host MCU。
2.使用CAN ANALYZER。可以使用ZLG的双通道CAN分析仪,型号USBCAN-2E-U
大致执行流程如下: