了解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. C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用

    一.基本概念 对于C++中经常出现的函数名称相同但是参数列表或者返回值不同的函数,主要存在三种情况: 1.函数重写(override) 函数重载主要实现了父类与子类之间的多态性,子类中定义与父类中名称 ...

  2. 转:【深入Java虚拟机】之三:类初始化

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17845821 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Jav ...

  3. 控制结构(9) 管道(pipeline)

    // 上一篇:线性化(linearization) // 下一篇:指令序列(opcode) 最近阅读了酷壳上的一篇深度好文:LINUX PID 1 和 SYSTEMD.这篇文章介绍了systemd干掉 ...

  4. 201521123063 java第一周总结

    20152112306 <Java程序设计>第一周学习总结 1.本周学习总结(2.20-2.26) java语言的特点: (1)简约且简单 (2)平台无关性 (3)面向对象 (4)多线程. ...

  5. 201521123021《Java程序设计》第1周学习总结

    1. 本章学习总结 1.第一次接触Java,初步了解Java的运行环境,学会了安装eclipse和JDK,解决了在安装中的path变量的设置问题. 2.知道了jvm,jre,jdk的区别,jdk是一个 ...

  6. 201521044091 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. Answer: 2. 书面作业 将Student对象(属性:int id, String name,int a ...

  7. 2015211230108《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? finally的作用: 1.确定程序 ...

  8. 利用Vim提供的正则去掉代码每行开头不想要的行号以及vi常见问题和应用技巧

    看到一不错的代码片断,但奈何无论怎么拷贝,粘贴到VS里都是带行号的,300多行的代码手工删除行号与前面的空格可得耗不少时间...这时想起了无所不能的VIM,以及它的正则,它的替换功能.解决步骤: 1. ...

  9. 01快速入门-04-Map、Set和iterable(ES6)

    1.Map 我们知道,在JS中其实对象的方式就跟Java中的Map极为相似,即键值对的方式.JS中,key必须是字符串,实际上Number等值作为key也是合理的,所以为了解决这个问题,在最新的ES6 ...

  10. Spring-Hibernate-web的延迟加载方案

    1,现象与问题 /** * 由于Hibernate存在延迟加载问题,当Dao事务提交之后,session就关闭: * 此时如果到显示层就没有办法获取对象,使用openSessionInViewer是解 ...