PIC32MZ 通过USB在线升级 -- USB CDC bootloader

  了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。

  最近给我的开发板PIC32MZ EC starter kit写了个USB 在线升级程序--USB CDC bootloader。有了它,我可以很方便的升级我的应用程序。我大概是一个星期前开始决定写这个USB在线升级程序的,USB 有很两种类型,USB host和USB device。 由于USB host接触不多,所以我决定采用USB device的类型。 USB device有很多种Class, 例如HID, CDC,和MSD等,MSD device不适合做在线升级,HID用来做在线升级很不错,但是PC端需要驱动和专门的上位机。所以我决定采用CDC device, 模拟一个串口,上位机实现也简单。此在线升级程序虽然只是第一版,但是经过多次测试,都没有问题。

       下位机

USB CDC bootloader 的实现很简单,开发环境是MPLAB X, Harmony和XC32.  XC32是编译器,MPLAB X是Microchip 的免费IDE, Harmony是Microchip为PIC32架构推出软件framework. 包含了PLIB库文件和很多的示例。我的USB CDC bootloader就是在Harmony中Usb device示例--cdc_com_port_single的基础上实现的。我没有新建项目,而是把整个示例项目从安装路径中复制出来,改掉项目名(从cdc_com_port_single.X 改成 cdc_bootloader.X)。

很奇怪的是,每次使用MPLAB X打开这个改名后的工程,都有Project Loading Error。 错误提示是: Error: Project "cdc_bootloader" refers to file "bsp_config.h" which does not exist in the disk. The project failed to load. 但是编译却没有问题,估计是工程改名的后遗症,由于不影响编译,所以目前没有去深究。

我是在复制出的示例工程中的app.c中添加cdc bootloader代码的, 第一版实现,我力求简单。所以bootloader的实现基本上和“ 自己用C语言写PIC32 serial bootloader " 这篇博文中的实现是相似的。目标板上电后,都是先进入bootloader程序,进入bootloader程序后,之前是等待一小段时间,如果没有更新程序的请求,就跳转到应用程序,如果有更新程序的请求,就去更新应用程序。目前的做法稍有不同,是检查SW1按键有没有按下,SW1有按下,就去更新应用程序,SW1没有按下,就跳转到应用程序,具体可以去看“ 自己用C语言写PIC32 serial bootloader " 博文(里面含有部分的代码)。我的这种bootloader实现方式和我的其他bootloader实现方式还有一个不同的地方在于,不需要写专门的上位机,直接使用超级终端或相同功能的终端软件就可以。

USB CDC bootloader改完后,编译,烧写到我的PIC32MZ EC Starter Kit,然后USB 线一头接电脑,一头接PIC32MZ EC Starter Kit。 打开电脑的设备管理器, 发现了一个未识别的USB device, 使用Microchip提供的INF文件就可以让电脑识别这个USB device,之后每次接上我的PIC32MZ EC Starter Kit都可以识别成COM8这个设备。到这里,我就知道我已经成功了一大半了。

上位机

      上位机有提到是用的超级终端,现在的Windows系统(WIN 7, WIN 8, WIN 8.1, WIN 10)已经不像之前的WIN XP自带超级终端,需要自己到网上去下载。使用超级终端的发送文本文件的功能,但是发送前要选好COM口,比如我的是COM8, 选好baud rate, 比如我的是9600。 选好8数据位和1个停止位。还有一个重要的设置是Line Delay。 发送文本文件是发送原文,每发送一行内容,就停止Line Delay定义的时间,然后再发下一行,直到结束。

升级步骤

升级时的步骤如下

1. 重启烧录好cdc bootloader的目标板

2. 立即按下SW1按键,直到USB device 完成Emulating (这个是通过LED来只是Emulating完成)。

3. 打开超级终端,设置好COM口,baud rate, 和 Line Delay等 (这一步必须在USB device的Emulating完成后)。

4. 单击发送 / 发送文本文件..., 选择要发送的hex文件。

5. 等待升级完成,bootloader每接收完一行都会原文返回,所以你可以在超级终端看到以下内容。

...
...
:020000040000fa
:020000041d00dd
:101a74000000023c00004224050040100000023c2b
:101a84000000422403004010009d023c3f0000700f
:101a9400009d023cbc1a42240500401000000000d6
:101aa400e8ffbd271400bfaf09f8400000000000a4
:081ab400ad06400b000000002c
:020000040000fa
:020000041d00dd
:101abc0000606041c000000099aa033c80bf023c5a
:101acc0055666324300040ac300043ac6655033c93
:101adc00aa996334300043ac80bf023c010003245c
:101aec00581243ac80bf023c5012428cb106400be2
:041afc0000000000e6
:020000040000fa
:020000041d00dd
:1011e40000601a40bfff1b3cffff7b3724d05b032a
:0811f40000609a40180000425f
:020000040000fa
:020000041d00dd
:0810ec000800e0030000000011
:020000040000fa
:020000041d00dd
:0810f4000800e0030000000009
:00000001FF

  由上可知,本实现方式,上位机只是hex原文发送,cdc bootloader接收hex,分析里面的内容,checksum检查,提取里面的地址和BIN数据,然后再完成烧写。很多脏活累活 都是在下位机里面完成。计划开发一专门的上位机程序,不用超级终端,然后脏活累活有上位机来完成。并且会增加以下特性:

1. 握手协议

2. 通信协仪

3. Checksum检查

4. 应答机制

5. 纠错机制, 如果通信中出错,上位机允许重发三次。

6. 一致性确认,烧写后,bootloader会读出数据和写入的数据比较。

所有这些完成后,那么我的cdc bootloader的可靠性和效率都会更上一层楼。

时间: 2024-08-01 23:38:13

PIC32MZ 通过USB在线升级 -- USB CDC bootloader的相关文章

基于串口通信的DSP应用程序在线升级方法

转载内容,源地址http://www.qiytech.com/jiejuefangan/gongyekz/922.html 摘  要:为解决特殊场合DSP程序升级困难的问题,以TMS320F28035为例,介绍了一种基于串口通信的适合于TMS320C2000系列DSP实现程序更新的在线升级方法.描述了该在线升级方法的基本思想和实现步骤,给出了关键部分的程序代码.实验证明,该方法简单可靠,可用于嵌入式设备软件程序的升级更新中. 关键词: 在线升级: DSP:串口通信: Flash TMS320C2

dsp 28377在线升级 实例总结

使用dsp品台28377d来实现在线升级的功能. 方案 : 升级程序  +  应用程序 升级程序 : 主要的目的是将上位机发送过来的应用程序数据(ccs编译生成的.bin文件)烧写到指定位置,之后在跳转到应用程序执行. 应用程序 : 等待升级的程序 //---------------------------------------------------------------------------------------------------------------------------

LBDP-Z APP在线升级指南

LBDP-Z可支持STM32通过无线模块实现在线升级,在代码校验后进行升级操作. 因无线传输可能发生丢包,因此需要多次发送(目前尝试5次). 注意:升级前必须确保网关板已正确设置RTC!!! step 1:准备升级包 启动SCP软件,将编译好的升级包(本例中为ledPrj_app_1847.hex)复制到网关/root/目录,改名为“ledPrj_app.hex”,如下图所示: step 2:确认灯具板在bootloader模式: 灯具板上电,crt终端界面显示bootloader版本信息,以"

.Net remoting方法实现简单的在线升级(上篇:更新文件)

一.前言:       最近做一个简单的在线升级Demo,使用了微软较早的.Net Remoting技术来练手. 简单的思路就是在服务器配置一个Remoting对象,然后在客户端来执行Remoting对象中的方法. 过程: (1) 读取本地dll文件的名称与版本号,与服务器的进行对比 (2) 确认需要升级的文件名称与版本号并告诉服务器,服务器将其复制到一个临时文件夹并压缩成zip (3) 将服务器的zip下载到本地的临时文件夹,并解压. 定义服务器端为UpdateServer,其配置文件为: <

从在线升级说起

b/s比c/s有一个非常大的优势在于升级简单,升级有限的服务器就ok了,而c/s模式则是每台客户机都需要升级,版本一致比较难控制,所以在线升级就成了很重要的问题. 当时研究这个的时候存在的问题是,公司所有的产品的在线升级是VB写的加上几个VC写的com组件,每个产品需要就修改部分源代码,然后编译出一个自己产品用的,然后可能一台电脑上安装了几款我们公司的产品,也有好几个升级进程,相互影响.还有如果不是管理员权限,安装补丁包就会不能写注册表之类的,有一些问题. 研究了下谷歌的一个在线升级项目,开源的

VB.NET在线升级程序源代码,可以独立使用

这个程序是我做一个办公管理系统的时候用到的,这里有源码,需要的亲拿去研究学习:vb.net在线升级程序: 程序实现了通过vb.net连接远程云服务器,并且从云服务器中获取更新,并且自动下载更新,升级本地客户端程序: 下载地址:UpEASoft.zip   429.56 KB

大话USB驱动之USB键盘

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25040049 一.总体框图 二.驱动代码 /*************************************************************** *版权所有 (C)2014, *文件名称:linux键盘驱动 *内容摘要:用另一种方式改写linux键盘驱动 *其它说明: *当前版本:V1.2 *作 者: 若云流风 *完成日期:2014.5.6 *修改记

Android在线升级相关笔记一(解析服务器版本与当前版本比较)

大概流程:Android客户端去访问服务器上的封装了版本号等信息的xml文件,对服务器上的版本和当前版本进行比较, 如果低于服务器的版本,则下载服务器上的新版软件,进行安装替换,完成升级. 一.首先用tomcat搭建服务器,用于开发测试. 下载tomcat请参考:http://blog.csdn.net/only_tan/article/details/25110625 1.在tomcat中新建自己的项目: \apache-tomcat-6.0.39\webapps 目录下新建自己的项目文件夹,

usb host和usb device

S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb device: 微处理器作为usb从属设备,其常用作接受PC机发送的命令. 参考网页:USB Host和USB Device的区别 usb host和usb device,布布扣,bubuko.com