[轉]MCU bootloader
轉載至:
http://www.usblab.idv.tw/phpbb2/viewtopic.php?p=5758&
sid=b0589d59e98dbb27ff2e618971794d53
首先...bootload的用意在於可以應用現有的介面(常見的有uart,spi,i2c,usb)來更新ap
code...做法實在有很多種,再此說明整個bootload需要注意的地方
//-------------------------------------------------------------------------------
1.決定boot code的位址
在mcu的最開始0x00或是最後段的空間(例如 0xfe00)來擺放boot code的空間,不論在前或
是在後都可以.
2.使用何種介面來傳送資料
常見的有uart,spi,i2c,usb...但是不建議使用USB,因為USB的通訊協定太複雜
,並不是判斷中斷旗標就可以完成的事情,所以並不建議,最常用的介面是uart
3.進入boot code的判斷方式
有硬體(io判斷), 也有軟體(eeprom or flash)判斷.兩種各有好處.最常用的應該是軟體
吧.
4.mcu一定要能夠自己存取mcu內部的flash.
這是基本概念,某些mcu就不能自己存取mcu內部的flash,那就不能做bootload的功能.
//--------------------------------------------------------------------------------
以下是bootload的其中一種方式
BOOT ROM 在FLASH的最前面
+-----------------+------------------------------------+
| BOOT | APPLICATION |
+-----------------+------------------------------------+
00 0X200 END
其中boot code佔用flash 位址 0x00~0x1ff
而ap code佔用的flash位址 0x200~end
//---------------------------------------------------------------------------------
ap code撰寫
如同一般程式寫法,將整個電路板需要的功能透過程式表達出來.
完成之後需加入兩件事:
A. 判斷boot code進入方式
硬體:判斷io後,hi==>進入boot code, low==>就進入ap code
軟體:判斷介面接收資料為進入boot code的command則,設定內部的eeprom or flash (例
如:設定eeprom addr 0x00 data=0x5a),然後就進入boot code
B. 進入boot code
可以為reset or LJMP 0000h
之後設定compiler的hex產生偏移位址從0x200開始.(幾乎所有的 compiler都會有此設定
)
//----------------------------------------------------------------------------------
boot code撰寫
A.設定int vector的位置
因為mcu所以int vector最在mcu的最前端,所以ap code產生的任何中斷都會跳到mcu的最
前端位置,所以必須再boot code中定義將int vector指定到其他地方,例如0x03指定到
0x203, 0x0B指定到0x20B....依序類推,讓ap的中斷發生時會先跳到0x03的位址,但是
boot code已經將0x03的位址指定到0x203(AP的0x03中斷常式,因為compiler的hex偏移位
址,所以變成0x203)的位置去.(組合語言中會看到0x03的位址程式碼為 LJMP 203H).
B.判斷boot code進入方式
硬體:判斷io後,hi==>進入boot code, low==>就進入ap code
軟體:讀取 eeprom addr 0x00 data=0x5a,判斷是否為0x5a, yes==>進入boot code,
no==>就進入ap code
C.判斷介面中斷旗標
輪詢bootload介面的中斷旗標(例如 uart的接收旗標RI),接收資料後可以先將資料放在
ram中,之後清除一個block的flash空間,再將資料從ram中寫入flash理,等完全接受完畢後
,必須設定eeprom addr 0x00 data=0x00,然後mcu自我reset,從新判斷是否要進入boot
code
//---------------------------------------------------------------------------------
注意事項:
1.boot code的大小必須注意不可超過boot code的擺放空間.
2.hex file的產生是不連續的,您可以將hex file先透過燒錄器讀取後,之後另存相檔,這
樣hex file就會變成連續的,這樣的好處讓可以減少寫boot code的負擔.(可以依照flash
的位址0x200開始連續寫入)
3.您也可以將 boot hex 與 ap hex整合在一起後透過燒錄器燒錄
//---------------------------------------------------------------------------------
以上只是說明整個bootload製作的大致流程,歡迎有興趣或是有問題的先進提出疑問,謝謝
--
█████████████████
█ ████████████████
█████████████████
█ ████████████████
█████████████████
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.250.190.103
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章