PIC18FxxJxx HID Bootloader移植以及编译的经验之谈

一、移植参考资料:
  microchip官方提供的MLA,本人下载的是版本是V2018_11_26,主要参考资料路径如下(版本若是老一点的也没问题,我比较了V2016_11_07,在HID bootloader应用方面的例程代码是完全一样的):
(1)参考例程:\microchip\mla\v2018_11_26\apps\usb\device\bootloaders\firmware\pic18fxxjxx\pic18f_starter_kit.x
(2)文档:\microchip\mla\v2018_11_26\doc\help_mla_usb.pdf(章节1.6.3)、\microchip\mla\v2018_11_26\apps\usb\device\bootloaders\firmware\pic18fxxjxx\Readme Usage Notes for Bootloader with XC8.txt
(3)host application(PC主机的应用程序):\microchip\mla\v2018_11_26\apps\usb\device\bootloaders\utilities\bin\win\HIDBootloader.exe(windows用户)

二、移植开发环境:
(1)编译器:XC8 V1.44(free mode)
(2)IDE:MPLAB X IDE V2.30
(3)硬件开发工具:PICKit3

三、bootloader工程例程移植主要步骤
(1)根据实际硬件设计,需要修改工程属性里面对应的芯片选项(官方提供的是pic18f46j50,需要修改为自己的芯片),并修改进入bootmain的判断条件(官方给的是按键SW2,若该IO拉高则表示有usb数据插入会进入bootmain,判断条件修改在hardwareProfile.h的80行处,详见图1,注:例程工程属性–xc8 compiler里面已经define macos PIC18F_STARTER_KIT,所以所有修改代码都放在截图处就行)。
ALT

图1 修改进入bootmain条件

(2)修改main.c中的配置字,主要是修改配置字CONFIG1L里面的PLLDIV(官方是3分频,因为外部晶振用的是12Mhz,我的硬件电路用的是20MHz,因此是5分频)以及CONFIG2L里面的OSC模式,配置字应放的位置如图2,在390行处的定义里面(用的外部晶振不同可能会影响你的USB通信使用全速还是低速,官方例程默认是高速。需要查看芯片相关的数据手册,我使用的芯片是PIC18F46J53,从振荡器配置来看,4MHz/8Mhz/12Mhz/16Mhz在HSPLL和ECPLL接法下都可工作在全速FS,20MHz想要使用工作在全速模式,晶振必须使用ECPLL接法,但我的电路使用的是无源晶振直接接在两个晶振IO两端,接法属于HSPLL模式,因此无法使用全速,只能使用低速,低速和全速的区分修改文件usb_config.h中的UCFG_VAL即可)
ALT

图2 配置字修改位置

(3)修改boot的ROM range的范围,由于官方给的工程需要你使用XC8的pro模式进行编译,这样boot的大小可以控制在4K以内,但pro模式要收费的,若是使用free模式那么编译出来boot大小在10KB左右,因为free模式用户需要修改进入app地址。需要修改的文件是Boot_18fxxjxx.h和vectorRemap.asm,需修改的宏定义如图3所示。
ALT
图3pdf文档介绍需修改的地方

  Boot_18fxxjxx.h需要修改3处,vectorRemap.asm需要修改两处。以本人修改为例,本人跳转app的地址设置为0x3000,因此做得修改如图4和图5所示。另外,boot工程属性–xc8 linker–option categories–memory model–ROM ranges设置为:default,-3000-FFF7。
在这里插入图片描述
图4 Boot_18fxxjxx.h修改样例

在这里插入图片描述
图5 vectorRemap.asm修改样例

(4)若XC18 compiler使用的是free mode(查看自己使用的模式:build configuration --> XC8 compiler --> Option Categories: Optimizations --> Operation Mode: PRO),那么需要将main.c中最后几行代码屏蔽,代码如下(因为这个宏定义强制XC compiler使用pro mode)。

#ifdef __XC8__
    #if _HTC_EDITION_ < 2   //Check if PRO, Standard, or Free mode
    #error "This bootloader project must be built in PRO mode to fit within the reserved region.  Double click this message for more details."
    #endif
#endif

经过上面四个步骤,boot工程修改已经完毕了,需通过ICSP将boot烧录至芯片中,如果一切顺利的话,通过USB数据线将PC与硬件连接,电脑便会自动安装驱动,打开应用程序HIDBootloader.exe,会显示device detached,如图6所示。(注意:在这里本人犯了一个低级错误,用了一根只供电不能通信的USB线,大家用双头USB线时一定要确保可供电可通信)
Alt

图6 设备与主机连接成功

四:application需要做的修改
  按照官方说法需要修改两个地方:
  (1)修改codeoffset:工程属性–XC8 linker–>Option categories–>Additional optionsthe -->“Codeoffset” 设置为0x3000(以本人上面boot移植为例)
  (2)修改rom range:工程属性–>XC8 global options–>XC8 linker–>Option categories–>Memory model–>ROM ranges设置为:default,-0-2FFF,-3006-3007,-3016-3017
  另外,需要注意的是保证application的配置字与boot里面的完全一样,或者application中可以不放配置字,但本人建议使用前者,保证两者一致。
  按照官方修改完毕之后编译我的工程会报错,错误针对的是0x3006和0x3016这两个地址,报错是data conflict(数据冲突)!这个问题困扰我挺久,中间过程就不描述了,直接说下原因和解决办法。
  1、0x3006处报错的原因我猜想可能是因为application代码里面没有注明什么值放在0x3006和0x3007,如果在main.c中定义一个全局变量const unsigned int flashSignature @ 0x3006=0x600D,再编译一下,这个数据冲突就可以解决掉,或者将ROM Ranges里面的-3006-3007删去,也能编译通过。
   2、0x3016处发生冲突的原因是:因为编译之后error说明写的是0x3016和intcode冲突,intcode指的是中断程序代码,因为我application里面用了高优先级中断,看编译之后的map,我的intcode范围0x3008-0x30D4,那么占用掉0x3016就会和这中断代码发生冲突了。大家可以看下0x3016-0x3017保存的是application的软件版本号,因此我们调整一下boot里面的宏定义即可,我将0x3016改为了0x30DA(修改Boot_18fxxjxx.h文件中的APP_VERSION_ADDRESS的值即可,注意按照官方资料说明,保证这个地址在application的第一页flash,,PIC18F46J53一页flash的大小为0x400,以我的地址为例,应该保证地址在0x3000-0x3400),并在application工程里面定义了一个全局变量const unsigned int VersionWord @ 0x30DA=0x0100;,这样可以在boot中读取目前application的版本。
  因此最终,我的ROM ranges设置为:default,-0-2FFF,-3006-3007,-30DA-30DB
  application的main.c里面定义了两个全局:
  const unsigned int VersionWord @ 0x30DA=0x0100;
  const unsigned int flashSignature @ 0x3006=0x600D;
  这样就可以保证编译通过。
  虽然这样编译通过了,但是我的application里面有LCD显示功能,因此定义了大量的const数组,ROM ranges这么设置可能会导致显示有问题,我猜测可能是跟FLASH里面存的数据有关吧,将ROM ranges设置为:default,-0-2FFF,-3006-3007,这样就没有问题,具体原因还不是很清楚,application的main.c里面定义了两个全局变量仍然不变。

五:将boot的hex和application的hex合并
  如果boot和application分别按照上面修改之后,application不能单独使用ICSP进行烧写了,那么为了方便批量生产,最好将boot和application进行合并,那么就不需要烧写两次,做法很简单,按照官方资料操作如下:
  在application工程里面,选择Loadables添加Loadables文件,选择boot的hex文件,然后重新编译,XC18会自动调用HEXMATE工具将两个hex进行合并,编译成功之后,使用仿真器进行ICSP烧写,那么里面既有boot又有application功能。

  本帖子是本人原创的,若需转载请标明,让我们一起尊重原创,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值