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,是以所有修改代碼都放在截圖處就行)。
圖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功能。
本文章是本人原創的,若需轉載請标明,讓我們一起尊重原創,謝謝!