首先我們要理解stc單片機(jī)下載程序的原理。在stc單片機(jī)中有兩個(gè)程序區(qū):用戶程序區(qū)和ISP監(jiān)控程序區(qū)。
這是stc89c52單片機(jī)數(shù)據(jù)手冊(cè)中的內(nèi)容。
如果這時(shí)候檢測(cè)到合法的ISP下載命令流(后面會(huì)說什么是ISP的合法下載流),則ISP監(jiān)控程序開始與ISP下載軟件通信(如stc-isp),軟件也會(huì)進(jìn)入編程模式,向監(jiān)控程序發(fā)送程序碼,監(jiān)控程序接收程序碼,并將其寫入用戶程序區(qū)中。成功后,用戶程序立即生效,開始運(yùn)行用戶程序。
如果這時(shí)候沒有檢測(cè)到合法的ISP下載命令流,單片機(jī)就會(huì)從用戶程序區(qū)開始執(zhí)行程序。
我們剛開始接觸stc單片機(jī)一般采用的都是冷啟動(dòng)來下載程序。但是這樣做有一定的缺點(diǎn)。
首先,單片機(jī)頻繁的上電掉電會(huì)影響單片機(jī)的壽命,且一些特殊的外圍電路要求一直保持有電狀態(tài)。
其次,也是我主要想說的一點(diǎn)是,市面上的USB轉(zhuǎn)TTL模塊質(zhì)量參差不齊,絕大多數(shù)模塊都沒有做好隔離,導(dǎo)致電流會(huì)從模塊的TX和RX倒灌進(jìn)單片機(jī),如果此時(shí)單片機(jī)上的電壓高于單片機(jī)的上電復(fù)位檢測(cè)門檻電壓的話,就會(huì)導(dǎo)致單片機(jī)無法冷啟動(dòng),進(jìn)而無法成功下載程序。
大廠的單片機(jī)開發(fā)板上下載電路的隔離一般是做的非常好的,我用做測(cè)試的是郭天祥的TX-1C開發(fā)板,USB只能給單片機(jī)提供0.02V的電壓。
數(shù)據(jù)手冊(cè)中給我們提供了一個(gè)簡(jiǎn)單的PL2303下載電路,其中紅色箭頭指向的那個(gè)電阻和二極管就是起隔離作用的。當(dāng)然,如果對(duì)隔離要求更為嚴(yán)格的話,還是要去查看芯片(PL2303,CH340,FT232等)的數(shù)據(jù)手冊(cè),設(shè)計(jì)最為合適的下載電路。
說是自動(dòng)下載程序,其實(shí)是和冷啟動(dòng)下載程序相對(duì)的,也就是可以不掉電下載程序。
講解原理之前我們先要說一下什么是“合法的ISP下載命令流”。
如果我們?cè)趕tc-isp上勾選了發(fā)送自定義命令的話,stc-isp首先會(huì)按照我們?cè)O(shè)置的波特率、停止位等配置向單片機(jī)發(fā)送我們自定義的命令。
然后stc-isp會(huì)以我們?cè)O(shè)置的最低波特率和默認(rèn)配置向單片機(jī)不斷發(fā)送0x7F,這通常就是我們說的“合法的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),直接下載程序了。
作者這里使用的是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 downloadexplanation: 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); }}
1.這里作者并沒有選擇使用stc-isp上的發(fā)送自定義命令,因?yàn)椴还馨l(fā)送不發(fā)送自定義命令,stc-isp最后總是要不斷發(fā)送0x7F的ISP下載流,作者偷了個(gè)懶,就不用配置自定義命令了,這樣別人拿過我的單片機(jī)也可以直接自動(dòng)下載了。
那可能有人會(huì)問:既然總是要發(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ù)位方式,可以通過配置寄存器設(shè)置更多種“自動(dòng)下載”,大家有興趣可以自行翻閱數(shù)據(jù)手冊(cè)。
3.網(wǎng)上還有很多種“自動(dòng)下載”的辦法。有人使用外部中斷來實(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í)不管怎么變形,我們只要理解了前面說的單片機(jī)下載程序的原理之后,所有的"自動(dòng)下載"都是一樣的。
4.很有意思的是硬件的自動(dòng)下載,通過硬件電路,在點(diǎn)擊下載程序之后,改進(jìn)過的USB轉(zhuǎn)TTL模塊自動(dòng)實(shí)現(xiàn)冷啟動(dòng)復(fù)位,實(shí)現(xiàn)自動(dòng)下載,這個(gè)思路和我們前面說的都不太一樣,但是還是需要冷啟動(dòng)是硬傷。大家有興趣可以自行搜索。
聯(lián)系客服