1. 程式人生 > >STM32專案開發總結(一)

STM32專案開發總結(一)

前些日子用stm32做了一個小專案,現在對專案中出現的一些奇怪問題總結如下。這裡不做程式碼層面的探討。

首先大致介紹一下專案:該專案希望實現高密的遠端資料採集及控制。下位機主控晶片是STM32F1系列晶片,TIAD轉換晶片,同時還有Lora射頻模組實現無線通訊,GPS模組及若干繼電器等。

(一)

最初遇到的一個問題是一些Lora模組無法建立通訊。Lora模組的具體使用方法這裡不做介紹,如要實現點對點通訊必須要先向模組傳送目標模組的地址與通道資訊(實際就是兩字0,1)。但是傳送資料的時候發現凡是地址或通道包含0x00的模組均難以正常傳送,如向0x0A0A模組傳送資料後,再向0x0001模組傳送資料則必失敗。無意中注意到C語言字串是以 '\0' 結尾的,其ASCII碼恰為0x00,而在串列埠傳送資料的時候恰好用到的C語言中字串處理函式,直接造成0x00被當做字串結尾二沒有傳送,後面的額資料也被捨棄。

解決辦法也很簡單,直接使用STM32庫函式中的串列埠傳送函式將地址傳送出去。

(二)

第二個問題就比較蹊蹺,程式燒到板子裡面,第一次跑一遍過程,一切正常,控制與資料採集都沒有問題。但如果跑完一遍資料採集之後,在想採集第二次則必然出錯,發出的指令對板子不起任何作用,完全按著定義的預設情況跑。因為板子在是靠幾個全域性變數決定其狀態的,命令也是修改全域性變數的值。於是就檢查全域性變數的情況,無論如和修改全域性變數,新定義或是改變全域性變數的形式,問題依然存在。後來通過串列埠每個一段時間就列印一下相關全域性變數的值,發現在採集資料前一切正常,採集資料之後相關的全域性變數消失了,串列埠在應該出現全域性變數的位置直接列印了下一個字元。

推測是記憶體出了問題,檢查發現程式佔用記憶體51k左右,而晶片記憶體僅48k,更換64k記憶體晶片問題解決。

(三)

這個問題更是奇怪,板子測試時一切正常,但接上GPS模組,工作一段時間後就會不向應任何指令。難道記憶體不足的問題又出現了?還是程式跑飛了?進一步除錯發現程式在不接GPS模組的時候不會出現問題,同時接不接GPS模組對程式需要多少記憶體幾乎沒有影響,因此記憶體應該是夠用的;難道程式跑飛了?但程式對一些指令有一定的相應,但不能完成全部的功能。其實有相應的部分是在串列埠接收中斷部分的程式碼,板子對串列埠中斷時有響應的。但為何主函式不再執行了呢?仔細檢查程式碼後也沒查出什麼錯誤。靜下心來整理思路:首先記憶體夠用,其次程式是在正常執行,但沒有執行主函式的迴圈,那程式在執行什麼呢?顯然微控制器應該是在處理一箇中斷程式,而且長時間難以返回,後者是這個中斷不斷觸發,執行完一次,下一次中斷又到來了,而且必與GPS有關。

仔細檢查了GPS的工作流程,發現GPS確實後不斷髮送一箇中斷訊號。由於我們只需要初始化的時候獲取一次GPS資訊,於是獲取完GPS資訊後失能了相關中斷,問題解決了。

對於硬體沒有所謂的玄學,只是你的功夫還不到位。