1. 程式人生 > >【dsPIC33E】Bootloader(一)Bootloader的介紹與Flash結構

【dsPIC33E】Bootloader(一)Bootloader的介紹與Flash結構

對於嵌入式開發而言,Bootloader幾乎與作業系統同等重要,它可以讓我們擺脫MCU官方工具,定製自己的燒錄工具,不僅提高產品辨識度,同時也大大減少了對外引腳數量(例如相容通訊的Uart或CAN等,而不需要另外接JTAG)。

要開發Bootloader,相對於普通程式,是有一定難度的,這其中涉及到MCU的工作原理內部儲存結構等,而且僅僅依靠C語言可能無法完成,有時需要配合彙編來精確執行特殊指令(例如Flash擦寫)。

一般MCU的機器碼都是儲存在Flash中,MCU啟動時PC指標會從內部Flash第一個地址開始讀取指令執行,這個過程我們一般無法干涉。但由於我們寫的程式碼存於Flash中,所以一旦從Flash啟動,後續操作就完全可以由我們來指定,我們可以指定程式執行位置。

對於低端MCU來說,我們可以通過在Flash初始的位置設定指令,來啟動內部不同flash區域的程式,以及燒寫程式到這些flash區域,這些操作集合叫做Bootloader。Bootloader承擔著使用者程式的燒寫以及跳轉。

對於高階MCU或者CPU來說,可以輕鬆對映外部儲存(外部Flash、U盤、硬碟等),MCU啟動後,我們可以指定其從哪個儲存啟動,甚至通過通訊介面接收資料儲存到這些外部儲存。這些操作集合在嵌入式作業系統中一般稱之為UBoot,在PC中稱之為BIOS,外部儲存一般存放的是作業系統。

實際上上述兩種功能是一樣,後者相對複雜一點,此處我們著重講述前者。

下圖為通用MCU帶Bootloader程式和使用者程式的Flash儲存結構:

常規Bootloader邏輯是這樣的:

1、開機Goto到Bootloader的Main函式

2、判斷是否有按鍵按下或者是否接收到通訊命令

3、若有操作,則停留在Bootloader,執行後續操作,例如燒錄程式

4、若超過一定時間未有操作或者命令,進入使用者程式

注意:

1、Bootloader應從Flash第二頁之後開始,避免擦除程式設計中斷向量表時,導致Bootloader缺失故障。

2、Bootloader中不要使用中斷,因為Bootloader和使用者程式共用中斷向量表,更新使用者軟體會重新修改IVT。

 

以下詳細介紹dsPIC33E系列Flash操作。

對於dsPIC33E系列,內部Flash儲存如下,對於部分低端MCU,部分割槽域(例如附屬快閃記憶體)是沒有的,詳細參考該MCU的Datasheet:

 

而以dsPIC33EP256GP506為例,很多空間被閹割了,實際flash結構如下:

 

下面講講如何在MCU執行時,對內部Flash進行擦除、程式設計(注意,建議不要對當前程式執行區域進行擦寫,會導致執行異常)。

Flash程式設計相比於EEPROM,要麻煩不少。

Flash程式設計採用的方式是與模式,即程式設計時,將資料與Flash地址上的資料與操作。因此,如果一個地址上的資料位不是全都為1,那麼程式設計該地址的結果就是錯誤的,所以我們在操作Flash時要有一個共識,即,同一個地址不應該被程式設計超過2次。我們可以在第二次程式設計前,將該地址所有資料位全部置1。

我們該如何在程式設計前將對應地址的資料位全部置1呢?

那就是擦除,Flash擦除會把對應區域的資料位全部置1。但是。。。擦除不能僅擦除一個地址的資料,而是必須擦除一頁的資料,那麼一頁的大小是多少呢?是1024個指令字,一個指令字為32位(實際24位,高8位為虛位元組,始終保持為0),由於dsPIC33E系列都是16位微控制器,因此每個指令字佔2個16位資料,佔2個地址,實際擦除的地址跨度為2048,即0x800。假設我們擦除0x000000,實際會擦除0x000000-0x0007FF,擦除其中任意地址,都會擦除該頁。

基於以上原因,若是我們要程式設計某部分flash資料,需要先將該頁內所有資料讀出來,然後擦除flash頁,再修改讀出來的資料,最後重新寫入該頁所有資料。

dsPIC33E系列程式設計功能體現在快閃記憶體控制暫存器NVMCON的NVMOP<3:0>中。通用功能如下,實際功能可能會有所閹割,參考對應資料手冊。

程式設計時可以進行行程式設計、字程式設計、單個配置暫存器位元組程式設計,一行為128個指令字,字程式設計為2個指令字,單個配置暫存器位元組程式設計比較特殊,不需要擦除,可以直接程式設計,但需要注意的是,程式設計配置字時,時鐘只能是FRC,不能帶PLL。能否進行行程式設計依賴於寫鎖存器長度,寫鎖存器在0xFA0000處,部分長度只有2個指令字,所以無法進行行程式設計。

針對我們使用的示例微控制器,dsPIC33EP256GP506,參考Datasheet我們發現:

這款微控制器功能閹割較多,只支援也擦除和雙字程式設計,其寫鎖存器只有2個指令字。同時,這款微控制器的無法程式設計配置字,所以在更新使用者程式時,不能通過Bootloader燒寫配置字。

最後,需要提醒的是,由於配置字在使用者儲存區域最後一頁,擦除最後一頁會觸發程式碼保護,所有地址資料全部清零。以dsPIC33EP256GP506為例,0x02A800之後的地址不能擦除。

本節到此結束,下一節將剖析dsPIC33E系列程式編譯後的Hex檔案。