历史上的今天
返回首页

历史上的今天

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

正在发生

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

2020-09-01 来源:eefocus

一、移植参考资料:
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功能。

推荐阅读

史海拾趣

GWP Group公司的发展小趣事

针对晶体二极管单相全波电阻负载整流电路,网友可能提出多个问题,以下是一些可能的问题及其详细回答:

1. 什么是晶体二极管单相全波电阻负载整流电路?

回答:晶体二极管单相全波电阻负载整流电路是一种将交流电(AC)转换为直流电(DC)的电路,它利用了晶体二极管的单向导电特性。这种电路通过四个二极管(通常构成桥式整流器)实现全波整流,即同时利用交流电的正负半周进行整流,从而提高整流效率。负载电阻则用于消耗整流后的直流电。

2. 该电路的工作原理是什么?

回答:晶体二极管单相全波电阻负载整流电路的工作原理基于二极管的单向导电性。在交流电的正半周,二极管D1和D3导通,D2和D4截止,电流通过D1、负载电阻和D3形成回路,负载上得到上正下负的电压。在交流电的负半周,情况相反,D2和D4导通,D1和D3截止,电流方向不变,同样通过负载电阻,从而在负载上持续得到方向不变的直流电压。

3. 为什么需要四个二极管而不是两个?

回答:使用四个二极管构成桥式整流器可以充分利用交流电的正负两个半周,实现全波整流。如果只使用两个二极管,则只能实现半波整流,即只利用交流电的一个半周进行整流,整流效率较低。桥式整流电路通过巧妙地连接四个二极管,使得在每个半周内都有电流通过负载,从而提高了整流效率。

4. 如何提高该电路的整流效率?

回答:提高晶体二极管单相全波电阻负载整流电路的整流效率可以从以下几个方面入手:

  • 选择合适的变压器:根据整流电路的输入电压和输出电压要求,选择合适的变压器,以保证整流电路的稳定性和效率。
  • 优化整流器设计:通过选择合适的二极管和优化整流器的布局,可以提高整流器的整流效率和稳定性。
  • 增加滤波电路:在整流器的输出端增加滤波电路(如电容和电感),可以滤除整流后的脉动直流电中的交流成分,得到更加平滑的直流电,从而提高整流效率。

5. 该电路有哪些应用?

回答:晶体二极管单相全波电阻负载整流电路具有广泛的应用,包括但不限于以下几个方面:

  • 电源适配器:将交流电转换为直流电,为各种电子设备提供稳定的电源。
  • 充电器:用于为电池充电,将交流电转换为适合电池充电的直流电。
  • 电源模块:作为电源模块的一部分,为各种电子设备提供稳定的直流电源。
  • 工业控制:在工业控制领域,为各种控制设备提供稳定的直流电源。

6. 该电路是否存在局限性?

回答:尽管晶体二极管单相全波电阻负载整流电路具有许多优点,但也存在一些局限性。例如,整流后的直流电仍存在一定的脉动成分,需要通过滤波电路进一步处理;此外,整流过程中会产生一定的能量损失,包括二极管的正向导通压降和滤波电路中的能量损耗等。因此,在实际应用中需要根据具体需求选择合适的整流电路和滤波方案。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc深知人才是企业发展的核心。因此,公司一直注重人才培养和引进。公司不仅设立了专门的研发机构,吸引了大批优秀的科研人才,还定期组织员工培训和交流活动,提高团队的整体素质。这些措施使得Control Sciences Inc的团队越来越强大,为公司的发展提供了有力的人才保障。

Communications & Power Industries公司的发展小趣事

面对日益激烈的市场竞争,CPI意识到单纯的产品创新已经不足以支撑公司的持续发展。于是,公司开始着手进行产业链整合,通过收购、兼并等方式,将上下游相关企业纳入自己的业务体系。这一举措不仅加强了CPI在产业链中的话语权,还提高了公司的生产效率和成本控制能力。通过整合产业链资源,CPI成功打造了一个高效、协同的供应链体系,为公司的长远发展奠定了坚实的基础。

广芯电子(BROADCHIP)公司的发展小趣事

面对日益激烈的市场竞争,CPI意识到单纯的产品创新已经不足以支撑公司的持续发展。于是,公司开始着手进行产业链整合,通过收购、兼并等方式,将上下游相关企业纳入自己的业务体系。这一举措不仅加强了CPI在产业链中的话语权,还提高了公司的生产效率和成本控制能力。通过整合产业链资源,CPI成功打造了一个高效、协同的供应链体系,为公司的长远发展奠定了坚实的基础。

Defender Security公司的发展小趣事

随着网络安全问题的全球化趋势日益明显,Defender Security公司开始积极拓展国际市场。他们与多家国际知名的网络安全企业建立了合作关系,共同应对全球网络安全挑战。通过技术交流和合作研发,Defender Security不断提升自己的国际竞争力,逐渐成为了全球网络安全领域的重要力量。

艾为(AWINIC)公司的发展小趣事

艾为电子自成立以来,一直致力于技术研发和产品创新。公司研发团队不断攻克技术难题,推出了一系列具有竞争力的产品。其中,音频功放芯片作为公司的主打产品之一,凭借出色的性能和稳定的品质,赢得了市场的广泛认可。此外,艾为还在信号链、电源管理等领域取得了显著的技术突破,为公司的持续发展奠定了坚实的基础。

问答坊 | AI 解惑

辰汉电子推出基于i.MX27的可快速量产方案

辰汉电子推出基于i.MX27的可快速量产方案                        辰汉电子推出基于i.MX27的可快速量产方案…

查看全部问答>

哈工大嵌入式系统开发课件

哈工大嵌入式系统开发课件…

查看全部问答>

请教 如何修改CE5.0 BSP下的LCD分辨率?

WINCE5.0的BSP(不是由4.2升级成5.0),240*320的屏,请问要把分辨率改为480*640的话,需要修改哪些文件,哪些参数呢?…

查看全部问答>

skyline中添加 gps 坐标

在 skyline  的terraexplorer中如何添加  gps 坐标 如何从gps 中直接倒入  坐标点…

查看全部问答>

MSP430启动的讨论

原帖内容如下:新人加初学者求助-关于DEBUG小弟初学MSP430, 请问各位达人,用IAR进行硬件仿真的时候,有没有办法保留FLASH里面原来的程序,而让开发板运行新程序,断电后恢复成原程序?我试过DEBUG WITHOUT DOWNLOADING,但开发板不能运行新的程序 ...…

查看全部问答>

请教问题(奖励10芯币),

void alarm(void){ 加一句if(carry_count*250+pulse_count>=alarm_l)  Alarm=0;//需要跳过的语句if(carry_count*250+pulse_count<alarm_h)   Alarm=1;//要执行的语句}我想要在执行前检测如果Alarm=0;就跳过    i ...…

查看全部问答>

关于低阻抗、低噪前置放大电路设计方案求助!!!

问题描述: 为了接收耦合变压器进来的双路信号,由于源阻抗低(100欧姆),信号频率为音频信号。为实现低噪接收,前级运放输入阻抗实现匹小,噪声小。配。求大家给个方案!例如:运用集成差分放大接收,选择什么型号?电路该如何接?实现输入阻抗低 ...…

查看全部问答>

请问有没有AD652的中文手册

RT,官方只有英文手册,请问在哪里可以下载到中文手册 …

查看全部问答>