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

今天是长假的最后一天,明天又要开始上班了,所以我决定今天把在今年国庆前及国庆中完成的bootloader都介绍完,前面的博文已经介绍了3个,现在介绍最后一个--PIC24 HID bootloader。PIC24 HID bootloader 操作简单,速度也快,并且在PIC24FJ256GB106硬件板子上测试多次,稳定可靠。

开发环境

  1. IDE: MPLABX v4.01

2. Compiler: XC16, v1.11

3. Library & Example:  c:/microchip_solutions_v2013-06-15/USB/Device - Bootloaders/HID/Firmware - PIC24FJ256GB110 Family/MPLAB.X

这个PIC24 HID bootloader 是在MLA_v2013-06-15的Device Bootloader的基础上修改而成的。 bootloader和应用程序的空间分配以及Linker Script的修改是参考以下帖子http://www.microchip.com/forums/m402123.aspx 里面网友“test838"提供的一个非常好的方法,本HID bootloader和应用程序所用的Linker Script都是按照这种方式创建的。按照“test838"的介绍,AN1157的地址分配的方法比AN1094更科学,更安全,而他提供的方法又比AN1157的更好。本HID bootloder 地址是空间是0x400开始,长度=0x1C00. 应用程序地址从0x2000开始到结束。

下位机

     HID bootloader在例程的基础上,修改了configuration bits, 系统时钟,屏蔽了按键检测的相关代码。例程的是现实方式要有一个按键,按键按下,同时重启板子,就会进入bootloader mode,完成升级。但是我的硬件目标板没有按键。所以我屏蔽了按键检测的相关代码,并在mian函数的开始处做了相应的修改,如下。

    //mInitSwitch2();
//if((sw2==1) && ((RCON & 0x83) != 0))
if ((RCON & 0x80) != 0)
{
//__asm__("goto 0x1400");
__asm__("goto 0x2200");
}

还有ProcessIO()函数的修改

    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1))
{
if (BOOT_required == 0)
{
BOOT_wait--;
if (BOOT_wait == 0)
{ //__asm__("goto 0x2200");
Reset(); }
}
else
{
BOOT_wait = BOOT_WAIT_TIMEOUT;
}
return;
} BootApplication();

接着是BootApplication()函数的修改

if(BootState == IdleState)
{
//Are we done sending the last response. We need to be before we
// receive the next command because we clear the PacketToPC buffer
// once we receive a command
if(!USBHandleBusy(USBInHandle))
{
if(!USBHandleBusy(USBOutHandle)) //Did we receive a command?
{
for(i = 0; i < TotalPacketSize; i++)
{
PacketFromPC.Contents[i] = PacketFromPCBuffer.Contents[i];
} USBOutHandle = USBRxOnePacket(HID_EP,(BYTE*)&PacketFromPCBuffer,64);
BootState = NotIdleState; //Prepare the next packet we will send to the host, by initializing the entire packet to 0x00.
for(i = 0; i < TotalPacketSize; i++)
{
//This saves code space, since we don't have to do it independently in the QUERY_DEVICE and GET_DATA cases.
PacketToPC.Contents[i] = 0;
}
}
else
{ }
}
else
{ }
if (BOOT_required == 0)
{
BOOT_timeout--;
if (BOOT_timeout == 0)
{
//__asm__("goto 0x2200");
Reset();
}
}
}
else //(BootState must be in NotIdleState)
{
if ((PacketFromPC.Command != UNLOCK_CONFIG)&&(PacketFromPC.Command != ERASE_DEVICE) && (BOOT_required == 0))
{
BOOT_timeout--;
if (BOOT_timeout == 0)
{
//__asm__("goto 0x2200");
Reset();
}
}
else
{
BOOT_required = 1;
}

编译完成后的HID bootloader,将编译完的HID bootloader通过PICKit3烧入硬件目标板。

        上位机
       本HID bootlodare用的上位机和例程用的上位机是一样的,在“Software Windows Executable"文件夹中,上位机名叫HIDBootloader.exe. 接着就是使用上位机和HID bootloader完成应用程序的升级。

升级步骤如下:

1. 打开上位机

2. 重启目标板

3. 上位机若提示,”Device detected", 则选好要烧写的应用程序hex.

4. 点击上位机的下载按钮。

5. 等待烧写完成。

6. 烧写完成后重启目标板。

PIC24 通过USB在线升级 -- USB HID 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. PIC32MZ 通过U盘在线升级 -- USB Host bootloader

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

  5. Encrypting bootloader (程序BIN文件加密及在线升级)

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

  6. Encrypted bootloader (程序BIN文件加密及在线升级)

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

  7. nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)

    摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...

  8. dsp 28377在线升级 实例总结

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

  9. STM32 IAP 在线升级详解(转)

    源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP   ...

随机推荐

  1. lucene&solr-day1

        全文检索课程 Lucene&Solr(1) 1.   计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a)   ...

  2. Ajax异步请求模板

    $.ajax({ url: '', type: 'post', data: {'id':id}, dataType: 'json', success: function(data,statusText ...

  3. zookeeper简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt193 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系 ...

  4. oracle得到日期对应的星期

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp56   select to_char(sysdate,'ww') fro ...

  5. NWERC2016-Problem A(Arranging Hat)

    Arranging Hat is a cushy job indeed; high impact work, absolute authority, and 364 days of holiday e ...

  6. 从聚合数据请求菜谱大全接口数据,解析显示到ListView

  7. 设计模式-单体模式(C++)

    设计模式-单体模式 单体模式在使用非常方便,适合于单一的对象,例如全局对象的抽象使用. 需要注意的是单体模式不可继承 // 实现 Singleton.h #ifndef __SINGLETON_H__ ...

  8. 201521123084 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. (1)Java中把不同类型的输入.输出抽象为流(Stream),而其中输入.输出的数据则称为数据流(Data ...

  9. 必应词典英语学习APP案例分析

    一.调研,评测 1.在此次作业之前并没有听过这个学英语app,必应听起来就像英语单词bing,第一次听到觉得这个app很奇怪,但没有将它和英语挂上钩.但是使用一阵子之后我觉得这个名字很好上口,其次这个 ...

  10. 201521123029《Java程序设计》第三周学习总结

    1.本周学习总结 2.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pu ...