作者ast9869 (甘愿为你~)
看板ASM
标题[转]MCU bootloader
时间Fri May 23 10:27:49 2008
转载至:
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