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