天天看點

STM32F0XX DMA序列槽發送資料

**前言:**
           

最近在接手一個安排的時候,需要修改之前的一些代碼的外設接口,然後發現之前有部分關于USART通過DMA收發資料的部分功能,修改移植的時候發現有些需要注意的事項,以及解釋的,做一篇小筆記吧,部落客使用的單片機是STM32f071。

USART有三種模式進行傳輸:輪詢、中斷、以及DMA。

輪詢模式

CPU不斷查詢IO裝置,如裝置有請求則加以處理。例如CPU不斷查詢序列槽是否傳輸完成,如傳輸超過則傳回逾時錯誤。輪詢方式會占用CPU處理時間,效率較低。

中斷控制方式

當I/O操作完成時,輸入輸出裝置控制器通過中斷請求線向處理器發出中斷信号,處理器收到中斷信号之後,轉到中斷處理程式,對資料傳送工作進行相應的處理。

直接記憶體存取技術(DMA)方式

所謂直接傳送,即在記憶體與IO裝置間傳送一個資料塊的過程中,不需要CPU的任何中間幹涉,隻需要CPU在過程開始時向裝置發出“傳送塊資料”的指令,然後通過中斷來得知過程是否結束和下次操作是否準備就緒。

· 如果沒有多操作過,可以用STM32CubeMX進行快速配置哈,這是之前學習CubeMX時候看到教程,很精簡,點選進傳入連結接。

序列槽的基本配置大家可以看哈野火老哥的教程,很紮實很細緻。

首先配置好需要用的usartx:

STM32F0XX DMA序列槽發送資料

時鐘配置,開啟gpio、usart、dma時鐘.

STM32F0XX DMA序列槽發送資料

IO配置為需要的模式.**注意:**f0系類的MCU配置複用功能的時候需要配置GPIOx_AFR寄存器,此在資料手冊查詢到PD5 PD6引腳預設複用功能引腳便是USART2,是以此處便可以省略配置,但是其他時候大家配置的時候記得進行查詢在進行配置.

STM32F0XX DMA序列槽發送資料

資料手冊查詢位置

STM32F0XX DMA序列槽發送資料

此處為stm32f0開發手冊GPIO寄存器配置查詢

STM32F0XX DMA序列槽發送資料

usart2外設配置

利用DMA通道發送接收序列槽時候,收發是分離的。

DMA的發送有幾個步驟.

1.在資料發送緩沖區内放好要發送的資料,說明:此資料緩沖區的首位址必須要在DMA初始化的時候寫入到DMA配置中去。

2. 将資料緩沖區内要發送的資料位元組數指派給發送DMA通道,(序列槽發送DMA和序列槽接收DAM不是同一個DMA通道)

3.開啟DMA,一旦開啟,則DMA開始發送資料,說明一下:在KEIL調試好的時候,DMA和調試是不同步的,即不管Keil 是什麼狀态,DMA總是發送資料。

3. 等待發送完成标志位,即下面的終端服務函數中的第3點設定的标志位。或者根據自己的實際情況來定,是否要一直等待這個标志位,也可以通過狀态機的方式來循環查詢也可以。或者其他方式判斷資料發送完成.

DMA的接收步驟

序列槽接收DMA在初始化的時候就處于開啟狀态,一直等待資料的到來,在軟體上無需做任何事情,隻要在初始化配置的時候設定好配置就可以了。

判斷資料資料接收完成:

這裡判斷接收完成是通過序列槽空閑中斷的方式實作,即當序列槽資料流停止後,就會産生IDLE中斷。這個中斷裡面做如下幾件事:

1.關閉序列槽接收DMA通道,2點原因:1>.防止後面又有資料接收到,産生幹擾。2>.便于DMA的重新配置指派,下面第4點。

2. 清除DMA 所有标志位

3. 從DMA寄存器中擷取接收到的資料位元組數

4. 重新設定DMA下次要接收的資料位元組數,注意,這裡是給DMA寄存器重新設定接收的計數值,這個數量隻能大于或者等于可能接收的位元組數,否則當DMA接收計數器遞減到0的時候,又會重載這個計數值,重新循環遞減計數,是以接收緩沖區的資料則會被覆寫丢失。

5. 開啟DMA通道,等待下一次的資料接收,注意,對DMA的相關寄存器配置寫入,如第4條的寫入計數值,必須要在關閉DMA的條件進行,否則操作無效。

說明一下,STM32的IDLE的中斷在序列槽無資料接收的情況下,是不會一直産生的,産生的條件是這樣的,當清除IDLE标志位後,必須有接收到第一個資料後,才開始觸發,一斷接收的資料斷流,沒有接收到資料,即産生IDLE中斷。

此處文字是摘錄别人的文字,大家可以看哈别人的文章,可以更好的學習一哈.附上連結.

雖然其他人寫的很詳細,但是部落客用的使用是DMA移植發送形式,并沒有在DMA通道的專用中斷函數發送.

MCU中DMA有5個通道的,有7個通道的,部落客使用的MCU是七個通道的,我們需要從stm32開發手冊進行查詢并配置對應的通道,這個很重要,記得,因為其他的配置都很正常,在這裡配置的時候需要注意,因為配置一旦出錯,就很容易出現hardfault.

序列槽接收DMA在初始化的時候就處于開啟狀态,一直等待資料的到來,在軟體上無需做任何事情,隻要在初始化配置的時候設定好配置就可以了。

判斷資料資料接收完成:

這裡判斷接收完成是通過序列槽空閑中斷的方式實作,即當序列槽資料流停止後,就會産生IDLE中斷。這個中斷裡面做如下幾件事:

  1. 關閉序列槽接收DMA通道,2點原因:1.防止後面又有資料接收到,産生幹擾。2.便于DMA的重新配置指派,下面第4點。
  2. 清除DMA 所有标志位
  3. 從DMA寄存器中擷取接收到的資料位元組數
  4. 重新設定DMA下次要接收的資料位元組數,注意,這裡是給DMA寄存器重新設定接收的計數值,這個數量隻能大于或者等于可能接收的位元組數,否則當DMA接收計數器遞減到0的時候,又會重載這個計數值,重新循環遞減計數,是以接收緩沖區的資料則會被覆寫丢失。
  5. 開啟DMA通道,等待下一次的資料接收,注意,對DMA的相關寄存器配置寫入,如第4條的寫入計數值,必須要在關閉DMA的條件進行,否則操作無效。

    說明一下,STM32的IDLE的中斷在序列槽無資料接收的情況下,是不會一直産生的,産生的條件是這樣的,當清除IDLE标志位後,必須有接收到第一個資料後,才開始觸發,一斷接收的資料斷流,沒有接收到資料,即産生IDLE中斷。

STM32F0XX DMA序列槽發送資料

DMA處查詢usart2_通道為ch4,或者可以通過Remap到ch7進行發送資料.

STM32F0XX DMA序列槽發送資料

由于資料發送的時候,尚未發送完成就執行完函數,是以加上發送完成标志完成判斷,然後再清除掉标志.

DMA通道配置函數,配置之後就可以使用此函數了.

STM32F0XX DMA序列槽發送資料

主函數調用

STM32F0XX DMA序列槽發送資料

序列槽列印顯示

但是Remap請慎用,有些MCU是沒有此項功能的.部落客最早之前就是想用Remap,沒有主要此處,是以造成了發送一直顯示隻能發送第一個byte.

STM32F0XX DMA序列槽發送資料

示範一個錯誤案例:沒有查詢是否可以DMA Remap就直接進行Remap

STM32F0XX DMA序列槽發送資料
STM32F0XX DMA序列槽發送資料
STM32F0XX DMA序列槽發送資料

**結語:**大家寫的時候一定多多注意,希望可以幫到大家,寫的比較匆忙,好多知識點就不寫了,CSDN等等大家都總結的很詳細.

大家也可以關注我的個人公衆号

STM32F0XX DMA序列槽發送資料

繼續閱讀