ARM微處理器ISP升級程序設(shè)計與應(yīng)用
ISP使得MCU、CPLD等不必從目標板中拔出,通過串口或?qū)S孟螺d電纜就可實現(xiàn)本地或遠程下載來實現(xiàn)程序升級。
飛利浦的LPC2000系列片內(nèi)含F(xiàn)LASH的ARM7微處理器支持ISP和IAP(In ApplIcation Programming——在應(yīng)用編程)。
LPC2000系列微處理器通過其UART0與PC(或其他設(shè)備)的COM口聯(lián)機實現(xiàn)ISP。
復(fù)位時,P0.14為低電平會使LPC2000系列微處理器進入ISP功能模式,否則進入正常工作模式。
P0.14在復(fù)位后默認初始化為高阻模式,用戶需要提供外部硬件條件——上拉或接地,使引腳處于一個確定的狀態(tài),否則可能導(dǎo)致功能紊亂——非預(yù)期的ISP模式或正常工作模式。
飛利浦提供公用的ISP下載程序,但是在某些情況下,例如為了程序統(tǒng)一性,個性化或固件的保密性,我們有必要設(shè)計自己的ISP下載程序。
ISP處理過程
ISP的整個過程如下圖所示:
1. ISP模式的進入
復(fù)位時P0.14的3ms以上持續(xù)的低電平是LPC2000系列微處理器進入ISP功能模式的必要條件。PC的串口應(yīng)設(shè)定為8個數(shù)據(jù)位、1個停止位和無奇偶校驗,波特率建議設(shè)置為9600bps,由于受ISP處理速度的影響,過高的波特率并不見得會提高ISP處理速度,反而容易導(dǎo)致ISP處理沒有響應(yīng)。
2. 自動波特率檢測
大多數(shù)SCI模塊硬件不支持自動波特率檢測。一般情況下嵌入式控制器的SCI時鐘由PLL提供,設(shè)計的系統(tǒng)工作會改變PLL復(fù)位時的工作狀態(tài),這樣很難支持自動波特率檢測功能。而在TMS320F2812處理器上,增強功能的SCI模塊硬件支持自動波特率檢測邏輯。寄存器SCIFFCT位ABD和CDC位控制自動波特率邏輯,使能SCIRST位使自動波特率邏輯工作。增加自動波特率檢測功能的SCI通信接口除了能夠滿足正常通信自動檢測系統(tǒng)的通信速率外,還支持采用SOl接口上電引導(dǎo)裝載程序?這對于通過上位機采用SCI接口實時更新系統(tǒng)軟件非常重要。
當CDC為1時,如果ABD也置位表示自動波特率檢測開始工作,就會產(chǎn)生SCI發(fā)送FIFO中斷(TXINT)。同時在中斷服務(wù)程序中必須使用軟件將CDC位清0,否則如果中斷服務(wù)程序執(zhí)行完CDC仍然為1,則以后不會產(chǎn)生中斷。具體操作步驟如下。
(1)將SCIFFCT中的CDC位(位13)置位,清除ABD位(位15),使能SCI的自動波特率檢測模式。
?。?)初始化波特率寄存器為1或限制在500 Kb/s內(nèi)。
?。?)允許SCI以期望的波特率從一個主機接收字符“A”或字符“a”。如果第一個字符是“A”或“a”,則說明自動波特率檢測硬件已經(jīng)檢測到SCI通信的波特率,然后將ABD位置1。
?。?)自動檢測硬件將用檢測到的波特率的十六進制值刷新波特率寄存器的值,這個刷新邏輯器也會產(chǎn)生一個CPU中斷。
?。?)通過向SCIFFCT寄存器的ABD CLR位(位13)寫入1清除ABD位,響應(yīng)中斷。寫0清除CDC位,禁止自動波特率邏輯。
?。?)讀到接收緩沖為字符“A”或“a”時,清空緩沖和緩沖狀態(tài)位。
(7)當CDC為1時,如果ABD也置位表示自動波特率檢測開始工作,就會產(chǎn)生SCI發(fā)送FIFO中斷(TXINT),同時在中斷服務(wù)程序中必須使用軟件將CDC位清0。
LPC2000系列微處理器在進入ISP模式之后,會自動進行“自動波特率檢測”,因為微處理器并不清楚自己所連接的晶振頻率和PC程序所設(shè)置的串口波特率。在“自動波特率檢測”通過之后,微處理器就進入處理PC程序所發(fā)送的ISP命令的狀態(tài)。
自動波特率檢測的流程如下圖所示:
PC機先發(fā)送一個同步字“?”,若微處理器因為在復(fù)位時檢測到P0.14為低電平而進入了ISP模式,則微處理器會發(fā)送“Synchronized\”給PC,PC在接收到“Synchronized\”之后,回發(fā)“Synchronized\”給微處理器,微處理器在收到“Synchronized\”之后,發(fā)送“Synchronized\OK\”給PC,PC在收到“Synchronized\OK\”之后,以ASCII碼的形式發(fā)送晶振頻率(kHz)給微處理器。例如晶振頻率為12MHz,則PC發(fā)送給微處理器的字串為“12000\”。微處理器在接收到晶振頻率之后會發(fā)送“OK\”給PC作為響應(yīng)。
注意事項:
(1) 處理器與PC的數(shù)據(jù)交換過程中,所有數(shù)據(jù)均以“\”作為結(jié)尾,十六進制為0x0D,0x0A。
(2) 任何發(fā)送或接收出錯之后,只能通過PC軟件提示“操作失敗”,并要求用戶重啟(復(fù)位/開關(guān)電源)微處理器來解決。
(3) 所有數(shù)字均以ASCII碼的形式發(fā)送。
3.ISP命令處理
在自動波特率檢測之后,PC就可以通過串口發(fā)送ISP命令和數(shù)據(jù)給微處理器了。
ISP命令簡介
LPC2000系列微處理器支持的ISP命令如下表所示。
ISP命令簡單匯總
ISP命令 功能
U 23130 解鎖。在對 FLASH編程、擦除運行之前必須執(zhí)行該命令。
B 波特率>停止位> 設(shè)置波特率。
A 1/0> 回聲開關(guān)??刂莆⑻幚砥魇欠駥⒔邮盏降臄?shù)據(jù)回發(fā)給 PC。
W RAM地址>長度> PC寫數(shù)據(jù)到微處理器RAM。數(shù)據(jù)格式為UU碼。
R RAM地址>長度> PC從微處理器RAM讀數(shù)據(jù)。數(shù)據(jù)格式為UU碼。
P 起始扇區(qū)>結(jié)束扇區(qū)> 選定即將操作的扇區(qū)范圍。
C FLASH地址>RAM地址>字節(jié)數(shù)> 命令微處理器將 RAM中的數(shù)據(jù)燒寫到FLASH中。
G 地址>模式> 執(zhí)行 FLASH或RAM中的代碼。
E 起始扇區(qū)>結(jié)束扇區(qū)> 擦除選定的扇區(qū)。
I 起始扇區(qū)>結(jié)束扇區(qū)> 檢查指定的扇區(qū)是否為空。
J 讀器件 ID。
K 讀 BOOT代碼版本號。
M 地址1>地址2>字節(jié)數(shù)> 比較 FLASH和/或RAM中的數(shù)據(jù)。
ISP讀取器件ID的過程
這里之所以介紹通過ISP讀取器件ID的過程,是因為通過ISP命令來燒寫程序相對通過ISP讀取器件ID來說復(fù)雜很多,而且燒寫程序之前往往包含讀取器件ID部分。
評論