前面了解了一些Flash結構和中斷重映射之后,現(xiàn)在我們來用MPLAB X IDE自帶插件MCC生成Boot代碼。
打開MPLAB X IDE開發(fā)環(huán)境,點擊Tools->Embeded ->MPLAB Code Configurator,打開MCC插件,“System Module”設置系統(tǒng)時鐘和仿真口,根據(jù)需求自行選擇。在“Device Resources”下面的Libraries找到16-bit Bootloader,點擊“16-bit Bootloader”前面的“+”,添加到"Project Resources"。
Bootloader Settings
(1)設置通信方式(UART1)
前面有提到過,目前暫時只提供UART通信,后續(xù)會提供I2C/CAN的通信方式,在這里我們選擇UART1,點擊它之后會自動的彈出UART1外設的設置,采用默認的波特率或者自己選擇都可以。在這里我設置38400,配置完之后在"Pin Manager"里面配置TX和RX端口,將U1RX配置為input,U1TX配置為output。
(2)分配Flash空間和中斷重映射表
下圖是配置Bootloader地址界面。
Bootloader End Address
此字段允許用戶定義引導加載程序的最大大小,包括地址0x0和0x100處的中斷表,實際代碼從地址0x200開始。 Bootloader程序的大小必須是DSC閃存頁面大小的倍數(shù),具體取決于DSC型號,通常為512或1024。 應用程序代碼的開始將放置在Bootloader結束之后的位置。 有關確定Bootloader大小的更多信息,請參見前面篇章介紹的Flash內(nèi)存空間結構。
例如這里給Bootloader分配2頁,所以選擇Bootloader結束地址為0x001800,在這里一定要是0x800的倍數(shù),如果不是則會報錯。
Application Section Range Addresses
這些字段顯示用戶應用程序代碼的計算出的開始和結束地址,該地址將始終緊隨引Bootloader結束地址之后,且兩者之間沒有空格。 結束地址將是物理閃存的倒數(shù)第二頁。 最后一頁包含設備配置字。 Bootloader將不會修改此頁面。
那么Application的開始地址就是0x1800,由于最后一頁是配置字,所以結束地址為0x2B7FE。
Remapped Interrupt Vector Address
此字段顯示計算出的用戶的地址重新映射中斷向量表的起始地址。 這里選擇中斷向量表的重映射地址從0x1A00開始。
Enable/Disable Bootloader Command
MCC提供了在Bootloader中提供啟用或禁用4個引導程序命令生成的功能。啟用后,將添加基本代碼以在引導程序中執(zhí)行命令。禁用后,命令將被完全刪除,如果嘗試執(zhí)行這些命令,將導致“命令不支持”響應。
Enable RESET command:允許bootloader命令發(fā)出設備重置信息。這樣,Bootloader在下載完命令后即可重置設備。某些情況下可能不希望啟用此操作,而只允許開機復位。
Enable READ command:允許Bootloader和外部Bootloader應用程序讀取用戶代碼的內(nèi)容。這可能會對某些用戶造成安全風險。
Enable CHECKSUM command:允許Bootloader和外部Bootloader應用程序對用戶代碼執(zhí)行校驗和。這可能會對某些用戶造成安全風險。
Bootloader Verification
選擇用于驗證應用程序二進制文件的方法,后續(xù)會對改部分內(nèi)容進行單獨說明,在這里我們選擇Not Blank這一選項。
Interrupt Vetor Table Remapping
remap_to_application-將中斷直接跳轉至用戶應用程序。 跳轉的每個中斷將在用戶重映射表中需要2條GOTO指令,因此每條占用6個字節(jié)的程序存儲器。 對于以硬件實現(xiàn)的所有中斷,這是最安全的選擇。但是這種成本高,需要的內(nèi)存空間大。
keep_in_bootloader-此選項會將中斷保留在引導程序中。 如果定義了中斷功能,它將僅作用于該功能。 如果未定義,它將跳轉到默認中斷處理函數(shù)。
remap_to_application_default-將中斷直接跳轉到用戶應用程序的默認中斷處理程序,而不是指定的唯一中斷向量。 該選項對于應用程序不希望使用的中斷很有用。 由于通過remap_to_application選項跳轉的每個中斷都占用2個指令字,因此跳轉所有可能的中斷的成本可能很高。 使用此選項跳轉的中斷不會占用任何其他代碼空間來進行跳轉。 由于多個中斷將被跳轉到同一向量,因此用戶代碼必須檢查觸發(fā)了哪個中斷以進行相應的處理。
作為示例,此處采用默認的配置,后續(xù)會針對不用的配置進行單獨說明,比如在Boot區(qū)產(chǎn)生中斷。
進行完上述的配置,點擊“Generate”產(chǎn)生代碼,如下:
為了驗證Boot區(qū)的程序執(zhí)行,增加一個LED閃爍的代碼, 在main.c里面增加。
同時在boot_demo.c文件RunBootLoader()函數(shù)里面進行調(diào)用。
編譯OK后將整個代碼燒錄到MCU里面,會發(fā)現(xiàn)LED再進行閃爍,說明程序運行成功。
在Bootloader程序中加入按鍵的操做,當MCU上電或者復位后如果按鍵有效,則會進入bootloader程序運行,否則會進入application程序運行。設置bootloader程序運行時的閃爍頻率和application運行的不一致,以此來判斷在哪個區(qū)間運行程序。
至此,采用MCC配置的Bootloader程序產(chǎn)生完成,接下來是進行Application的配置。