項目中采用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級啊。
終于找到問題和解決方案所在了。那就是,串口輸出速率較慢,不適合在采集中斷里實時調用。要將數據通過串口輸出,還是老老實實地將數據緩存,然后在主循環中輸出。
注:以前都是通過緩沖數據后串口輸出的(當然,程序是在別人基礎上改的),這次自己偷懶,直接將快速數據串口輸出,出了問題。
上一篇:STM32之 UART4 和UART5所遇到的問題
下一篇:基于STM32的FREERTOS應用的幾個常見問題
推薦閱讀
史海拾趣