[轉]MCU bootloader

看板ASM (組合語言)作者 (甘願為妳~)時間16年前 (2008/05/23 10:27), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
轉載至: 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
文章代碼(AID): #18DYkeLZ (ASM)
討論串 (同標題文章)
文章代碼(AID): #18DYkeLZ (ASM)