STM8S103xx串口一直中斷
前段時(shí)間做了一個(gè)項(xiàng)目,有部分功能是接收串口命令,根據(jù)命令保存一些系統(tǒng)數(shù)據(jù)(用STM8S內(nèi)自帶的EEPROM)。項(xiàng)目完成之初用串口調(diào)試工具發(fā)單條命令可以正常接收保存,但用一個(gè)上位機(jī)軟件連續(xù)發(fā)命令(約20ms)時(shí)單片機(jī)死機(jī)了。IDE用的是IAR,雖說(shuō)可以直接在線調(diào)試,但這個(gè)IDE不能在運(yùn)行時(shí)設(shè)置斷點(diǎn),所以找了好久一直沒(méi)有查到程序停在了哪里,直接代碼單步執(zhí)行跑得有點(diǎn)奇怪,但進(jìn)出中斷也正常。后來(lái)改用匯編界面單步,發(fā)現(xiàn)程序都是在進(jìn)棧出棧這些指令才懷疑是不是有一直進(jìn)出中斷,而進(jìn)出中斷肯定是中斷標(biāo)志置位了。找出STM8S規(guī)定書(shū)仔細(xì)一查才發(fā)現(xiàn)STM8S的UART還有個(gè)“過(guò)載錯(cuò)誤”,要命的是此“過(guò)載錯(cuò)誤”是產(chǎn)生中斷的,以前用的51沒(méi)發(fā)現(xiàn)有過(guò)載錯(cuò)誤這一說(shuō),AVR有,但不產(chǎn)生中斷。呵呵,知道原因了問(wèn)題當(dāng)然好解決。下面我最新的一個(gè)處理UART中斷的方法,給新手參考參考,我想用到其它MCU也是一樣的道理;如果是老手路手請(qǐng)多指點(diǎn)以完善UART的接收。
#pragma vector = UART1_R_RXNE_vector // 20
__interrupt void ISR_UART1_RECEIVE(void)
{
BYTE tempDa;
if (UART1_SR_OR_LHE)
{
// 發(fā)生過(guò)載錯(cuò)誤,順序讀UART1_SR, UART1_DR來(lái)清UART1_SR_OR_LHE位
tempDa = UART1_SR;
tempDa = UART1_DR;
// 做一些錯(cuò)誤處理
}
else
{
tempDa = UART1_DR;// 之所以用臨時(shí)變量是因?yàn)閁ART1_DR隨時(shí)會(huì)變
switch (RecvStatus)
{
case XXXX:
break;
}
}
}