天天看點

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,是以所有修改代碼都放在截圖處就行)。

PIC18FxxJxx HID Bootloader移植以及編譯的經驗之談

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

PIC18FxxJxx HID Bootloader移植以及編譯的經驗之談

圖2 配置字修改位置

(3)修改boot的ROM range的範圍,由于官方給的工程需要你使用XC8的pro模式進行編譯,這樣boot的大小可以控制在4K以内,但pro模式要收費的,若是使用free模式那麼編譯出來boot大小在10KB左右,因為free模式使用者需要修改進入app位址。需要修改的檔案是Boot_18fxxjxx.h和vectorRemap.asm,需修改的宏定義如圖3所示。

PIC18FxxJxx HID Bootloader移植以及編譯的經驗之談

圖3pdf文檔介紹需修改的地方

  Boot_18fxxjxx.h需要修改3處,vectorRemap.asm需要修改兩處。以本人修改為例,本人跳轉app的位址設定為0x3000,是以做得修改如圖4和圖5所示。另外,boot工程屬性–xc8 linker–option categories–memory model–ROM ranges設定為:default,-3000-FFF7。

PIC18FxxJxx HID Bootloader移植以及編譯的經驗之談

圖4 Boot_18fxxjxx.h修改樣例

PIC18FxxJxx HID Bootloader移植以及編譯的經驗之談

圖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線時一定要確定可供電可通信)

PIC18FxxJxx HID Bootloader移植以及編譯的經驗之談

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

  本文章是本人原創的,若需轉載請标明,讓我們一起尊重原創,謝謝!