了解bootloader的实现,请加QQ: 1273623966(验证填bootloader); 欢迎咨询或定制bootloader; 我的博客主页 www.cnblogs.com/geekygeek

    今年国庆, 东莞,深圳,都是出城就堵,为了不给道路添堵,我就把自己堵在家里,认真地完成了4个USB bootloader, 2个PIC32MZ USB bootloader, 2个PIC24 USB bootloader。上一篇博文介绍的PIC32MZ HID bootloader是其中之一,这次将要介绍的是PIC32MZ U盘bootloader,也是其中之一。大概在今年6月份,我有尝试过实现PIC32MZ U盘bootloader, 但没有成功。放假了,效率果然不一样,之前一直没能完成,这次也轻松搞定。PIC32MZ U盘bootloader也是在harmony的bootloader例程基础上修改而成。开发环境如下,

1. IDE: MPLABX IDE 4.01

2. Compiler:  XC32 v1.40

3. Library: Harmony 1.07

4. Example: c:/microchip/harmony/v1_07_01/apps/bootloaer/basic/firmware/basic.X.

和PIC32MZ HID bootloader一样,PIC32MZ U盘bootloader在harmony 例程的基础上,首先修改的是项目属性,芯片类型,接着修改的是Bootloader 的Linker file, bsp file, 以及peripheral Libray。 让它们适配我的硬件板子。

接着规划bootloader和应用程序的存储空间,我自建了应用程序的Linker Script. 然后再PIC32MZ U盘bootloader的system_config.h中修改了一下与地址相关的宏定义(这个和HID bootloader修改是一样的):

    /*2)The base address and end address must align on boundaries according to the flash page size */
#define BOOTLOADER_FLASH_BASE_ADDRESS 0x9D000000
#define BOOTLOADER_FLASH_END_ADDRESS (0x9D000000 + 0x200000 - 1) /* Address of the Flash from where the application starts executing */
/* Rule: Set BOOTLOADER_FLASH_BASE_ADDRESS to _RESET_ADDR value of application linker script*/
#define BOOTLOADER_RESET_ADDRESS 0xBD000000 //(BOOTLOADER_FLASH_BASE_ADDRESS + 0x1000)

然后是编译U盘bootloader, 也是一次成功。然后是测试bootloader的功能。 我准备了两个测试用的应用程序,一个是简单的点灯程序,另一个是简单的USB device程序,应用程序编译时都用到了客制的Linker Script. 准备了一个8G U盘。 先Copy点灯程序的hex到U盘,重命名为image.hex, 将U盘插上硬件板子。 然后按住SW3按键,重启硬件板子,可以看到LED1一闪一闪,指示正在烧写应用程序。完成后,点灯程序运行正常。但是当我试第二个测试用的应用程序时(简单的USB device程序)。烧写没问题,但是USB device程序运行不正常。我怀疑是U盘bootloader初始化USB为USB host, 最后跳转到USB device的应用程序后,可能某个地方有冲突,所以我优化了我的U盘bootloader, U盘bootloader运行时在初始化阶段,就检测SW3是否有按下,只有SW3按键有按下才初始化成USB host,否则就跳到应用程序。 检测SW3是否有按下的代码如下:

    if (APP_ForceBootloaderCheck() == 1)
{ }
else
{
if (0xFFFFFFFF == *(unsigned int *)BOOTLOADER_RESET_ADDRESS)
{ }
else
{
((void (*)(void))BOOTLOADER_RESET_ADDRESS)();
}
}

然后再测试,U盘烧写完第二个测试用的应用程序后, USB device的程序, 运行也正常了。反复测试了多次,都没有问题。

不管HID bootloader或者CDC bootloader, 还是要有电脑才行,U盘bootloader完全不用电脑,只需要U盘就行,有点脱机烧写的感觉,是成本非常低的一种方式。速度也很快。烧写步骤同样简单。

1. 将要更新的应用程序放到U盘,并命名image.hex

2. 插上U盘到硬件板子上

3. 按住硬件板子SW3按键,重启目标板

4. 看到LED1 一闪一闪时, 可以松开SW3按键

接着就是等待烧写完成,烧写完成后会自动跳转到应用程序。没有比这个更简单的更新方式了。

我也很疑惑,为什么之前在6月份的时候,花了几天时间都没有搞定U盘bootloader,这次却这么顺利呢。我想可能原因是接线方式不对,我的硬件板子是从Microchip官方购买的PIC32MZ EC starter kit 。 U盘接到硬件板子到J5, 这个没有异议。但是板子供电要通过J3,使用miniB-A USB线接到电脑。 然后一定要注意, 使用USB host功能时,

1.   J4一定不能接USB 线,

2.  JP1一定要用跳线短接,

U盘bootloader就是按照以上接线,才调试成功, 6月份那次,估计某处没接对,所以浪费了几天时间。

PIC32MZ 通过U盘在线升级 -- USB Host bootloader的更多相关文章

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

    了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...

  2. PIC32MZ 通过USB在线升级 -- USB HID bootloader

    了解 bootloader 的实现, 请加QQ: 1273623966(验证填bootloader); 欢迎咨询或定制bootloader; 我的博客主页 www.cnblogs.com/geekyg ...

  3. PIC24 通过USB在线升级 -- USB CDC bootloader

    了解bootloader的实现,请加QQ: 1273623966 (验证填bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek 今 ...

  4. PIC24 通过USB在线升级 -- USB HID bootloader

    了解bootloader的实现,请加QQ: 1273623966 (验证填bootloader):欢迎咨询或定制bootloader; 我的博客主页www.cnblogs.com/geekygeek ...

  5. usb host和device的关系-ARM 论坛 - 21ic电子技术论坛

    usb host和device的关系 疑问1:我们通常所用的u盘应该是usb device吧?我想这个不用多说,呵呵. ===============恩.============== 疑问2:我们通常 ...

  6. Android USB Host 通信程序

    换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...

  7. Android USB Host与HID通讯 (一)

    去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...

  8. usb host和usb device

    S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb devic ...

  9. C#做的在线升级小程序

    转自原文C#做的在线升级小程序 日前收到一个小任务,要做一个通用的在线升级程序.更新的内容包括一些dll或exe或.配置文件.升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的 ...

随机推荐

  1. python入门22 pymssql模块(python连接sql server查询)

    安装 pip install pymssql 连接数据库 pymssql.connect() # coding:utf-8 import pymssql server = '192.168.8.1' ...

  2. FFT抄袭笔记

    你看我都不好意思说是学习笔记了,毕竟\(FFT\)我怎么可能学得会 那就写一篇抄袭笔记吧ctrl+c真舒服 先从多项式说起吧 1.多项式 我们定义一个多项式 \[F(x)=\sum_{i=0}^{n- ...

  3. [19/03/12-星期二] 数组_遍历(for-each)&复制&java.util.Arrays类

    一.遍历 for-each即增强for循环,是JDK1.5新增加的功能,专门用于读取数组或集合中所有的元素,即对数组进行遍历. //数组遍历 for-each public class Test_03 ...

  4. 2018.11.11 Java的 三大框架:Struts+Hibernate+Spring

    ·定义:Java三大框架主要用来做WEN应用.Struts主要负责表示层的显示: Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作): Hibernate主要是数据持久化到数据库. ...

  5. java中equals以及==的用法(简单介绍)

    简单介绍 equals方法是java.lang.Object类的方法 有两种用法说明: 一.对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. 1.“==”比较两 ...

  6. Android学习笔记_48_若水新闻客户端源码剖析

    一.新闻客户端布局代码 1.1 主界面布局 使用GridView实现左右可滑动菜单项,使用标签HorizontalScrollView实现水平滚动条,将创建的GridView添加到布局文件中. < ...

  7. 【Linux-CentOS】在无互联网-内网环境的Windows7主机上安装CentOS双系统,从安装到放弃

    2018.12.3 日更新:本文仅作为无互联网环境下安装的参考.更推荐在互联网环境下安装软件和使用系统,毕竟会自动安装依赖包,比较方便. 因个人办公电脑装的盗版Win7总是蓝屏,影响工作,加之看到 W ...

  8. mysql replace()用法

    mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); 释:表tb1中字段f1中为abc的值更新为def.一般用于某字段中值存在 ...

  9. Redis集群的安装和使用

  10. PL/SQL语句快捷输入设置

    设置PL/SQL语句快捷输入的方法,让你成为高效率的人. 1.打开PL/SQL,输入用户并登录 2.并打开Tools->Preferences->Editor->AutoReplac ...