找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 4020|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM8S類(lèi)型單片機(jī)UART一直進(jìn)入接收中斷問(wèn)題解決方案

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:260753 發(fā)表于 2018-3-3 17:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

問(wèn)題描述:

在一個(gè)項(xiàng)目中,下位機(jī)使用的是STM8S003F3為主芯片。在使用RS485進(jìn)行與上位機(jī)通信時(shí),會(huì)一直進(jìn)入接收中斷,根本未接收到上位機(jī)的正確數(shù)據(jù)。

解決過(guò)程:

一開(kāi)始以為是485芯片R0引腳未上拉的緣故導(dǎo)致這個(gè)問(wèn)題,經(jīng)過(guò)將此引腳通過(guò)MCU內(nèi)部上拉,問(wèn)題得到緩解。程序工作也穩(wěn)定了,運(yùn)行了一周也沒(méi)問(wèn)題,所以一直以為問(wèn)題解決了,結(jié)果在實(shí)地安裝后,沒(méi)過(guò)多久又出現(xiàn)了這個(gè)問(wèn)題,按理說(shuō),如果是外部電磁干擾,應(yīng)該是偶發(fā),也不應(yīng)該出現(xiàn)了就不會(huì)好起來(lái),干擾源不可能一直都在。然后又是一個(gè)頭疼的事啊。。繼續(xù)找答案解決。

這時(shí)又跑去官網(wǎng)下載了stm8s類(lèi)芯片的應(yīng)用手冊(cè),重點(diǎn)就是它了。

原來(lái)stm8s類(lèi)型芯片的UART使用時(shí)在接收中斷時(shí)要注意一個(gè)過(guò)載問(wèn)題,下面呢就是手冊(cè)原文:

過(guò)載錯(cuò)誤如果RXNE還沒(méi)有被復(fù)位,又接收到一個(gè)字符,則發(fā)生溢出錯(cuò)誤。數(shù)據(jù)只有當(dāng)RXNE位被清零后才能從移位寄存器轉(zhuǎn)移到RDR寄存器。當(dāng)溢出錯(cuò)誤產(chǎn)生時(shí):● OR位被置位�!� RDR內(nèi)容將不會(huì)丟失。讀UART_DR寄存器仍能得到先前的數(shù)據(jù)�!� 移位寄存器中以前的內(nèi)容將被覆蓋。隨后接收到的數(shù)據(jù)都將丟失。● 如果RIEN位被置1,則產(chǎn)生中斷。順序執(zhí)行對(duì)UART_SR和UART_DR寄存器的讀操作,可復(fù)位OR位。

首先STM8的UART接收中斷的使能位是RIEN,而當(dāng)RIEN為1的時(shí)候就會(huì)進(jìn)入接收中斷,而能讓RIEN為1的時(shí)候是有兩種情況的。

1,一個(gè)就是在接收寄存器不為空的時(shí)候。(對(duì)應(yīng)的中斷請(qǐng)求標(biāo)志RXNE)

2,另一個(gè)就是上面說(shuō)的過(guò)載錯(cuò)誤了,在RXNE標(biāo)志位還沒(méi)有復(fù)位,又接收到一個(gè)字符,這時(shí)也會(huì)觸發(fā)接收                   中斷。(對(duì)應(yīng)的中斷標(biāo)志位OR)

那么我們的問(wèn)題就是出現(xiàn)在這里了,我們?cè)诿看谓邮罩袛喽紩?huì)清除RXNE標(biāo)志位,但是并沒(méi)有清除OR標(biāo)志位,故當(dāng)出現(xiàn)一次RXNE還沒(méi)有被復(fù)位,又接收到一個(gè)字符的情況也就出現(xiàn)了OR一直沒(méi)被清除,所以就一直進(jìn)入接收中斷了。所以解決問(wèn)題就是只要每次接收中斷都需要清除RXEN和OR這兩個(gè)標(biāo)志位就可以解決問(wèn)題了。

解決方法:

對(duì)于RXNE清零有兩種方法:直接手動(dòng)清零或讀UART_DR寄存器就可以讓RXNE清零。 對(duì)于OR清零就不能直接手動(dòng)寫(xiě)0了,這時(shí)為了同時(shí)能清除RXNE和OR標(biāo)志位,我們就使用手冊(cè)上最后一句給的方案。順序讀取這兩個(gè)寄存器,這樣即清除了OR同時(shí)又清除了RXNE標(biāo)志位。

代碼:(用的stm8s lib庫(kù))

INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18){    /* Read one byte from the receive data register */
if( UART1_GetITStatus(UART1_IT_RXNE) == SET)
{    Rxdata = UART1_ReceiveData8();
}}

if( UART1_GetITStatus(UART1_IT_RXNE) == SET)

這句就是讀取UART_SR寄存器,函數(shù)是庫(kù)函數(shù)

Rxdata = UART1_ReceiveData8();

這句就是讀取UART_DR寄存器,Rxdata就是自己定義接收數(shù)據(jù)的一個(gè)變量(緩存區(qū))。函數(shù)是庫(kù)函數(shù),讀                 取八位數(shù)據(jù)。

至此,無(wú)限進(jìn)入接收中斷的問(wèn)題就解決了。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表