STM32標准庫_06 | 串口高波特率接收不定長數據


本篇文章主要介紹STM32串口高波特率下接收不定長數據,因為在實際項目中會遇到串口溢出中斷的產生,導致數據接收不正確,提升串口接收中斷優先級當時也無法解決,所以采用DMA+空閑中斷的方法,希望能給人以收獲。

1.開發環境

軟件環境

使用MDK5.25版本,芯片包為STM32F4系列。

硬件環境

開發板:STM32F407VGT6開發板,是一款大容量芯片,最高能跑168MHz。

燒錄器:STlink或者Jlink。

2.工程搭建

復制上一篇代碼第4篇串口接收不定長數據的代碼,去掉串口接收中斷相關代碼,保持串口接收空閑中斷並增加串口DMA接收相關代碼。

串口相關配置

先把串口接收中斷相關代碼去掉,然后修改一下串口空閑中斷代碼。

DMA簡介與配置

DMA是可直接進行存儲器訪問的控制器,能夠完成外設與存儲器之間或者存儲器與存儲器之間的高速數據傳輸。傳輸過程也是DMA控制器自己實現的,CPU只要對傳輸動作的初始化即可,而不需要參與其中,極高的提升了CPU的效率。舉個簡單的例子:早上我需要煮一壺熱水用來泡一杯麥片,我只需要初始化煮熱水的動作即可,煮水的過程由電熱水壺(DMA控制器)自己完成,再由電熱水壺自動關閉提示完成(串口空閑中斷),我們就能取出熱水(串口數據)了,在煮熱水這段時間,我們(CPU)可以去干別的事情,像看書之類的。

1.我們先看看數據手冊,USART1接收的DMA請求位於哪個DMA(F407有兩個DMA控制器)和哪個通道。

可以從上圖得知,USART1_RX位於DMA請求映射的通道4,而且與STMF103相比,多出了數據流,分別是數據流2和數據流5,根據映射圖可知選擇數據流2和5都是可以的而且肯定比F103要多配置數據流的操作。

2.參考之前寫過的F103DMA串口接收和正點原子的F407的DMA串口發送代碼,我們開始編寫自己的F407串口DMA接收代碼。

添加DMA庫文件到工程中。

添加MDA初始配置代碼

配置DMA的參數有很多,外設為非增量模式是因為串口1的數據寄存器的地址是不變的,而存儲器為增量模式是因為我們每接收一個字節,數字地址偏移一個字節。

然后在串口空閑中斷中的接收函數中獲取我們想要的數據並通過串口1發送出來,進行回環測試。

3.測試

把串口1波特率初始化設置為1500000(即1.5M)。

進行5ms一包數據的高速通信一會,看接收與發送的字節數是否相等。

4總結

STM32串口高波特率收發的時候,引腳的引腳速度可以配置高一點,這里我用了100M,串口接收中斷的優先級也應該設置高一點,用空閑中斷可以減少進入串口中斷的次數,還能規避串口溢出中斷,是一個實時性比較好的方式。后面我又測試了下2M的波特率,發現容易丟失一個字節,看了手冊波特率最大支持4.5Mbits/s,所以我覺得應該和晶振的誤差有關,就像arduino手冊里只支持列出來的特定波特率無誤差,所以有待以后測試。

代碼已全部上傳到gitee,希望各位小伙伴們在下載的同時不忘點擊Star,地址:https://gitee.com/Notmi/stm32-standard-peripheral-libraries


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM