1.前言
在使用串口往STC單片機(jī)燒錄程序時(shí),需要冷啟動(dòng),先點(diǎn)擊下載再上電。這樣做有一定的缺點(diǎn)。首先,一些特殊的外圍電路要求一直保持有電狀態(tài),有些客戶需求我們能遠(yuǎn)程操控設(shè)備就可以升級(jí)程序,而不需要去現(xiàn)場(chǎng)斷電設(shè)備。其次,頻繁的斷電上電操作也比較麻煩。
2. 實(shí)現(xiàn)原理
STC 單片機(jī)在硬件設(shè)計(jì)時(shí),增加了一個(gè)軟復(fù)位寄存器 (IAP CONTR),讓用戶可以通過(guò)設(shè)置此寄存器來(lái)決定 CPU 復(fù)位后重新執(zhí)行用戶代碼還是復(fù)位到ISP 區(qū)執(zhí)行ISP 系統(tǒng)代碼。當(dāng)向IAP CONTR 寄存器號(hào)入 0x20 時(shí),CPU 復(fù)位后重新執(zhí)行用戶代碼: 當(dāng)向IAP CONTR 寄存器寫入0x60 時(shí),CPU 復(fù)位后復(fù)位到 ISP 區(qū)執(zhí)行 ISP 系統(tǒng)代碼。
要實(shí)現(xiàn)不停電進(jìn)行 ISP 下載,我們可以在接收中斷中加入等待一個(gè)特殊的串口命令,例如默認(rèn)的“@STCISP#”。當(dāng)我們發(fā)送命令,單片機(jī)接收檢測(cè)到滿足下載條件時(shí),就通過(guò)軟件觸發(fā)軟復(fù)位寄存器復(fù)位到 ISP區(qū)執(zhí)行ISP 系統(tǒng)代碼,從而實(shí)現(xiàn)不停電JSP 下載。
我使用的是STC8H8K64U單片機(jī),可以在STC官網(wǎng)查詢自己的型號(hào)是否具有IAP功能。
3. STC-ISP設(shè)置
有幾點(diǎn)注意:(1)串口模式的波特率應(yīng)該與程序中的保持一致
(2)“下次使用STC-HID接口進(jìn)行ISP下載”不需要勾選
(3)“目標(biāo)文件變化時(shí)自動(dòng)裝載并發(fā)送下載命令”可選可不選,如果選了的話你每編譯一次它會(huì)自動(dòng)發(fā)送命令幫你下載
4. 中斷接收程序
最開(kāi)始我參考了另外一位博主寫的中斷接收程序,可以成功運(yùn)行,鏈接附上!
STC8H8K64U單片機(jī)-免冷啟動(dòng)下載程序
但是后來(lái)在運(yùn)用到別的程序上時(shí)出現(xiàn)了一些小問(wèn)題。就是這一塊代碼部分:
這段代碼的含義是:檢查接收計(jì)數(shù)器 COM1.RX_Cnt 的值是否大于等于8,即檢查是否接收到了指定長(zhǎng)度的數(shù)據(jù)。如果是,將接收計(jì)數(shù)器 COM1.RX_Cnt 的值重置為0,準(zhǔn)備接收下一幀數(shù)據(jù)。這就導(dǎo)致了如果接收到的數(shù)據(jù)字節(jié)大于8,就會(huì)被重置,數(shù)據(jù)會(huì)丟失。
我當(dāng)時(shí)想了一個(gè)修改方法是修改自定義命令的長(zhǎng)度,例如設(shè)為“@STCISPHH”就可以修改接收10個(gè)字節(jié)的長(zhǎng)度了,但是這個(gè)方法并不好用。因此我根據(jù)官方手冊(cè)中的代碼進(jìn)行修改,在接收中斷中加入一串命令函數(shù),即使換到別的實(shí)驗(yàn)程序中也只需要拷貝過(guò)去即可,非常方便。
以官方例程《06-串口1中斷模式與電腦收發(fā)測(cè)試》為例。
主函數(shù)
void main(void)
{
u8 i;
char index;
EAXSFR(); /* 擴(kuò)展寄存器訪問(wèn)使能 */
GPIO_config();
UART_config();
EA = 1;
index=0;
PrintString1("STC8H8K64U UART1-UART3 Test Programme!\r\n"); //UART1發(fā)送一個(gè)字符串
while (1)
{
delay_ms(1);
if(COM3.RX_TimeOut > 0) //超時(shí)計(jì)數(shù)
{
if(--COM3.RX_TimeOut == 0)
{
if(COM3.RX_Cnt > 0)
{
for(i=0; i<COM3.RX_Cnt; i++) TX1_write2buff(RX3_Buffer[i]); //把收到的數(shù)據(jù)通過(guò)串口1轉(zhuǎn)發(fā)
}
COM3.RX_Cnt = 0;
}
}
}
}
UART1中斷函數(shù)
#ifdef UART1
char code*STCISPCMD="@STCISP#";
char index;
void UART1_ISR_Handler (void) interrupt UART1_VECTOR
{
char dat;
if(RI)
{
RI = 0;
dat =SBUF;
if(dat==STCISPCMD[index])
{
index++;
if(STCISPCMD[index]=='\0')
IAP_CONTR=0x60;
}
else
{
index=0;
if(dat==STCISPCMD[index])
index++;
}
if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0;
RX1_Buffer[COM1.RX_Cnt++] = SBUF;
COM1.RX_TimeOut = TimeOutSet1;
}
if(TI)
{
TI = 0;
#if(UART_QUEUE_MODE == 1) //判斷是否使用隊(duì)列模式
if(COM1.TX_send != COM1.TX_write)
{
SBUF = TX1_Buffer[COM1.TX_send];
if(++COM1.TX_send >= COM_TX1_Lenth) COM1.TX_send = 0;
}
else COM1.B_TX_busy = 0;
#else
COM1.B_TX_busy = 0; //使用阻塞方式發(fā)送直接清除繁忙標(biāo)志
#endif
}
}
#endif
這樣就可以實(shí)現(xiàn)不斷電IAP下載啦,可以使程序更新更加便捷,無(wú)需斷電冷啟動(dòng)就能實(shí)現(xiàn)程序的更新。
5.方法總結(jié)
對(duì)于STC8H8K64U單片機(jī),可以使用以下方法來(lái)實(shí)現(xiàn)在不需要斷電冷啟動(dòng)的情況下更新程序:
(1)使用IAP功能:STC8H8K64U單片機(jī)內(nèi)置了IAP(In-Application Programming)功能,可以通過(guò)IAP指令和相關(guān)函數(shù)來(lái)進(jìn)行程序更新??梢允褂肐AP提供的函數(shù),通過(guò)串口或其他通信方式將新的程序代碼加載到單片機(jī)的存儲(chǔ)器中,實(shí)現(xiàn)程序的更新。
(2)使用ISP接口:STC8H8K64U單片機(jī)提供了ISP(In-System Programming)接口,可以通過(guò)該接口連接到外部編程器或開(kāi)發(fā)板上,實(shí)現(xiàn)對(duì)單片機(jī)的編程。通過(guò)連接編程器或開(kāi)發(fā)板,可以直接更新單片機(jī)的程序,無(wú)需斷電冷啟動(dòng)。
(3)使用Bootloader:可以在STC8H8K64U單片機(jī)的Flash中預(yù)留一部分空間作為Bootloader。Bootloader是一個(gè)特殊的程序,它用來(lái)接收和處理新程序的更新請(qǐng)求,并將新程序加載到單片機(jī)的存儲(chǔ)器中。通過(guò)Bootloader,可以在不需要斷電冷啟動(dòng)的情況下更新程序。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-770583.html
(4)使用USB-CDC虛擬串口。通過(guò)這個(gè)串口實(shí)現(xiàn)通信,代碼里面定義了不停電自動(dòng)ISP下載的命令,在STC-ISP里面就可以不斷電自動(dòng)ISP下載。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-770583.html
到了這里,關(guān)于STC8H系列單片機(jī)IAP實(shí)現(xiàn)不停電下載(通過(guò)串口)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!