STM32F0xx_DMA收發USART數據配置詳細過程


前言

關於DMA(Direct Memory Access)的功能,前面關注我微信的人應該知道,其實我已經在F1芯片上簡單講了一下。有網友要求在F0講解一下使用DMA收發串口數據。今天就應網友要求總結一下在F0芯片上,使用DMA方式傳輸(收發)USART數據的功能。

在多種芯片上(F0、F1、F2、F3、F4)了解過DMA模塊功能的朋友可能會發現一個特點,就是DMA的功能有很多相似的地方,甚至是一樣。其實,每一個模塊在不同系列芯片(甚至不同廠商)基本上是大同小異,這就是所謂的觸類旁通。對於軟件開發也是一樣的,當你學會某一項語言的開發,接觸其他語言的開發就很容易了。這里我想說,其實我對ST大部分芯片(全系列芯片STM8、STM32)都了解過,很多都是相似,只要有時間,后期還會總結一下STM8開發的的文章。當然,更多精彩內容也會出現(如:UCOS操作系統等)。

DMA的功能和用途這里就不在講述了,今天重點以查詢方式總結STM32F0xx使用DMA收發USART數據配置詳細過程 。另外提供一種以中斷方式使用DMA收發USART數據的軟件工程,感興趣的朋友請自行下載軟件工程源代碼進行研究。

 

本着免費分享的原則,如果你覺得分享內容對你有用,請關注微信公眾號“EmbeddDeveloper”還有更多精彩內容等着你。

 

下載

ST標准外設庫和參考手冊、數據手冊等都可以在ST官網下載,你也可以到我的360雲盤下載。關於F0系列芯片的參考手冊有多個版本(針對F0不同芯片),但有一個通用版本,就是“STM32F0x128參考手冊V8(英文)2015-07”建議參考該手冊,以后如果你換用一種型號芯片也方便了解。

 

今天的軟件工程下載地址(360雲盤):

查詢方式:

https://yunpan.cn/cSbcTa9ijncY2  訪問密碼 152a

 

中斷方式:

https://yunpan.cn/cSbc7T4cxqWah  訪問密碼 7e7f

 

STM32F0xx的資料可以在我360雲盤下載:

https://yunpan.cn/cS2PVuHn6X2Bj  訪問密碼 8c37

 

准備工作

在昨天的軟件工程基礎上,新建源程序文件(dma.c 和 dma.h),在工程中添加新建的源程序文件dma.c和使用到標准外設庫stm32f0xx_dma.c。如何在工程中添加源文件請看以前的文章“STM32F0_新建軟件工程詳細過程”,添加完成如下圖:

注意:

文件所在位置最好對應目錄,方便管理。比如:dma.c放在bsp文件下,添加在工程中Bsp組下面。

 

數據傳輸原理

DMA是介於內存(如:一個數組)和外設(如:USART、ADC等)之間進行數據交換的一個模塊控制器。從DMA的系統框圖(下圖)中也能大概看得出整個模塊數據傳輸的原理。關於DMA模塊在F0芯片中有幾點需要注意,請看最后重點。

 

配置過程詳情

①RCC時鍾

該函數位於bsp.c文件下面;

我個人習慣第一步配置時鍾,ST官方提供的例程也是把配置時鍾放在前面。關於RCC時鍾的配置比較重要,有好幾次我就是由於沒有配置相應RCC時鍾,讓我找了很久的問題,最后才發現是RCC時鍾沒有配置。

注意:

外設時鍾不要隨便添加,比如:RCC_APB1外設不要配置在RCC_APB2時鍾里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);這樣能編譯過,但是錯誤的

我每次都提醒RCC時鍾,是因為很多人就是因為時鍾而導致軟件運行有問題,所以,提醒更多人要注意配置RCC.

 

②DMA傳輸(內存->外設)的配置

該函數位於dma.c文件下面;

重點注意:

1、傳輸方向:這里是內存(數組) -> 外設(串口);

2、通道:使用MDA1通道2(串口發送)。

 

③DMA傳輸(外設->內存)的配置

該函數位於dma.c文件下面;

和上面注意的地方一樣,也是這兩個函數接口之間的差異。

 

④DMA傳輸串口的效果

該函數位於main.c文件下面;

這是實際運行的效果函數。

1、上電發送數據“DMA_Start...”;

2、等待接收10字節數據(DMA方式接收10字節數據);

3、DMA方式發送該10字節數據,等待發送完成。

4、依次循環下去。

 

今天的重點

A、通道的選擇

由於F0芯片有些芯片只有DMA1,沒有DMA2,有些DMA15個通道,有些DMA17個通道,這些需要根據手冊針對型號進行配置,這里不能選擇錯誤,否則不能使用DMA功能。

B、傳輸的長度

由於最大只能傳輸數量為65536,在實際項目開發中,可能有更大的數據需要傳輸,這時就需要分開傳輸才行。

C、傳輸數據寬度

數據的寬度如果傳輸兩者之間一樣的話,其實沒什么需要注意的。但是,如果數據寬度不同的話,這里就需要注意了,具體見手冊,這里只是提出來是重點,感興趣的朋友請自行研究啊。

 

說明

STM32F0的芯片軟件兼容性很好,可以適用於F0其他很多型號的芯片(具體請看手冊、或者親自測試)。

今天的工程是基於工程“STM32F0xx_TIM基本延時配置詳細過程”修改而來,以上實例總結僅供參考,若有不對之處,敬請諒解。

 

 

最后

如果你喜歡我分享的內容,你又想了解更多相關內容,請關注文章開頭的微信公眾號,新內容持續更新中,后期將會有更多精彩內容出現。

 

閱讀原文

 


免責聲明!

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



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