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