STM8 串列埠資料一直卡在讀中斷

2021-10-20 23:52:46 字數 1629 閱讀 6604

stm8 uart1 開啟了讀中斷,初始化**如下:

// 配置串列埠引數為:波特率115200,8位資料位,1位停止位,無校驗,禁止同步傳輸,允許接收傳送

uart1_init((u32)115200, uart1_wordlength_8d, uart1_stopbits_1, uart1_parity_no, uart1_syncmode_clock_disable, uart1_mode_txrx_enable);

// 啟用 uart1 中斷

// uart1_it_rxne_or 表示 接收資料暫存器非空或者溢位錯誤時 觸發中斷

uart1_itconfig(uart1_it_rxne_or, enable);

// 啟用 uart1

uart1_cmd(enable);

當通過pc端的串列埠軟體向 stm8 一次性傳送多位元組資料時(例如:01 02 03),那麼stm8就會一直不停的進入讀中斷,陷入死迴圈。

stm8s 型別晶元的 uart 使用時在接收中斷時要注意乙個過載問題,下面呢就是手冊原文:

過載錯誤:

如果 rxne 還沒有被復位,又接收到乙個字元,則發生溢位錯誤。資料只有當 rxne 位被清零後才能從移位暫存器轉移到rdr暫存器(接收資料暫存器)。

當溢位錯誤產生時:

如果順序執行對uart_sr和uart_dr暫存器的讀操作,可復位or位。

首先 stm8 的 uart 接收中斷的使能位是 rien,而當 rien 為1的時候就會進入接收中斷,而能讓 rien 為1的時候是有兩種情況的:

乙個就是在接收暫存器不為空的時候。(對應的中斷請求標誌 rxne )

另乙個就是過載錯誤了,在 rxne 標誌位還沒有復位,又接收到乙個字元,這時也會觸發接收中斷。(對應的中斷標誌位or)

那麼我們的問題就是出現在這裡了,我們在每次接收中斷都會清除 rxne 標誌位,但是並沒有清除 or 標誌位,故當出現一次 rxne 還沒有被復位,又接收到乙個字元的情況也就出現了 or 一直沒被清

除,所以就一直進入接收中斷了。所以解決問題就是只要每次接收中斷都需要清除 rxen 和 or 這兩個標誌位就可以解決問題了。

必須新增if( uart1_getitstatus(uart1_it_rxne ) != reset ),若不新增,會導致uart1->dr被異常讀取,不斷的進入中斷處理函式

若 uart 的 rxne 狀態位已經被置 1,串列埠又收到新的資料,將會進入or(過載錯誤)中斷

stm8內部機制:先讀取 uart_sr,再讀取 uart_dr 才可自動把 or 位中斷狀態清零;呼叫 uart1_getitstatus(uart1_it_rxne) 即是讀取 uart_sr

在呼叫uart1_receivedata8()讀取了uart1->dr後即可清除中斷uart1_it_rxne標誌位

interrupt_handler(uart1_rx_irqhandler, 18)

STM8串列埠列印除錯資訊

static void uart1sendmsg char msg,uint16 t length void myprintfascii char msg void myprintfint8 uint8 t msg,intlength intlength m for n intlength 1 n ...

STM8學習筆記 uart1串列埠中斷

uart1串列埠傳送 接收中斷。目標 串列埠接收1,點亮led1,接收2點亮led2,接收到其他字元關閉led1和led2。步驟如下 1 編寫led.h和led.c檔案。略 2 編寫uart.h和uart.c檔案,其中串列埠配置函式如下 void usart configuration void 串...

STM32F103 串列埠 DMA中斷實現資料收發

02 stm32f103 串列埠 dma中斷實現資料收發 講了 串列埠 dma空閒中斷實現不定長資料收發的功能,除了利用空閒中斷實現資料收發,還可以利用dma的中斷實現資料的收發,不同之處是後者不能實現不定長資料的接收,本文講解dma中斷的方式實現資料的收發。使用dma的中斷時,無需配置串列埠的中斷...