STM32F0xx_DMA收發(fā)USART數(shù)據(jù)配置詳細(xì)過(guò)程
前言
關(guān)于DMA(Direct Memory Access)的功能,前面關(guān)注我微信的人應(yīng)該知道,其實(shí)我已經(jīng)在F1芯片上簡(jiǎn)單講了一下。有網(wǎng)友要求在F0講解一下使用DMA收發(fā)串口數(shù)據(jù)。今天就應(yīng)網(wǎng)友要求總結(jié)一下在F0芯片上,使用DMA方式傳輸(收發(fā))USART數(shù)據(jù)的功能。
在多種芯片上(F0、F1、F2、F3、F4)了解過(guò)DMA模塊功能的朋友可能會(huì)發(fā)現(xiàn)一個(gè)特點(diǎn),就是DMA的功能有很多相似的地方,甚至是一樣。其實(shí),每一個(gè)模塊在不同系列芯片(甚至不同廠商)基本上是大同小異,這就是所謂的觸類旁通。對(duì)于軟件開(kāi)發(fā)也是一樣的,當(dāng)你學(xué)會(huì)某一項(xiàng)語(yǔ)言的開(kāi)發(fā),接觸其他語(yǔ)言的開(kāi)發(fā)就很容易了。這里我想說(shuō),其實(shí)我對(duì)ST大部分芯片(全系列芯片STM8、STM32)都了解過(guò),很多都是相似,只要有時(shí)間,后期還會(huì)總結(jié)一下STM8開(kāi)發(fā)的的文章。當(dāng)然,更多精彩內(nèi)容也會(huì)出現(xiàn)(如:UCOS操作系統(tǒng)等)。
DMA的功能和用途這里就不在講述了,今天重點(diǎn)以查詢方式總結(jié)STM32F0xx使用DMA收發(fā)USART數(shù)據(jù)配置詳細(xì)過(guò)程。另外提供一種以中斷方式使用DMA收發(fā)USART數(shù)據(jù)的軟件工程,感興趣的朋友請(qǐng)自行下載軟件工程源代碼進(jìn)行研究。
下載
ST標(biāo)準(zhǔn)外設(shè)庫(kù)和參考手冊(cè)、數(shù)據(jù)手冊(cè)等都可以在ST官網(wǎng)下載,你也可以到我的360云盤下載。關(guān)于F0系列芯片的參考手冊(cè)有多個(gè)版本(針對(duì)F0不同芯片),但有一個(gè)通用版本,就是“STM32F0x128參考手冊(cè)V8(英文)2015-07”建議參考該手冊(cè),以后如果你換用一種型號(hào)芯片也方便了解。
今天的軟件工程下載地址(360云盤):
查詢方式:
https://yunpan.cn/cSbcTa9ijncY2訪問(wèn)密碼 152a
中斷方式:
https://yunpan.cn/cSbc7T4cxqWah訪問(wèn)密碼 7e7f
STM32F0xx的資料可以在我360云盤下載:
https://yunpan.cn/cS2PVuHn6X2Bj訪問(wèn)密碼 8c37
準(zhǔn)備工作
在昨天的軟件工程基礎(chǔ)上,新建源程序文件(dma.c 和 dma.h),在工程中添加新建的源程序文件dma.c和使用到標(biāo)準(zhǔn)外設(shè)庫(kù)stm32f0xx_dma.c。如何在工程中添加源文件請(qǐng)看以前的文章“STM32F0_新建軟件工程詳細(xì)過(guò)程”,添加完成如下圖:
注意:
文件所在位置最好對(duì)應(yīng)目錄,方便管理。比如:dma.c放在bsp文件下,添加在工程中Bsp組下面。
數(shù)據(jù)傳輸原理
DMA是介于內(nèi)存(如:一個(gè)數(shù)組)和外設(shè)(如:USART、ADC等)之間進(jìn)行數(shù)據(jù)交換的一個(gè)模塊控制器。從DMA的系統(tǒng)框圖(下圖)中也能大概看得出整個(gè)模塊數(shù)據(jù)傳輸?shù)脑?。關(guān)于DMA模塊在F0芯片中有幾點(diǎn)需要注意,請(qǐng)看最后重點(diǎn)。
配置過(guò)程詳情
①RCC時(shí)鐘
該函數(shù)位于bsp.c文件下面;
我個(gè)人習(xí)慣第一步配置時(shí)鐘,ST官方提供的例程也是把配置時(shí)鐘放在前面。關(guān)于RCC時(shí)鐘的配置比較重要,有好幾次我就是由于沒(méi)有配置相應(yīng)RCC時(shí)鐘,讓我找了很久的問(wèn)題,最后才發(fā)現(xiàn)是RCC時(shí)鐘沒(méi)有配置。
注意:
外設(shè)時(shí)鐘不要隨便添加,比如:RCC_APB1外設(shè)不要配置在RCC_APB2時(shí)鐘里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);這樣能編譯過(guò),但是錯(cuò)誤的】
我每次都提醒RCC時(shí)鐘,是因?yàn)楹芏嗳司褪且驗(yàn)闀r(shí)鐘而導(dǎo)致軟件運(yùn)行有問(wèn)題,所以,提醒更多人要注意配置RCC.
②DMA傳輸(內(nèi)存->外設(shè))的配置
該函數(shù)位于dma.c文件下面;
重點(diǎn)注意:
1、傳輸方向:這里是內(nèi)存(數(shù)組)->外設(shè)(串口);
2、通道:使用MDA1通道2(串口發(fā)送)。
③DMA傳輸(外設(shè)->內(nèi)存)的配置
該函數(shù)位于dma.c文件下面;
和上面注意的地方一樣,也是這兩個(gè)函數(shù)接口之間的差異。
④DMA傳輸串口的效果
該函數(shù)位于main.c文件下面;
這是實(shí)際運(yùn)行的效果函數(shù)。
1、上電發(fā)送數(shù)據(jù)“DMA_Start...”;
2、等待接收10字節(jié)數(shù)據(jù)(DMA方式接收10字節(jié)數(shù)據(jù));
3、DMA方式發(fā)送該10字節(jié)數(shù)據(jù),等待發(fā)送完成。
4、依次循環(huán)下去。
今天的重點(diǎn)
A、通道的選擇
由于F0芯片有些芯片只有DMA1,沒(méi)有DMA2,有些DMA1有5個(gè)通道,有些DMA1有7個(gè)通道,這些需要根據(jù)手冊(cè)針對(duì)型號(hào)進(jìn)行配置,這里不能選擇錯(cuò)誤,否則不能使用DMA功能。
B、傳輸?shù)拈L(zhǎng)度
由于最大只能傳輸數(shù)量為65536,在實(shí)際項(xiàng)目開(kāi)發(fā)中,可能有更大的數(shù)據(jù)需要傳輸,這時(shí)就需要分開(kāi)傳輸才行。
C、傳輸數(shù)據(jù)寬度
數(shù)據(jù)的寬度如果傳輸兩者之間一樣的話,其實(shí)沒(méi)什么需要注意的。但是,如果數(shù)據(jù)寬度不同的話,這里就需要注意了,具體見(jiàn)手冊(cè),這里只是提出來(lái)是重點(diǎn),感興趣的朋友請(qǐng)自行研究啊。
說(shuō)明
STM32F0的芯片軟件兼容性很好,可以適用于F0其他很多型號(hào)的芯片(具體請(qǐng)看手冊(cè)、或者親自測(cè)試)。