有人使用STM32F4芯片驗證SPI功能。當使用片內兩個SPI模塊基于中斷方式進行收發時,發現總是出現接收數據丟失的情況,貌似總丟失末尾2個數據。代碼使用HAL庫提供的API函數。這是怎么回事呢?
我拿STM32F407開發板進行驗證測試。使用SPI1做發送,SPI3做接收,都使用中斷方式。
很快重現了問題現象,即發生接收數據丟失的情形。見下圖驗證結果,發了8個數據,只收到6個數據。
現在是同一顆芯片,即同一CPU基于中斷方式完成收發。懷疑會不會是不同SPI收發模塊中斷優先級的安排不合理導致的問題。如果二者優先級一樣的話,這里的發送中斷往往先于接收中斷的產生,勢必會出現接收不及時的情形。通過對代碼跟蹤調試,也的確發現了SPI接收溢出的現象,即接收數據提取不及時。
這樣分析下來,感覺數據丟失應該跟通信速率有關,丟失數據的多少不應該固定。于是,我大幅度提升SPI通信速率再行測試,果真丟失的數據更多了。見下圖測試結果,發8個數據只收到1個數據。【前面測試時SPI波特率是5.25Mb/s,現在改為21Mb/s了】
我將SPI3接收中斷的優先級調得比SPI1發送中斷的還高,如下圖所示。
基于重新調整中斷優先級后的代碼再做測試,結果就完全正常了。
當然,我們還可以有其它靈活處理的辦法。比方發送用中斷,接收用DMA,或者發送用輪訓,接收用中斷或DMA,或者都用DMA方式也行。
這里的核心問題是中斷優先級沒有合理安排好。STM32ARM核中斷的內容不多,不過內容不多的東西往往意味著使用上更為靈活。好,今天的話題就分享到這里。
上一篇:請問一下STM32管腳重映射支持任意組合嗎?
下一篇:STM32F0系列MCU硬件電路供電設計
推薦閱讀最新更新時間:2025-06-07 23:43
設計資源 培訓 開發板 精華推薦
- can轉Profinet網關轉換:S7-1200PLC與施耐德變頻器間的通信實現
- 變頻器開關電源的維修檢測方法及案例分析
- 電機常見的噪音、振動問題及解決方法
- 萬利達電動機保護器接ModbusRTU轉profibusDP網關與300PLC通訊
- 士林變頻器如何與ModbusRTU轉profibusDP網關通訊
- 什么是邊緣盒子?一文講透邊緣計算設備在不同行業的真實應用
- 步進電機控制指令詳解
- 依利浦實驗室人工智能平臺為Ceva NeuPro-Nano NPU優化 推動實現更智能的邊緣設備
- Bourns 全新推出兩款屏蔽功率電感器系列 專為 DDR5 電源管理電路開發
- Bourns 推出新型電流變壓器產品,采用坡莫合金 T 型磁芯結構,具備高匝數比特性