历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2020年09月01日 | PIC18FxxJxx HID Bootloader移植以及编译的经验之谈

发布者:blazings 来源: eefocus关键字:PIC18FxxJxx  HID  Bootloader  移植  编译 手机看文章 扫描二维码
随时随地手机看文章

一、移植参考资料:
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,所以所有修改代码都放在截图处就行)。
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功能。

关键字:PIC18FxxJxx  HID  Bootloader  移植  编译 引用地址:PIC18FxxJxx HID Bootloader移植以及编译的经验之谈

上一篇:pic16f1828 串口输出测试
下一篇:CAN过滤器、屏蔽器及标识符设置详解

推荐阅读

港交所披露显示,港股主板上市公司桐成控股向火币集团董事长转让73.73%的股权,转让完成后,全球最大数字资产交易平台之一的火币集团成为其实际控制人。 中国的区块链企业要上市了! 这令小巴联想到一周前,北京市朝阳区金融风险防控工作领导小组办公室下发了一份《关于禁止承办虚拟币推介活动的通知》的文件。 而就在文件下发的前一天半夜,火币集团旗...
Power Integrations(PI)于2019年7月27日发布了结合PowiGaN技术的全新InnoSwitch™3系列恒压/恒流离线反激式开关电源IC,利用GaN(氮化镓)技术,让InnoSwitch的产品在整个负载范围内提供95%的高效率转换,并且在密闭适配器内不使用散热片的情况下可提供100 W的功率输出。这款产品的发布日期专门选在了PI二季度财报当天,足见该技术对PI未来的重要性。P...
日前, 马斯克旗下的脑机接口公司Neuralink 举办发布活动,公开了可实际运作的Neuralink设备和自动植入手术设备。马斯克在发布会上表示,Neuralink的目的是创造能够解决脑部/脊椎损伤问题的设备,且能够舒适地放置在脑部。发布会上马斯克展示了最新的Neuralink设备LINK V0.9 支持单个设备配备1024个通道并支持远程数据传输。“Neuralink的BMI(brain-m...
本节主要内容:完成Lora模块单片机STM8L101F3标准库的移植STM8l101F3单片机属于是8位单片机,但和传统的51有很大的区别:1.STM8的内核不一样: 51单片机的内核是传统的8051,STM8是ST独有的8位单片机内核。2.STM8单片机内部的寄存器更多,资源更丰富,功能更强大,价格相比8051更贵一点。3.ST公司提供了STM8单片机对应的标准库,程序开发一般基于标准库来开...

史海拾趣

问答坊 | AI 解惑

浅析变频器迅速发展之原因

我们通常所说的变频器 电动机变频器GKC800 就是运动控制系统中的功率变换器。现今运动控制系统包含有多种学科。技术领域总的发展趋势就是:驱动的交流化,功率变换器的高频化,控制的数字化、智能化和网络化。所以,变频器作为系统的重要功率变换部 ...…

查看全部问答∨

keil学习(一)

Keil 工程文件的建立、设置与目标文件的获得 单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇 ...…

查看全部问答∨

altium designer 和Protel 99se哪个更好?

我只用过protel 99se 但是听说altium designer 很不错,就有打算把protel换成altium designer ,大家说觉得有必要吗,有用过的大侠现身说法一下吧 呵呵多谢了 比如说,altium designer 好不好上手 资料好不好找  呵呵…

查看全部问答∨

专为狗设计的MP3。超贵

这款MP3售价要2000美元,是狗专用的。 用料方面毫无悬念,白的是白金、黄的是黄金、闪亮的是钻石。据说给狗听音乐能够使够的精神放松。不过人听的音乐够听了能放松吗?另一方面,人怎么知道狗放没放松?…

查看全部问答∨

WINCE启动运行程序LCD无显示

各位大侠: 我修改了shell.reg里面的内容如下: [HKEY_LOCAL_MACHINE\\init] ;"Launch50"="explorer.exe" ;"Depend50"=hex:14,00, 1e,00 "Launch200"="player.exe" "Depend200"=hex:14,00, 1e,00 本意是想开机就运 ...…

查看全部问答∨

售:嵌入式软件方案(wince5.0)

wince5.0软件方案(可用于数码相框,广告机,MID等): 1. 支持800x480分辨率; 2. 支持wi-fi; 3. 支持jpg,bmp,png格式照片浏览; 4. 支持音视频播放(mp3, wav, mp4, wmv等); 5. 支持RSS新闻(支持RSS2.0标准); 6. 支持vTuner(提供网 ...…

查看全部问答∨

驱动AT080TN52液晶

最近在学校用了一个试验箱,芯片是CYCLONE III,上面有个AT080TN52的TFT液晶,想用VHDL直接驱动显示一副图像,不知道如何实现,请用过的大哥指教一下,谢谢…

查看全部问答∨

LM3S811 画简单板子出现问题 焊接好之后不能下载

   自己画了一个做课设的板子  主控芯片是TI的LM3S811, 自己原来有一块811的开发板, 板子回来之后焊接了第一块,不能下载,以为是自己焊得不是很好,又仔细焊接了第二块,结果还是一样,自己测试电源打压正常、晶振起振、复位键正 ...…

查看全部问答∨

初学FPGA (2):遇到的第二个小错误--关于仿真(EEFPGA学习计划)

       用VHDL写了一个2选1多路选择器。编译后新建了一个“vector waveform File” 进行波形仿真的练习,发现输出波形好像是有时延的感觉。经查阅知道:quartus的仿真分为两种:时序仿真和功能仿真。时序仿真模式是 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved