STM32學習筆記8 串列埠輸出資料丟失問題

2021-07-25 20:59:19 字數 881 閱讀 8009

專案中採用stm32f103和ad7260進行資料採集。採集後想將資料通過串列埠逐點輸出到上位機,然後檢視資料是否正確。ad7260是採用外部中斷進行採集的,當ad7260的busy輸出下降沿后,觸發外部中斷,這時cpu去採集資料。

串列埠輸出部分,我先是這麼做的:在中斷中採集資料的後面新增printf(串列埠已經重定向到printf函式)語句,每採集得到乙個點後直接printf輸出。上位機用軟體serialchart測試,發現資料經常丟失,或者出現乙個很大的數(明顯超出adc的輸出範圍)。可初步斷定,是串列埠輸出部分出了問題。除錯得出的結果很簡單,但一開始走了很多彎路,如下:

1、先是感覺串列埠輸出被外部中斷打斷,在網上查串列埠輸出和和外部中斷是否會有衝突,經檢查,中斷優先順序設定等沒問題。

2、在debug模式下,測試外部中斷函式執行的時間,發現的確偏長,約3~10ms,這尼瑪也太長了。這時,我直接判斷可能是adc時序的問題,又各種看資料手冊,用示波器測試adc各個管腳,沒發現問題。

3、還是在debug模式下,逐句測試各語句耗費的時間,終於逮住罪魁禍首,原來是printf函式。尼瑪,我竟然沒想到自己程式的問題,竟然直接懷疑串列埠是否應該重定向到printf了。

4、用另乙個以前測試正常的板子和程式測試printf所用時間,發現的確是ms級,我終於意識到問題了。

5、程式波特率為9600,我在中斷中每次發的資料為乙個16位資料,計算下用時:8×2/9600*1000=1.667ms,就是ms級啊。

終於找到問題和解決方案所在了。那就是,串列埠輸出速率較慢,不適合在採集中斷裡實時呼叫。要將資料通過串列埠輸出,還是老老實實地將資料快取,然後在主迴圈中輸出。

注:以前都是通過緩衝資料後串列埠輸出的(當然,程式是在別人基礎上改的),這次自己偷懶,直接將快速資料串列埠輸出,出了問題。(⊙o⊙)…

stm32串列埠輸出

stm32開發板上是如何實現串列埠通訊的,我以實現printf重定向為例來進行分析 先看 main.c include printf.h int main printf.c include printf.h include stm32f10x.h include stm32f10x rcc.h in...

STM32串列埠筆記

參考原子的程式 基本照抄o o 串列埠設定的一般步驟可以總結為如下幾個步驟 1 串列埠時鐘使能,gpio 時鐘使能 2 串列埠復位 3 gpio 埠模式設定 4 串列埠引數初始化 5 開啟中斷並且初始化 nvic 如果需要開啟中斷才需要這個步驟 6 使能串列埠 7 編寫中斷處理函式 時鐘設定,埠模式...

STM32串列埠輸出亂碼

原因一 初始化串列埠的波特率與串列埠除錯助手不一致。原因二 晶震不一致。串列埠輸出始終亂碼,外部時鐘頻率配置錯誤導致的,庫使用預設8mhz晶震,可以通過巨集使用25mhz晶震。具體定義在stm32f10x.h 文件中 開發板晶震使用的12mhz晶震,定義乙個巨集修改成12000000,編譯,燒寫。i...