一、移植参考资料:
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,所以所有修改代码都放在截图处就行)。
(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即可)。
(3)修改boot的ROM range的范围,由于官方给的工程需要你使用XC8的pro模式进行编译,这样boot的大小可以控制在4K以内,但pro模式要收费的,若是使用free模式那么编译出来boot大小在10KB左右,因为free模式用户需要修改进入app地址。需要修改的文件是Boot_18fxxjxx.h和vectorRemap.asm,需修改的宏定义如图3所示。
Boot_18fxxjxx.h需要修改3处,vectorRemap.asm需要修改两处。以本人修改为例,本人跳转app的地址设置为0x3000,因此做得修改如图4和图5所示。另外,boot工程属性–xc8 linker–option categories–memory model–ROM ranges设置为:default,-3000-FFF7。
(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线时一定要确保可供电可通信)
四: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功能。
上一篇:pic16f1828 串口输出测试
下一篇:CAN过滤器、屏蔽器及标识符设置详解
推荐阅读
史海拾趣
进入21世纪后,随着新能源汽车产业的兴起,FORYARD敏锐地捕捉到了这一市场机遇。公司开始将研发重心转向汽车电子领域,特别是新能源汽车的电池管理系统(BMS)和电机控制器(MCU)等关键技术。通过持续的技术创新和研发投入,FORYARD成功开发出了一系列高性能、高可靠性的汽车电子产品,并成功应用于多家知名新能源汽车制造商的车型中。这一举措不仅为公司带来了新的增长点,也推动了新能源汽车产业的快速发展。
Holt在支持ARINC 429标准方面展现出了强大的实力。其ARINC 429 IC产品系列从简单的线路接收器到集成RAM的完整协议解决方案,覆盖了业内最广泛的范围。这些产品设计精巧,能够在单个3.3V电源上运行,显著降低了系统复杂性和板空间,为航空电子系统带来了更高的效率和可靠性。Holt的这一系列创新产品,不仅满足了航空制造商的严格需求,也推动了ARINC 429标准在全球范围内的广泛应用。
随着中国电子行业的快速发展,EFINIX公司看到了巨大的市场潜力。公司积极拓展中国市场,与中国本土企业展开合作,推动Quantum™可编程加速器技术和Trion FPGA产品在中国市场的应用。EFINIX公司的产品和服务得到了中国客户的广泛认可,为中国电子行业的发展做出了积极贡献。
3E SECURITY公司自创立之初,便以技术创新为核心竞争力。在电子安全领域,公司不断投入研发,推出了一系列具有自主知识产权的安全产品。其中,一款智能安全监控系统凭借其高度集成和智能化特点,迅速在市场上占据了一席之地。通过不断的技术革新,3E SECURITY逐渐在电子安全行业树立了技术领先的形象,吸引了大量合作伙伴和客户的关注。
在追求经济效益的同时,CT公司始终注重履行企业社会责任。公司积极参与公益事业,支持教育事业发展,为贫困地区捐赠教育设备和资金。此外,CT公司还注重环保和可持续发展,通过采用环保材料和节能减排措施等方式降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也为公司赢得了更多消费者的认可和支持。
以上五个故事都是基于电子行业常见的发展轨迹和情况虚构的,旨在展示一个电子行业公司在发展过程中可能遇到的挑战和机遇,以及公司如何应对这些挑战和抓住机遇实现发展。这些故事并不针对任何具体的公司或个人,也不包含任何褒贬评价。
随着技术的不断发展和市场的不断变化,洲光源公司意识到单一的产品线已经无法满足市场的多样化需求。因此,公司开始实施多元化战略,积极拓展新的应用领域和市场。通过与国内外知名企业和研究机构的合作,洲光源成功将红外LED技术应用于汽车电子、医疗电子、生物识别等领域,并取得了显著的成果。这些新的应用领域不仅为洲光源公司带来了更多的商机,也进一步提升了公司的技术实力和品牌影响力。
我们通常所说的变频器 电动机变频器GKC800 就是运动控制系统中的功率变换器。现今运动控制系统包含有多种学科。技术领域总的发展趋势就是:驱动的交流化,功率变换器的高频化,控制的数字化、智能化和网络化。所以,变频器作为系统的重要功率变换部 ...… 查看全部问答∨ |
|
altium designer 和Protel 99se哪个更好? 我只用过protel 99se 但是听说altium designer 很不错,就有打算把protel换成altium designer ,大家说觉得有必要吗,有用过的大侠现身说法一下吧 呵呵多谢了 比如说,altium designer 好不好上手 资料好不好找 呵呵… 查看全部问答∨ |
这款MP3售价要2000美元,是狗专用的。 用料方面毫无悬念,白的是白金、黄的是黄金、闪亮的是钻石。据说给狗听音乐能够使够的精神放松。不过人听的音乐够听了能放松吗?另一方面,人怎么知道狗放没放松?… 查看全部问答∨ |
各位大侠: 我修改了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软件方案(可用于数码相框,广告机,MID等): 1. 支持800x480分辨率; 2. 支持wi-fi; 3. 支持jpg,bmp,png格式照片浏览; 4. 支持音视频播放(mp3, wav, mp4, wmv等); 5. 支持RSS新闻(支持RSS2.0标准); 6. 支持vTuner(提供网 ...… 查看全部问答∨ |
最近在学校用了一个试验箱,芯片是CYCLONE III,上面有个AT080TN52的TFT液晶,想用VHDL直接驱动显示一副图像,不知道如何实现,请用过的大哥指教一下,谢谢… 查看全部问答∨ |
|
自己画了一个做课设的板子 主控芯片是TI的LM3S811, 自己原来有一块811的开发板, 板子回来之后焊接了第一块,不能下载,以为是自己焊得不是很好,又仔细焊接了第二块,结果还是一样,自己测试电源打压正常、晶振起振、复位键正 ...… 查看全部问答∨ |
初学FPGA (2):遇到的第二个小错误--关于仿真(EEFPGA学习计划) 用VHDL写了一个2选1多路选择器。编译后新建了一个“vector waveform File” 进行波形仿真的练习,发现输出波形好像是有时延的感觉。经查阅知道:quartus的仿真分为两种:时序仿真和功能仿真。时序仿真模式是 ...… 查看全部问答∨ |