Uart之資料溢位

2021-09-01 20:43:58 字數 2078 閱讀 7374

在專案現場實施專案的過程之中,出現了乙個問題。stm32的控制器,莫名其妙會宕機,不定時會出現這個問題。出現之後系統指示燈不在閃爍,網路宕機,伺服器再也ping不同,下位機的控制器。經過debug發現了抓到了這個宕機的點。我發現並不是硬體錯誤,沒有呼叫hart_fault這個中斷服務函式。但是主線程卻沒有跑起來。意外發現原來程式是反覆進入,串列埠的中斷裡面。檢查錯誤標誌,發現是串列埠溢位錯誤。原來是假死機,系統並沒有崩潰,只是全部的資源都被這個錯誤中斷給占用了。下面開始解決這個問題。

老**裡面是使用,單位元組串列埠接收中斷來實現的。由於新增的功能變得越來越多,關中斷的地方也越來越多,因此中斷響應不及時就會造成這種現象。目前使用的是4個串列埠同時工作。為了解決這個問題,使用dma加空閒中斷的方式來解決的這個問題。不需要每個位元組都進入中斷,減少進入中斷的次數,使用dma方式,無需cpu參與,減少這種情況發生的概率。增加對溢位中斷的錯誤處理。

串列埠初始化的配置

這裡需要注意的是,呼叫uart_init的時候就需要呼叫start_uart_dma_receive(edevice);因為開啟了串列埠,就會接收資料,如果此時不開始dma接收,就會導致過載。因此剛開始的時候,就要開始dma接收。

void uart_init(uart_dev edevice, u32 dwbound, u32 wordlength, u32 dwstopbits, u32 dwparity)

static void usart1_mspinit(uart_handletypedef *huart)

static boolean start_uart_dma_receive(uart_dev edevice)

g_suartdrvrxd[edevice].bydmareceiveflag = 0;

memset(g_suartdrvrxd[edevice].byrxdbuf,0,usart_rec_maxlen);

hal_uart_receive_dma(&uart_handler[edevice], g_sdma_buf[edevice], dma_size_buf[edevice]);

return true;

}

中斷處理函式

void usart1_irqhandler()                    

if((__hal_uart_get_flag(&uart_handler[uart_dev1],uart_flag_idle) != reset))

osintexit();

} static void uart_receive_idle(uart_handletypedef *huart, uart_dev edevice)

這裡清除ore這個flag是很有意思的。網上有很多說法,但是我還是以自己除錯**的實際情況為準:

首先過載的時候,呼叫__hal_uart_get_flag就可以知道接下來需要清除ore,呼叫函式__hal_uart_clear_oreflag

#define __hal_uart_clear_peflag(__handle__)     \

do while(0u)

#define __hal_uart_clear_oreflag(__handle__) __hal_uart_clear_peflag(__handle__)

可以看到清除標誌位只是去讀了,sr和dr暫存器

因此實際上清除ore的同時rxne等暫存器也已經清除掉了,因此不需要單獨再清除rxne。最後一定要再次呼叫dma開始讀下一次資料,這樣避免再一次過載。程式就可以穩健的執行。

使用者獲取資料

memcpy(buffer, &g_suartdrvrxd[edevice], sizeof(g_suartdrvrxd[edevice]));

g_suartdrvrxd[edevice].bydmareceiveflag = 0;

return has_frame;}

這樣使用者每次呼叫就可以直接獲取一幀資料,非常方便,而且可以避免串列埠資料溢位的問題。

Java之資料溢位

首先,我們來討論乙個話題,是否存在乙個數,使得這個數加一之後小於這個數呢?表面來看是不可能的。那麼接下來,來看下面這個 public class day1 程式執行結果 這就是下面要介紹的資料溢位問題。對於int long,double等基本資料型別,都有自己的儲存範圍,一旦超過這個界限,則會出現資...

UART資料波形分析

摘要 本文通過對非同步序列資料格式的分析,闡述通過波形分析方法除錯uart資料收發的原理和方法。經常遇到初學者,對微控制器序列通訊出了問題不知道如何辦的情況。其實最有效的除錯方法是用示波器觀察收發資料的波形。通過觀察波形可以確定以下情況 1.是否有資料接收或傳送 2.資料是否正確 3.波特率是否正確...

6410之uart的配置

主程式start.s define config periport base 0x70000000 define config periport size 0x13 define wtcon 0x7e004000 global start start 告訴cpu 外設的位址 ldr r0,confi...