0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F0xx_ DMA收發(fā)USART數(shù)據(jù)配置詳細(xì)過(guò)程

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-04-08 09:02 ? 次閱讀

前言

關(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ì)于軟件開發(fā)也是一樣的,當(dāng)你學(xué)會(huì)某一項(xiàng)語(yǔ)言的開發(fā),接觸其他語(yǔ)言的開發(fā)就很容易了。這里我想說(shuō),其實(shí)我對(duì)ST大部分芯片(全系列芯片STM8、STM32)都了解過(guò),很多都是相似,只要有時(shí)間,后期還會(huì)總結(jié)一下STM8開發(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í)鐘的配置比較重要,有好幾次我就是由于沒有配置相應(yīng)RCC時(shí)鐘,讓我找了很久的問(wèn)題,最后才發(fā)現(xiàn)是RCC時(shí)鐘沒有配置。

注意:

外設(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,沒有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)目開發(fā)中,可能有更大的數(shù)據(jù)需要傳輸,這時(shí)就需要分開傳輸才行。

C、傳輸數(shù)據(jù)寬度

數(shù)據(jù)的寬度如果傳輸兩者之間一樣的話,其實(shí)沒什么需要注意的。但是,如果數(shù)據(jù)寬度不同的話,這里就需要注意了,具體見手冊(cè),這里只是提出來(lái)是重點(diǎn),感興趣的朋友請(qǐng)自行研究啊。

說(shuō)明

STM32F0的芯片軟件兼容性很好,可以適用于F0其他很多型號(hào)的芯片(具體請(qǐng)看手冊(cè)、或者親自測(cè)試)。

今天的工程是基于工程“STM32F0xx_TIM基本延時(shí)配置詳細(xì)過(guò)程”修改而來(lái),以上實(shí)例總結(jié)僅供參考,若有不對(duì)之處,敬請(qǐng)諒解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    552

    瀏覽量

    99931
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    195

    瀏覽量

    30682
  • STM32F0
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    17043
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CUBEMX(6)--移植雅特力AT32F403AVGT7,雙串口通過(guò)DMA方式接收不定長(zhǎng)數(shù)據(jù)

    END 3 * 中斷外部變量引用,在stm32f0xx_it.c中添加。 /* USER CODE BEGIN 0 */ #define BUFFERSIZE_usart2 255 //可接收的最大
    發(fā)表于 09-06 16:37

    STM32CUBEMX(3)--ADC通過(guò)DMA方式采樣,USART打印

    使用的產(chǎn)品型號(hào)的不同,有一個(gè)或兩個(gè)DMA模塊。 STM32F0XX DMA控制器總共有5個(gè)通道用于DMA1,每個(gè)通道都專門管理來(lái)自一個(gè)或多個(gè)外設(shè)的存儲(chǔ)器訪問(wèn)請(qǐng)求。它具有一個(gè)仲裁器,用于
    發(fā)表于 09-04 14:08

    STM32CUBEMX(2)--USART通過(guò)DMA方式接收不定長(zhǎng)數(shù)據(jù)

    的不同,有一個(gè)或兩個(gè)DMA模塊。 STM32F0XX DMA控制器總共有5個(gè)通道用于DMA1,每個(gè)通道都專門管理來(lái)自一個(gè)或多個(gè)外設(shè)的存儲(chǔ)器訪問(wèn)請(qǐng)求。它具有一個(gè)仲裁器,用于處理不同的
    發(fā)表于 09-04 11:48

    【GD32F303紅楓派開發(fā)板使用手冊(cè)】第十六講 USART-DMA串口收發(fā)實(shí)驗(yàn)

    在前面ADC章節(jié)中,我們介紹了DMA的工作原理,這里就不多做介紹。從GD32F303用戶手冊(cè)中可以查到,各串口的TX和RX分別對(duì)應(yīng)DMA的不同通道,比如USART0的TX對(duì)應(yīng)
    的頭像 發(fā)表于 06-15 09:54 ?706次閱讀
    【GD32<b class='flag-5'>F</b>303紅楓派開發(fā)板使用手冊(cè)】第十六講 <b class='flag-5'>USART-DMA</b>串口<b class='flag-5'>收發(fā)</b>實(shí)驗(yàn)

    STM32F103的DMA無(wú)法實(shí)現(xiàn)共存怎么解決?

    有幸在工程中用到STM32F103的DMA功能,而且是兩個(gè)串口(USART2和USART3)都需要用到DMA功能來(lái)實(shí)現(xiàn)
    發(fā)表于 05-11 07:14

    stm32f4xx的CAN對(duì)ID配置有要求嗎?CAN收發(fā)器是什么型號(hào)的?

    stm32f4xx的CAN疑問(wèn): 1)標(biāo)準(zhǔn)幀收發(fā)時(shí),對(duì)CAN ID有特殊的要求或約束嗎?比如哪些CAN ID不能用? 2)CAN收發(fā)器是什么型號(hào)?對(duì)CAN數(shù)據(jù)鏈路層的編碼有特殊操作嗎?
    發(fā)表于 04-22 06:03

    STM32F103串口DMA+IDLE收發(fā),速率過(guò)快會(huì)造成overrun數(shù)據(jù)溢出怎么解決?

    串口通訊是比較常用的通訊方式,本人以前都是單字節(jié)中斷接收,再開啟一個(gè)定時(shí)器做空閑判斷,和PC端做2ms收發(fā)無(wú)壓力。這樣做在高速度通訊過(guò)程中MCU會(huì)頻繁進(jìn)入接收中斷,故而想測(cè)試一下DMA
    發(fā)表于 04-18 06:26

    STM32F103RCT6的USART1不能接收多字節(jié)數(shù)據(jù)是什么原因?qū)е碌模?/a>

    節(jié)的數(shù)據(jù)。5毫秒延時(shí),STM32F103RCT6只能接收到2個(gè)字節(jié)的數(shù)據(jù)。 用實(shí)際上位機(jī)發(fā)送時(shí),STM32F103RCT6能接收到最后1個(gè)字節(jié)的數(shù)據(jù)
    發(fā)表于 04-17 06:35

    求助,關(guān)于STM32F107RCT的USART3的DMA接收問(wèn)題求解

    以下測(cè)試都是在目前最新版CubeMX+F1xx支持包生成代碼下進(jìn)行。 問(wèn)題描述: 使用usart3,rx設(shè)置dma收入,circular模式,一次dma收取128Byte,到一個(gè)靜態(tài)
    發(fā)表于 04-10 07:39

    STM32F405 uart DMA收發(fā)數(shù)據(jù)輸出亂碼怎么解決?

    亂碼,波特率設(shè)置無(wú)誤(debug顯示接收數(shù)據(jù)正常)請(qǐng)問(wèn)是不是哪里配置不對(duì)? cube生成代碼之外user config如下: void usart_transmit_buffer_f( uint8_t
    發(fā)表于 03-08 07:38

    STM32F405 DMA+空閑中斷接收,DMA_GetCurrDataCounter(DMA1_Stream1)與實(shí)際發(fā)送數(shù)據(jù)不符怎么解決?

    我在寫STM32F405 DMA+空閑中斷接收。用的USART3。 看了網(wǎng)上很多調(diào)試的帖子,但都不行。求幫忙! 1)我設(shè)置的BufferSize是16,必須要滿足16個(gè)數(shù)后,才能觸發(fā)我的空閑中斷
    發(fā)表于 03-07 08:28

    基于ARM的32位MCU STM32F103xx數(shù)據(jù)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《基于ARM的32位MCU STM32F103xx數(shù)據(jù)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 11-09 09:47 ?0次下載
    基于ARM的32位MCU <b class='flag-5'>STM32F103xx</b><b class='flag-5'>數(shù)據(jù)</b>手冊(cè)

    CKS32F4xx系列ADC多通道DMA電壓采集

    CKS32F4xx系列ADC多通道DMA電壓采集
    的頭像 發(fā)表于 11-06 16:53 ?892次閱讀

    stm32 LL庫(kù)開發(fā)-DMA使用方法

    本文以stm32 F303K8為例,不同型號(hào)的DMA配置方法略有不同。
    的頭像 發(fā)表于 10-26 14:58 ?1095次閱讀
    <b class='flag-5'>stm32</b> LL庫(kù)開發(fā)-<b class='flag-5'>DMA</b>使用方法

    使用STM32F101xxSTM32F103xxDMA控制器

    這篇應(yīng)用筆記描述了怎么使用STM32F101xxSTM32F103xx的直接存儲(chǔ)器訪問(wèn)(DMA)控制器。STM32F101xxSTM32F1
    發(fā)表于 10-10 08:20