×
单片机 > 单片机程序设计 > 详情

PIC32MZ 通过U盘在线升级 -- USB Host bootloader

发布时间:2020-06-03 发布时间:
|

上一篇博文介绍的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月份那次,估计某处没接对,所以浪费了几天时间。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码