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

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

发布时间:2023-02-15 发布时间:
|

一、移植参考资料:
microchip官方提供的MLA,本人下载的是版本是V2018_11_26,主要参考资料路径如下(版本若是老一点的也没问题,我比较了V2016_11_07,在HID bootloader应用方面的例程代码是完全一样的):
(1)参考例程:microchipmlav2018_11_26appsusbdevicebootloadersfirmwarepic18fxxjxxpic18f_starter_kit.x
(2)文档:microchipmlav2018_11_26dochelp_mla_usb.pdf(章节1.6.3)、microchipmlav2018_11_26appsusbdevicebootloadersfirmwarepic18fxxjxxReadme Usage Notes for Bootloader with XC8.txt
(3)host application(PC主机的应用程序):microchipmlav2018_11_26appsusbdevicebootloadersutilitiesbinwinHIDBootloader.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,所以所有修改代码都放在截图处就行)。

图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即可)。

图2 配置字修改位置


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

图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线时一定要确保可供电可通信)

图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功能。


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

热门文章 更多
STC89C52RC单片机的NRF24L01无线通信程序.收发一体