燒錄
我買到的型號是 STC90C516RD+,跑程序的流程大概是這樣的:
用 Keil 編譯成hex或者bin文件。
用USB線連接電腦和開發(fā)板,然后用STC或普中科技的燒錄軟件把文件寫入單片機,就可以運行了。
開發(fā)板上集成了 CH340T 芯片,將USB轉(zhuǎn)換成串口,連接到單片機,所以電腦和單片機的通信協(xié)議是串口。(當然,準確來說,USB和串口都是串行通信)
hex文件其實是一個文本文件,它有固定的格式,是Intel定的。燒錄軟件其實會把它轉(zhuǎn)換成bin文件再寫入,這一過程是透明的。bin文件就是單片機可執(zhí)行的二進制代碼了。
Keil是個IDE,而且是收費的,只支持Windows。Linux下可以使用sdcc編譯。當然,8051的指令相對較少,完全可以自己寫一個匯編器。
但是,這里最關(guān)鍵的是,文件是怎么被寫入單片機的?對于此,STC是不公開的。于是……
下面直接上研究結(jié)果。
ISP協(xié)議
STC單片機內(nèi)部ROM有一段固化的程序,稱為ISP程序,是用來支持燒錄的。早期8051并無集成此功能,要用專門燒錄器實現(xiàn)。
單片機斷電狀態(tài)下通電,稱為“冷啟動”,此時,CPU會先執(zhí)行該ISP程序。
這估計是借鑒了PC中BIOS的原理。
ISP程序會去檢查串口RXD是否高電平,有合法的下載命令流,如果有,就進入ISP模式;如果沒有,就直接跳轉(zhuǎn)到地址0000H執(zhí)行用戶程序。
因此,我們電腦(被稱為“上位機”)上的燒錄軟件,就是要讓單片機進入ISP模式,然后將數(shù)據(jù)發(fā)送給它。
重頭戲來了
首先,在單片機斷電情況下,但串口仍與PC連接時,燒錄軟件即要打開串口,以 1200/2400/4800 其中之一(建議1200)波特率,不斷往串口發(fā) 0x7F。
重要參數(shù):波特率1200,停止位1,無校驗、數(shù)據(jù)位為8位。
重要提示:如果波特率高于4800,無法進入ISP模式。
此時,打開開發(fā)板電源,單片機冷啟動。檢測到串口有0x7F,進入ISP模式。并發(fā)送類似如下的回復(fù):
68 00 3B 00 16 BA 16 B6 16 B6 16 BA 16 BA 16 BA 16 B6 16 B6 43 43 FD F1 30 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 39 16
68 00 是回應(yīng)標識符。
3B 包的長度。
00 表示這是數(shù)據(jù)包。
16 BA 16 B6 16 B6 16 BA 16 BA 16 BA 16 B6 16 B6 是8次測量脈寬的數(shù)據(jù),可以借此計算出單片機的晶振頻率、最大支持波特率。
43 43 表示固件版本是 4.3C。
FD 是單片機選項,每一位都表示一個選項信息:
x x x x x x x x
8 7 6 5 4 3 2 1
1=時鐘倍速,1=12T,0=6T
3=需要短接P1.0/P1.1 才能下載 1=關(guān)閉,0=開啟
4=下次下載擦DATAFLASH,0=開,1=關(guān)
5=時鐘增益,1=高,0=低
6=ALE腳,0=P4.5,1=ALE
7=允許訪問內(nèi)部AUX RAM,1=允許,0=不允許
8=停止看門狗,1=復(fù)位關(guān),0=停電關(guān)
倒數(shù)第二個字節(jié) 39 是校驗和。
最后一個字節(jié) 16 是包尾固定值。
其他字節(jié)對燒錄而言暫不需要。
包的格式
我們發(fā)的第一個數(shù)據(jù)0x7F和單片機第一次回應(yīng)(如上),都不是真正的包,在接下來的通信中,則使用固定的包格式。其格式如下:
包頭 + 標識符 + 包長 + 命令 + 數(shù)據(jù) + 校驗和 + 包尾
包頭:2字節(jié),固定為 46 B9。
標識符:2字節(jié),上位機發(fā)往單片機的為 6A 00,單片機發(fā)往上位機的為 68 00。
包長:1字節(jié),除包頭外的長度。
命令:1字節(jié),代表包的類型。
數(shù)據(jù):不固定長度。可以無。其長度可由包長計算得出。
校驗和:1字節(jié),除包頭、校驗和本身、包尾外的數(shù)據(jù)的校驗和。
包尾:1字節(jié),固定為 16。
校驗和的計算方法
校驗和計算方法為 標識符、包長、命令、數(shù)據(jù) 4個部分的數(shù)據(jù),各字節(jié)相加,取低8位。
命令類型
00: 數(shù)據(jù)
80: 確認
82: 關(guān)閉
84: 擦除ROM
8D: 設(shè)置選項
8E: 確認波特率
8F: 校驗波特率
10: 未知
50: 未知
數(shù)據(jù)包格式
上位機發(fā)往單片機的數(shù)據(jù)即二進制代碼文件,它被封裝在上述的包:數(shù)據(jù)一節(jié)中,但它本身也是有格式的:
占位符 + 地址 + 長度 + 代碼數(shù)據(jù)
占位符:2字節(jié),固定為 00 00。
地址:2字節(jié),表示代碼的地址。
長度:2字節(jié),表示代碼的長度。
代碼數(shù)據(jù):其長度由上面字段指出。
燒錄過程總結(jié)
上面已經(jīng)將STC的通信協(xié)議格式分析完畢了。需要具體分析的只剩下命令的含義、各個數(shù)據(jù)的含義了。這些都是后話了。至少關(guān)于燒錄,上面的信息已經(jīng)夠多了。
首先,單片機斷電。燒錄程序啟動,以1200波特率不斷往其串口發(fā)送0x7F。然后通電。
收到單片機信息的回復(fù),此回復(fù)主要包括脈寬、型號、選項等信息。
由收到的脈寬值,計算出重裝值,并發(fā)送給單片機。等待約200ms。同時由脈寬值計算出單片機最大支持的波特率,然后切換到某波特率(不得超出最大波特率),等待回應(yīng)。
如果收到正確的回復(fù),則表示波特率可行,則切換到1200波特率,并發(fā)送一個波特率確認的包文。發(fā)送完,等待約200ms,然后切換回原來的波特率,等待回應(yīng)。
如果收到單片機的波特率確認包文,表示到目前為止,一切正常。否則,就算失敗。
連續(xù)發(fā)送約5次重新握手的包文并等待回應(yīng)。如果收到回應(yīng),表示一切正常,可以開始發(fā)送代碼數(shù)據(jù)了。否則就是失敗。
將代碼數(shù)據(jù)分割成一定大小的包發(fā)送并等待正確回應(yīng)。
設(shè)置單片機選項。
發(fā)送50包文,等待正確回應(yīng)。然后發(fā)送關(guān)閉包文。
關(guān)閉串口,結(jié)束通信。
STC還支持熱啟動燒錄,就是不用先斷電再通電,而是在通電狀態(tài)下可以直接燒錄。看來,ISP程序一直在監(jiān)聽串口。普中科技的“自動下載軟件”就是用這種方法燒錄的。其技術(shù)細節(jié),以后再更新。
注意
在通信過程中,單片機內(nèi)部的ISP每次都會啟動一個定時器,目測大概是2s,一旦通信過程中超時,單片機就會馬上終止通信并跳轉(zhuǎn)到0000H處執(zhí)行用戶程序。
評論