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