1/stc單片機(jī)下載程序的原理首先我們要理解stc單片機(jī)下載程序的原理。在stc單片機(jī)中有兩個(gè)程序區(qū):用戶(hù)程序區(qū)和ISP監(jiān)控程序區(qū)。 這是stc89c52單片機(jī)數(shù)據(jù)手冊(cè)中的內(nèi)容。
 根據(jù)數(shù)據(jù)手冊(cè),我們可以知道,當(dāng)冷啟動(dòng)或者對(duì)ISP_CONTR寄存器送入60H產(chǎn)生復(fù)位以后,單片機(jī)會(huì)從ISP監(jiān)控程序區(qū)開(kāi)始執(zhí)行程序。 如果這時(shí)候檢測(cè)到合法的ISP下載命令流(后面會(huì)說(shuō)什么是ISP的合法下載流),則ISP監(jiān)控程序開(kāi)始與ISP下載軟件通信(如stc-isp),軟件也會(huì)進(jìn)入編程模式,向監(jiān)控程序發(fā)送程序碼,監(jiān)控程序接收程序碼,并將其寫(xiě)入用戶(hù)程序區(qū)中。成功后,用戶(hù)程序立即生效,開(kāi)始運(yùn)行用戶(hù)程序。 如果這時(shí)候沒(méi)有檢測(cè)到合法的ISP下載命令流,單片機(jī)就會(huì)從用戶(hù)程序區(qū)開(kāi)始執(zhí)行程序。 2/冷啟動(dòng)下載我們剛開(kāi)始接觸stc單片機(jī)一般采用的都是冷啟動(dòng)來(lái)下載程序。但是這樣做有一定的缺點(diǎn)。 首先,單片機(jī)頻繁的上電掉電會(huì)影響單片機(jī)的壽命,且一些特殊的外圍電路要求一直保持有電狀態(tài)。 其次,也是我主要想說(shuō)的一點(diǎn)是,市面上的USB轉(zhuǎn)TTL模塊質(zhì)量參差不齊,絕大多數(shù)模塊都沒(méi)有做好隔離,導(dǎo)致電流會(huì)從模塊的TX和RX倒灌進(jìn)單片機(jī),如果此時(shí)單片機(jī)上的電壓高于單片機(jī)的上電復(fù)位檢測(cè)門(mén)檻電壓的話(huà),就會(huì)導(dǎo)致單片機(jī)無(wú)法冷啟動(dòng),進(jìn)而無(wú)法成功下載程序。  我測(cè)量了市面上購(gòu)買(mǎi)的兩款USB轉(zhuǎn)TTL模塊(PL2303)(ch340系列沒(méi)有做好隔離的話(huà)也會(huì)出現(xiàn)同樣的情況),一款模塊會(huì)給單片機(jī)提供3.3V電壓,這時(shí)候5V單片機(jī)的冷啟動(dòng)就很可能失敗。另一款模塊會(huì)給單片機(jī)提供2V電壓,可見(jiàn)這兩款USB轉(zhuǎn)TTL模塊都是無(wú)法正常給3.3V單片機(jī)燒錄程序的。
大廠的單片機(jī)開(kāi)發(fā)板上下載電路的隔離一般是做的非常好的,我用做測(cè)試的是郭天祥的TX-1C開(kāi)發(fā)板,USB只能給單片機(jī)提供0.02V的電壓。 數(shù)據(jù)手冊(cè)中給我們提供了一個(gè)簡(jiǎn)單的PL2303下載電路,其中紅色箭頭指向的那個(gè)電阻和二極管就是起隔離作用的。當(dāng)然,如果對(duì)隔離要求更為嚴(yán)格的話(huà),還是要去查看芯片(PL2303,CH340,FT232等)的數(shù)據(jù)手冊(cè),設(shè)計(jì)最為合適的下載電路。 
3/自動(dòng)下載程序說(shuō)是自動(dòng)下載程序,其實(shí)是和冷啟動(dòng)下載程序相對(duì)的,也就是可以不掉電下載程序。 講解原理之前我們先要說(shuō)一下什么是“合法的ISP下載命令流”。  在我們按下“下載/編程”后,電腦會(huì)通過(guò)串口給單片機(jī)發(fā)送一系列數(shù)據(jù)。
如果我們?cè)趕tc-isp上勾選了發(fā)送自定義命令的話(huà),stc-isp首先會(huì)按照我們?cè)O(shè)置的波特率、停止位等配置向單片機(jī)發(fā)送我們自定義的命令。 然后stc-isp會(huì)以我們?cè)O(shè)置的最低波特率和默認(rèn)配置向單片機(jī)不斷發(fā)送0x7F,這通常就是我們說(shuō)的“合法的ISP下載命令流”。 我們?cè)倩貞浺幌聅tc單片機(jī)下載程序需要什么。第一是需要程序沖ISP監(jiān)控程序區(qū)運(yùn)行,第二是需要檢測(cè)到合法的ISP下載命令流。由于ISP下載命令流是stc-isp提供給我們的,所以我們其實(shí)可以檢測(cè)到合法的ISP下載命令流以后進(jìn)行一個(gè)軟復(fù)位,復(fù)位到ISP監(jiān)控程序區(qū),這樣便可以避免冷啟動(dòng),直接下載程序了。 4/代碼實(shí)現(xiàn)作者這里使用的是STC89C52單片機(jī),不同的單片機(jī)的寄存器不太一樣,但原理相通,只需要根據(jù)數(shù)據(jù)手冊(cè)稍作修改即可。 作者將自動(dòng)下載的代碼封裝成函數(shù)方便調(diào)用。 首先是serve.c中的代碼: //配置串口
void uart_init(void)
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
REN = 1;
SM0 = 0;
SM1 = 1;
EA = 1;
ES = 1;
}
serve.h: /*
funtion:automatic download
explanation:
switch:#define _DOWNLOAD_(before #include"serve.h")
remember to use uart_init before!
*/
#ifdef _DOWNLOAD_
#include<reg52.h>
sfr ISP_CONTR = 0xe7;
uint8_t uart_ser_n = 0;
void uart1_ser() interrupt 4
{
RI = 0; //清空接收標(biāo)志位
if(SBUF == 0x7f) //STC下載指令0X7F
{
uart_ser_n ; //判斷位自加
if(uart_ser_n == 10) //如果收到10次0X7F
{
uart_ser_n = 0; //判斷位清0
ISP_CONTR = 0x60;//復(fù)位命令
}
}
else
{
uart_ser_n = 0;
}
}
#endif
/*
explanation:
crystal frequency:11.0592MHz
bps:9600
timer1:mode2
UART:mode1
*/
extern void uart_init(void);
下面是main.c中的一個(gè)小示例: #define _DOWNLOAD_
#include"serve.h"
#include<reg52.h>
int main()
{
uart_init();
while(1)
{
P1 = ~P1;
delay_ms(100);
}
}
5/補(bǔ)充說(shuō)明1.這里作者并沒(méi)有選擇使用stc-isp上的發(fā)送自定義命令,因?yàn)椴还馨l(fā)送不發(fā)送自定義命令,stc-isp最后總是要不斷發(fā)送0x7F的ISP下載流,作者偷了個(gè)懶,就不用配置自定義命令了,這樣別人拿過(guò)我的單片機(jī)也可以直接自動(dòng)下載了。 那可能有人會(huì)問(wèn):既然總是要發(fā)送0x7F的ISP下載流,那為什么stc-isp還要設(shè)置”發(fā)送自定義命令“這樣一個(gè)功能呢? 因?yàn)樵诎l(fā)送自定義命令時(shí)我們可以自主選擇串口通信的波特率、校驗(yàn)位、停止位等參數(shù),且可以自主設(shè)置命令,這樣就使得自動(dòng)下載這個(gè)功能非常靈活,在比較復(fù)雜的項(xiàng)目里面使用自主設(shè)置命令會(huì)更加合適。 2.關(guān)于stc不同單片機(jī)型號(hào)之間的區(qū)別,stc12、stc15和stc8支持更多復(fù)位方式,可以通過(guò)配置寄存器設(shè)置更多種“自動(dòng)下載”,大家有興趣可以自行翻閱數(shù)據(jù)手冊(cè)。 3.網(wǎng)上還有很多種“自動(dòng)下載”的辦法。有人使用外部中斷來(lái)實(shí)現(xiàn)“自動(dòng)下載”。工作流程是這樣的:點(diǎn)擊下載程序后按下按鍵,單片機(jī)進(jìn)入外部中斷。在中斷服務(wù)函數(shù)中給單片機(jī)一個(gè)復(fù)位信號(hào),實(shí)現(xiàn)“自動(dòng)下載”。 這種方式的優(yōu)點(diǎn)是占用的資源少(一個(gè)外部中斷),缺點(diǎn)是還需要按按鍵。其實(shí)不管怎么變形,我們只要理解了前面說(shuō)的單片機(jī)下載程序的原理之后,所有的"自動(dòng)下載"都是一樣的。 4.很有意思的是硬件的自動(dòng)下載,通過(guò)硬件電路,在點(diǎn)擊下載程序之后,改進(jìn)過(guò)的USB轉(zhuǎn)TTL模塊自動(dòng)實(shí)現(xiàn)冷啟動(dòng)復(fù)位,實(shí)現(xiàn)自動(dòng)下載,這個(gè)思路和我們前面說(shuō)的都不太一樣,但是還是需要冷啟動(dòng)是硬傷。大家有興趣可以自行搜索。
|