在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

第十五章 DMA

W55MH32 ? 來源:W55MH32 ? 作者:W55MH32 ? 2025-06-14 16:32 ? 次閱讀

單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)

W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。

在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。

W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。

此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。

為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評(píng)估芯片性能。

若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

wKgZPGgbOfaANhwzACodXd3sVzg463.png

第十五章 DMA

本章參考資料:《W55MH32中文參考手冊(cè)》DMA控制器章節(jié)。

學(xué)習(xí)本章時(shí),配合《W55MH32中文參考手冊(cè)》DMA控制器章節(jié)一起閱讀,效果會(huì)更佳,特別是涉及到寄存器說明的部分。

1 DMA簡(jiǎn)介

DMA(Direct Memory Access)—直接存儲(chǔ)器存取,是單片機(jī)的一個(gè)外設(shè),它的主要功能是用來搬數(shù)據(jù),但是不需要占用CPU, 即在傳輸數(shù)據(jù)的時(shí)候,CPU可以干其他的事情,好像是多線程一樣。數(shù)據(jù)傳輸支持從外設(shè)到存儲(chǔ)器或者存儲(chǔ)器到存儲(chǔ)器, 這里的存儲(chǔ)器可以是SRAM或者是FLASH。DMA控制器包含了DMA1和DMA2,其中DMA1有7個(gè)通道,DMA2有5個(gè)通道, 這里的通道可以理解為傳輸數(shù)據(jù)的一種管道。要注意的是DMA2只存在于大容量產(chǎn)品和互聯(lián)型產(chǎn)品中。

2 DMA功能框圖

DMA控制器獨(dú)立于內(nèi)核,屬于一個(gè)單獨(dú)的外設(shè),結(jié)構(gòu)比較簡(jiǎn)單,從編程的角度來看,我們只需掌握功能框圖中的三部分內(nèi)容即可, 具體見下圖,DMA框圖 :DMA控制器的框圖:

wKgZO2gu7_iADwzvAAIXyBzsBSM050.png

2.1 DMA請(qǐng)求

如果外設(shè)要想通過DMA來傳輸數(shù)據(jù),必須先給DMA控制器發(fā)送DMA請(qǐng)求,DMA收到請(qǐng)求信號(hào)之后,控制器會(huì)給外設(shè)一個(gè)應(yīng)答信號(hào), 當(dāng)外設(shè)應(yīng)答后且DMA控制器收到應(yīng)答信號(hào)之后,就會(huì)啟動(dòng)DMA的傳輸,直到傳輸完畢。

DMA有DMA1和DMA2兩個(gè)控制器,DMA1有7個(gè)通道,DMA2有5個(gè)通道,不同的DMA控制器的通道對(duì)應(yīng)著不同的外設(shè)請(qǐng)求, 這決定了我們?cè)谲浖幊躺显撛趺丛O(shè)置,具體見DMA請(qǐng)求映像表:

外設(shè) 通道 1 通道 2 通道 3 通道 4 通道 5 通道 6 通道 7
ADC1 ADC1
SPI/I2S SPI1_RX SPI1_TX SPI/I2S2_RX SPI/I2S2_TX
USART USART3_TX USART3_RX USART1_TX USART1_RX USART2_RX USART2_TX
I2C I2C2_TX I2C2_RX I2C1_TX I2C1_RX
TIM1 TIM1_CH1 TIM1_CH2 TIM1_TX4
TIM1_TRIG
TIM1_COM
TIM1_UP TIM1_CH3
TIM2 TIM2_CH3 TIM2_UP TIM2_CH1 TIM2_CH2
TIM2_CH4
TIM3 TIM3_CH3 TIM3_CH4
TIM3_UP
TIM3_CH1
TIM3_TRIG
TIM4 TIM4_CH1 TIM4_CH2 TIM4_CH3 TIM4_UP
外設(shè) 通道 1 通道 2 通道 3 通道 4 通道 5
ADC3?1? ADC3
SPI/I2S3 SPI/I2S3_RX SPI/I2S3_TX
UART4 UART4_RX UART4_TX
SDIO?1? SDIO
TIM5 TIM5_CH4
TIM5_TRIG
TIM5_CH3
TIM5_UP
TIM5_CH2 TIM5_CH1
TIM6/DAC 通道 1 TIM6_UP/
DAC 通道 1
TIM7/DAC 通道 2 TIM7_UP/
DAC 通道 2
TIM8?1? TIM8_CH3
TIM8_UP
TIM8_CH4
TIM8_TRIG
TIM8_COM
TIM8_CH1 TIM8_CH2

其中ADC3、SDIO和TIM8的DMA請(qǐng)求只在大容量產(chǎn)品中存在,這個(gè)在具體項(xiàng)目時(shí)要注意。

2.2 通道

DMA具有12個(gè)獨(dú)立可編程的通道,其中DMA1有7個(gè)通道,DMA2有5個(gè)通道,每個(gè)通道對(duì)應(yīng)不同的外設(shè)的DMA請(qǐng)求。 雖然每個(gè)通道可以接收多個(gè)外設(shè)的請(qǐng)求,但是同一時(shí)間只能接收一個(gè),不能同時(shí)接收多個(gè)。

2.3 仲裁器

當(dāng)發(fā)生多個(gè)DMA通道請(qǐng)求時(shí),就意味著有先后響應(yīng)處理的順序問題,這個(gè)就由仲裁器也管理。仲裁器管理DMA通道請(qǐng)求分為兩個(gè)階段。 第一階段屬于軟件階段,可以在DMA_CCRx寄存器中設(shè)置,有4個(gè)等級(jí):非常高、高、中和低四個(gè)優(yōu)先級(jí)。第二階段屬于硬件階段, 如果兩個(gè)或以上的DMA通道請(qǐng)求設(shè)置的優(yōu)先級(jí)一樣,則他們優(yōu)先級(jí)取決于通道編號(hào),編號(hào)越低優(yōu)先權(quán)越高,比如通道0高于通道1。 在大容量產(chǎn)品和互聯(lián)型產(chǎn)品中, DMA1控制器擁有高于DMA2控制器的優(yōu)先級(jí)。

3 DMA數(shù)據(jù)配置

使用DMA,最核心就是配置要傳輸?shù)臄?shù)據(jù),包括數(shù)據(jù)從哪里來,要到哪里去,傳輸?shù)臄?shù)據(jù)的單位是什么,要傳多少數(shù)據(jù),是一次傳輸還是循環(huán)傳輸?shù)鹊取?/p>

3.1DMA傳輸方向

我們知道DMA傳輸數(shù)據(jù)的方向有三個(gè):從外設(shè)到存儲(chǔ)器,從存儲(chǔ)器到外設(shè),從存儲(chǔ)器到存儲(chǔ)器。 具體的方向DMA_CCR位4 DIR配置:0表示從外設(shè)到存儲(chǔ)器,1表示從存儲(chǔ)器到外設(shè)。 這里面涉及到的外設(shè)地址由DMA_CPAR配置,存儲(chǔ)器地址由DMA_CMAR配置。

外設(shè)到存儲(chǔ)器

當(dāng)我們使用從外設(shè)到存儲(chǔ)器傳輸時(shí),以ADC采集為例。DMA外設(shè)寄存器的地址對(duì)應(yīng)的就是ADC數(shù)據(jù)寄存器的地址, DMA存儲(chǔ)器的地址就是我們自定義的變量(用來接收存儲(chǔ)AD采集的數(shù)據(jù))的地址。方向我們?cè)O(shè)置外設(shè)為源地址。

存儲(chǔ)器到外設(shè)

當(dāng)我們使用從存儲(chǔ)器到外設(shè)傳輸時(shí),以串口向電腦端發(fā)送數(shù)據(jù)為例。DMA外設(shè)寄存器的地址對(duì)應(yīng)的就是串口數(shù)據(jù)寄存器的地址, DMA存儲(chǔ)器的地址就是我們自定義的變量(相當(dāng)于一個(gè)緩沖區(qū),用來存儲(chǔ)通過串口發(fā)送到電腦的數(shù)據(jù))的地址。方向我們?cè)O(shè)置外設(shè)為目標(biāo)地址。

存儲(chǔ)器到存儲(chǔ)器

當(dāng)我們使用從存儲(chǔ)器到存儲(chǔ)器傳輸時(shí),以內(nèi)部FLASH向內(nèi)部SRAM復(fù)制數(shù)據(jù)為例。 DMA外設(shè)寄存器的地址對(duì)應(yīng)的就是內(nèi)部FLASH(我們這里把內(nèi)部FALSH當(dāng)作一個(gè)外設(shè)來看)的地址, DMA存儲(chǔ)器的地址就是我們自定義的變量(相當(dāng)于一個(gè)緩沖區(qū),用來存儲(chǔ)來自內(nèi)部FLASH的數(shù)據(jù))的地址。 方向我們?cè)O(shè)置外設(shè)(即內(nèi)部FLASH)為源地址。跟上面兩個(gè)不一樣的是,這里需要把DMA_CCR位14:MEM2MEM:存儲(chǔ)器到存儲(chǔ)器模式配置為1,啟動(dòng)M2M模式。

3.2傳輸大小及單位

當(dāng)我們配置好數(shù)據(jù)要從哪里來到哪里去之后,我們還需要知道我們要傳輸?shù)臄?shù)據(jù)是多少,數(shù)據(jù)的單位是什么。

以串口向電腦發(fā)送數(shù)據(jù)為例,我們可以一次性給電腦發(fā)送很多數(shù)據(jù),具體多少由DMA_CNDTR配置, 這是一個(gè)32位的寄存器,一次最多只能傳輸65535個(gè)數(shù)據(jù)。

要想數(shù)據(jù)傳輸正確,源和目標(biāo)地址存儲(chǔ)的數(shù)據(jù)寬度還必須一致,串口數(shù)據(jù)寄存器是8位的, 所以我們定義的要發(fā)送的數(shù)據(jù)也必須是8位。外設(shè)的數(shù)據(jù)寬度由DMA_CCRx的PSIZE[1:0]配置, 可以是8/16/32位,存儲(chǔ)器的數(shù)據(jù)寬度由DMA_CCRx的MSIZE[1:0]配置,可以是8/16/32位。

在DMA控制器的控制下,數(shù)據(jù)要想有條不紊的從一個(gè)地方搬到另外一個(gè)地方,還必須正確設(shè)置兩邊數(shù)據(jù)指針的增量模式。 外設(shè)的地址指針由DMA_CCRx的PINC配置,存儲(chǔ)器的地址指針由MINC配置。以串口向電腦發(fā)送數(shù)據(jù)為例,要發(fā)送的數(shù)據(jù)很多, 每發(fā)送完一個(gè),那么存儲(chǔ)器的地址指針就應(yīng)該加1,而串口數(shù)據(jù)寄存器只有一個(gè), 那么外設(shè)的地址指針就固定不變。具體的數(shù)據(jù)指針的增量模式由實(shí)際情況決定。

3.3 傳輸完成時(shí)間

數(shù)據(jù)什么時(shí)候傳輸完成,我們可以通過查詢標(biāo)志位或者通過中斷的方式來鑒別。每個(gè)DMA通道在DMA傳輸過半、 傳輸完成和傳輸錯(cuò)誤時(shí)都會(huì)有相應(yīng)的標(biāo)志位,如果使能了該類型的中斷后,則會(huì)產(chǎn)生中斷。有關(guān)各個(gè)標(biāo)志位的詳細(xì)描述請(qǐng)參考DMA中斷狀態(tài)寄存器DMA_ISR的詳細(xì)描述。

傳輸完成還分兩種模式,是一次傳輸還是循環(huán)傳輸,一次傳輸很好理解,即是傳輸一次之后就停止,要想再傳輸?shù)脑挘?必須關(guān)斷DMA使能后再重新配置后才能繼續(xù)傳輸。循環(huán)傳輸則是一次傳輸完成之后又恢復(fù)第一次傳輸時(shí)的配置循環(huán)傳輸, 不斷的重復(fù)。具體的由DMA_CCRx寄存器的CIRC 循環(huán)模式位控制。

4 DMA初始化結(jié)構(gòu)體詳解

標(biāo)準(zhǔn)庫函數(shù)對(duì)每個(gè)外設(shè)都建立了一個(gè)初始化結(jié)構(gòu)體xxx_InitTypeDef(xxx為外設(shè)名稱),結(jié)構(gòu)體成員用于設(shè)置外設(shè)工作參數(shù), 并由標(biāo)準(zhǔn)庫函數(shù)xxx_Init()調(diào)用這些設(shè)定參數(shù)進(jìn)入設(shè)置外設(shè)相應(yīng)的寄存器,達(dá)到配置外設(shè)工作環(huán)境的目的。

結(jié)構(gòu)體xxx_InitTypeDef和庫函數(shù)xxx_Init配合使用是標(biāo)準(zhǔn)庫精髓所在,理解了結(jié)構(gòu)體xxx_InitTypeDef每個(gè)成員意義基本上就可以對(duì)該外設(shè)運(yùn)用自如。 結(jié)構(gòu)體xxx_InitTypeDef定義在W55MH32_xxx.h(后面xxx為外設(shè)名稱)文件中,庫函數(shù)xxx_Init定義在W55MH32_xxx.c文件中, 編程時(shí)我們可以結(jié)合這兩個(gè)文件內(nèi)注釋使用。

DMA_ InitTypeDef初始化結(jié)構(gòu)體

typedef struct
{
    uint32_t DMA_PeripheralBaseAddr;   // 外設(shè)地址
    uint32_t DMA_MemoryBaseAddr;       // 存儲(chǔ)器地址
    uint32_t DMA_DIR;                  // 傳輸方向
    uint32_t DMA_BufferSize;           // 傳輸數(shù)目
    uint32_t DMA_PeripheralInc;        // 外設(shè)地址增量模式
    uint32_t DMA_MemoryInc;            // 存儲(chǔ)器地址增量模式
    uint32_t DMA_PeripheralDataSize;   // 外設(shè)數(shù)據(jù)寬度
    uint32_t DMA_MemoryDataSize;       // 存儲(chǔ)器數(shù)據(jù)寬度
    uint32_t DMA_Mode;                 // 模式選擇
    uint32_t DMA_Priority;             // 通道優(yōu)先級(jí)
    uint32_t DMA_M2M;                  // 存儲(chǔ)器到存儲(chǔ)器模式
} DMA_InitTypeDef;

DMA_PeripheralBaseAddr: 外設(shè)地址,設(shè)定DMA_CPAR寄存器的值;一般設(shè)置為外設(shè)的數(shù)據(jù)寄存器地址,如果是存儲(chǔ)器到存儲(chǔ)器模式則設(shè)置為其中一個(gè)存儲(chǔ)器地址。

DMA_Memory0BaseAddr: 存儲(chǔ)器地址,設(shè)定DMA_CMAR寄存器值;一般設(shè)置為我們自定義存儲(chǔ)區(qū)的首地址。

DMA_DIR: 傳輸方向選擇,可選外設(shè)到存儲(chǔ)器、存儲(chǔ)器到外設(shè)。它設(shè)定DMA_CCR寄存器的DIR[1:0]位的值。這里并沒有存儲(chǔ)器到存儲(chǔ)器的方向選擇,當(dāng)使用存儲(chǔ)器到存儲(chǔ)器時(shí),只需要把其中一個(gè)存儲(chǔ)器當(dāng)作外設(shè)使用即可。

DMA_BufferSize: 設(shè)定待傳輸數(shù)據(jù)數(shù)目,初始化設(shè)定DMA_CNDTR寄存器的值。

DMA_PeripheralInc: 如果配置為DMA_PeripheralInc_Enable,使能外設(shè)地址自動(dòng)遞增功能,它設(shè)定DMA_CCR寄存器的PINC位的值;一般外設(shè)都是只有一個(gè)數(shù)據(jù)寄存器,所以一般不會(huì)使能該位。

DMA_MemoryInc: 如果配置為DMA_MemoryInc_Enable,使能存儲(chǔ)器地址自動(dòng)遞增功能,它設(shè)定DMA_CCR寄存器的MINC位的值;我們自定義的存儲(chǔ)區(qū)一般都是存放多個(gè)數(shù)據(jù)的,所以要使能存儲(chǔ)器地址自動(dòng)遞增功能。

DMA_PeripheralDataSize: 外設(shè)數(shù)據(jù)寬度,可選字節(jié)(8位)、半字(16位)和字(32位),它設(shè)定DMA_CCR寄存器的PSIZE[1:0]位的值。

DMA_MemoryDataSize: 存儲(chǔ)器數(shù)據(jù)寬度,可選字節(jié)(8位)、半字(16位)和字(32位),它設(shè)定DMA_CCR寄存器的MSIZE[1:0]位的值。當(dāng)外設(shè)和存儲(chǔ)器之間傳數(shù)據(jù)時(shí),兩邊的數(shù)據(jù)寬度應(yīng)該設(shè)置為一致大小。

DMA_Mode:DMA傳輸模式選擇,可選一次傳輸或者循環(huán)傳輸,它設(shè)定DMA_CCR寄存器的CIRC位的值。例程我們的ADC采集是持續(xù)循環(huán)進(jìn)行的,所以使用循環(huán)傳輸模式。

DMA_Priority: 軟件設(shè)置通道的優(yōu)先級(jí),有4個(gè)可選優(yōu)先級(jí)分別為非常高、高、中和低,它設(shè)定DMA_CCR寄存器的PL[1:0]位的值。DMA通道優(yōu)先級(jí)只有在多個(gè)DMA通道同時(shí)使用時(shí)才有意義,如果是單個(gè)通道,優(yōu)先級(jí)可以隨便設(shè)置。

DMA_M2M: 存儲(chǔ)器到存儲(chǔ)器模式,使用存儲(chǔ)器到存儲(chǔ)器時(shí)用到,設(shè)定DMA_CCR的位14 MEN2MEN即可啟動(dòng)存儲(chǔ)器到存儲(chǔ)器模式。

5 DMA存儲(chǔ)器到外設(shè)模式實(shí)驗(yàn)

5.1 代碼分析

USART初始化

代碼清單:DMA-5 USART初始化

void UART_Configuration(uint32_t bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate            = bound;
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;
    USART_InitStructure.USART_Parity              = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART_TEST, &USART_InitStructure);
    USART_Cmd(USART_TEST, ENABLE);
}

這段代碼定義了UART_Configuration函數(shù)用于配置 UART,它接收波特率作為參數(shù)。函數(shù)先初始化 GPIO 和 USART 配置結(jié)構(gòu)體,接著使能 USART1 和 GPIOA 的時(shí)鐘。然后將 PA9 配置為復(fù)用推挽輸出作為 TX 引腳,PA10 配置為浮空輸入作為 RX 引腳。之后設(shè)置 USART 的波特率、數(shù)據(jù)位、停止位、校驗(yàn)位、硬件流控制等參數(shù),并使能接收和發(fā)送模式。最后初始化并使能 USART

串口DMA傳輸配置

代碼清單:DMA-6 USART1 發(fā)送請(qǐng)求DMA設(shè)置

void DMA_RecvConfiguration(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    //USART1_RX DMA Config
    DMA_DeInit(DMA1_Channel5);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)Buff;
    DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize         = BUFFSIZE;
    DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority           = DMA_Priority_Medium;
    DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);

    DMA_Cmd(DMA1_Channel5, ENABLE);
}

void DMA_SendConfiguration(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    //USART1_TX DMA Config
    DMA_DeInit(DMA1_Channel4);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)Buff;
    DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize         = BUFFSIZE;
    DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority           = DMA_Priority_Medium;
    DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);

    DMA_Cmd(DMA1_Channel4, ENABLE);
}

代碼定義了兩個(gè)函數(shù)用于配置 DMA(直接內(nèi)存訪問)的接收和發(fā)送功能。DMA_RecvConfiguration 函數(shù)配置了 USART1 的 DMA 接收功能,開啟了 DMA1 的時(shí)鐘,將 DMA1 通道 5 初始化為從 USART1 的數(shù)據(jù)寄存器接收數(shù)據(jù)到內(nèi)存緩沖區(qū) Buff,并設(shè)置了數(shù)據(jù)方向、緩沖區(qū)大小、數(shù)據(jù)增量模式、數(shù)據(jù)大小、工作模式、優(yōu)先級(jí)等參數(shù),最后使能該通道。DMA_SendConfiguration 函數(shù)則配置了 USART1 的 DMA 發(fā)送功能,同樣開啟 DMA1 時(shí)鐘,將 DMA1 通道 4 初始化為從內(nèi)存緩沖區(qū) Buff 發(fā)送數(shù)據(jù)到 USART1 的數(shù)據(jù)寄存器,設(shè)置了相似的參數(shù)后使能該通道。

主函數(shù)

代碼清單:DMA-7 存儲(chǔ)器到外設(shè)模式主函數(shù)

int main(void)
{
    uint32_t          i;
    RCC_ClocksTypeDef clocks;

    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);

    printf("n");
    printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn",
           (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);

    printf("USART Asyn DMA Test.n");

    while (1)
    {
        DMA_Cmd(DMA1_Channel4, DISABLE);
        USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
        DMA_RecvConfiguration();
        while (DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET);
        printf("USART Asyn DMA Recv Completen");
        for (i = 0; i < BUFFSIZE; i++)
        {
            printf("%c  ,", Buff[i]);
        }


        DMA_Cmd(DMA1_Channel5, DISABLE);
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
        DMA_SendConfiguration();
        while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET);
        printf("USART Asyn DMA Send Completen");
    }
}

這段代碼是一個(gè) C 語言的 main 函數(shù),主要實(shí)現(xiàn)了 USART(通用同步異步收發(fā)器)的異步 DMA(直接內(nèi)存訪問)測(cè)試功能。具體步驟如下:

定義變量 i 和 clocks,i 用于循環(huán)計(jì)數(shù),clocks 用于存儲(chǔ)時(shí)鐘頻率信息。

初始化延時(shí)函數(shù),以 115200 的波特率配置 UART,獲取系統(tǒng)時(shí)鐘頻率并存儲(chǔ)在 clocks 中。

打印系統(tǒng)各時(shí)鐘頻率信息,包括 SYSCLK、HCLK、PCLK1、PCLK2 和 ADCCLK,同時(shí)輸出測(cè)試提示信息。

進(jìn)入無限循環(huán),在循環(huán)中交替進(jìn)行接收和發(fā)送操作:

接收操作:先禁用 DMA1 通道 4,使能 USART1 的接收 DMA 請(qǐng)求,調(diào)用 DMA_RecvConfiguration 函數(shù)配置 DMA 接收,等待接收完成標(biāo)志置位,打印接收完成信息并逐個(gè)輸出接收到的數(shù)據(jù)。

發(fā)送操作:禁用 DMA1 通道 5,使能 USART1 的發(fā)送 DMA 請(qǐng)求,調(diào)用DMA_SendConfiguration 函數(shù)配置 DMA 發(fā)送,等待發(fā)送完成標(biāo)志置位,打印發(fā)送完成信息。

通過這種方式,不斷進(jìn)行數(shù)據(jù)的接收和發(fā)送測(cè)試。

5.2 下載驗(yàn)證

保證開發(fā)板相關(guān)硬件連接正確,在電腦端打開串口調(diào)試助手,把編譯好的程序下載到開發(fā)板。

wKgZO2gu79yAM_RBAAB3jQGzg8w806.png

WIZnet 是一家無晶圓廠半導(dǎo)體公司,成立于 1998 年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU? 面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。

WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。

香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。

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

    關(guān)注

    6065

    文章

    44946

    瀏覽量

    648205
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17026

    瀏覽量

    183302
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5427

    瀏覽量

    123712
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    574

    瀏覽量

    102556
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    第十五章 DAC (上篇)

    文章介紹了基于W55MH32的DAC(數(shù)字/模擬轉(zhuǎn)換器)上篇內(nèi)容,其為12位轉(zhuǎn)換器,有2通道,支持8/12位模式、DMA等,具噪聲和三角波生成等功能,還介紹了DAC_OutAudio例程的配置與驗(yàn)證。
    的頭像 發(fā)表于 05-28 15:07 ?375次閱讀
    <b class='flag-5'>第十五章</b> DAC (上篇)

    第十五章 DAC (下篇)

    本篇文章為第十五章DAC(下篇),介紹三個(gè)例程:DAC_OutDMASineWave用DMA輸出正弦波,DAC_OutNoiseWave輸出噪聲波,DAC_OutTriangleWave生成三角波,均有初始化、波形配置及串口調(diào)試功能。
    的頭像 發(fā)表于 05-28 15:39 ?406次閱讀
    <b class='flag-5'>第十五章</b> DAC (下篇)

    《DNK210使用指南 -CanMV版 V1.0》第十五章 按鍵中斷實(shí)驗(yàn)

    第十五章 按鍵中斷實(shí)驗(yàn) 本章實(shí)驗(yàn)將介紹如何使用CanMV讓Kendryte K210通過中斷的方式獲取板載按鍵的狀態(tài)。通過本章的學(xué)習(xí),讀者將學(xué)習(xí)到在CanMV下Kendryte K210的GPIO
    發(fā)表于 10-12 09:20

    至芯科技之a(chǎn)ltera 系列FPGA教程 第十五篇 安裝驅(qū)動(dòng)

    至芯科技之a(chǎn)ltera 系列FPGA教程 第十五篇 安裝驅(qū)動(dòng)
    發(fā)表于 08-11 03:34

    視頻詳解:上海尤老師verilog入門到實(shí)戰(zhàn)第十五

    本帖最后由 春哥哥 于 2016-10-10 17:48 編輯 上海尤老師verilog入門到實(shí)戰(zhàn)第十五課——無線通信中的升采樣過程中的頻譜搬遷過程;百度云網(wǎng)盤鏈接后綴:/s/1i5kCpXb,加群討論252520964,307510678
    發(fā)表于 10-10 10:42

    基于RFID和MySQL實(shí)現(xiàn)小區(qū)門禁系統(tǒng)

    第十五章 用RFID+MySQL實(shí)現(xiàn)小區(qū)門禁系統(tǒng)(RFID522+ESP8266-12N+1602LCD)(Arduino邊做邊學(xué):從點(diǎn)亮Led到物聯(lián)網(wǎng))
    發(fā)表于 06-24 08:26

    「正點(diǎn)原子Linux連載」第十五章按鍵輸入試驗(yàn)

    1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子Linux開發(fā)板2)摘自《正點(diǎn)原子I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南》關(guān)注官方微信號(hào)公眾號(hào),獲取更多資料:正點(diǎn)原子第十五章按鍵輸入試驗(yàn) 前面幾章試驗(yàn)都是講解
    發(fā)表于 12-21 12:11

    第十五屆智能車入門淺談 精選資料分享

    @TOC第十五屆智能車入門淺談寫博客原因這次第十五屆全國智能車大賽已經(jīng)結(jié)束了,對(duì)于我而言,確實(shí)是我大學(xué)中一個(gè)不可多得的經(jīng)歷,我希望我的這段經(jīng)歷可以保存下來通過博客的形式,同時(shí)可以對(duì)于其他人有幫助
    發(fā)表于 07-28 06:02

    第十五講 組合邏輯電路的分析方法和設(shè)計(jì)方法

    第十五講 組合邏輯電路的分析方法和設(shè)計(jì)方法 6.1概述組合邏輯電路:定義構(gòu)成電路特點(diǎn)6.2.1組合邏輯電路的分析方法
    發(fā)表于 03-30 16:21 ?4956次閱讀
    <b class='flag-5'>第十五</b>講 組合邏輯電路的分析方法和設(shè)計(jì)方法

    模擬電路網(wǎng)絡(luò)課件 第十五節(jié):單級(jí)放大電路的瞬態(tài)響應(yīng)

    模擬電路網(wǎng)絡(luò)課件 第十五節(jié):單級(jí)放大電路的瞬態(tài)響應(yīng) 3.8 單級(jí)放大電路的瞬態(tài)響應(yīng)
    發(fā)表于 09-17 10:18 ?903次閱讀
    模擬電路網(wǎng)絡(luò)課件 <b class='flag-5'>第十五</b>節(jié):單級(jí)放大電路的瞬態(tài)響應(yīng)

    第十五屆智能車入門淺談

    @TOC第十五屆智能車入門淺談寫博客原因這次第十五屆全國智能車大賽已經(jīng)結(jié)束了,對(duì)于我而言,確實(shí)是我大學(xué)中一個(gè)不可多得的經(jīng)歷,我希望我的這段經(jīng)歷可以保存下來通過博客的形式,同時(shí)可以對(duì)于其他人有幫助
    發(fā)表于 11-26 12:36 ?16次下載
    <b class='flag-5'>第十五</b>屆智能車入門淺談

    【正點(diǎn)原子FPGA連載】第三十五章高速AD/DA實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

    【正點(diǎn)原子FPGA連載】第三十五章高速AD/DA實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1
    發(fā)表于 12-04 15:06 ?12次下載
    【正點(diǎn)原子FPGA連載】第三<b class='flag-5'>十五章</b>高速AD/DA實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

    【正點(diǎn)原子FPGA連載】第十五章 窗口門狗(WWDG)實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

    【正點(diǎn)原子FPGA連載】第十五章 窗口門狗(WWDG)實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1
    發(fā)表于 12-05 11:21 ?12次下載
    【正點(diǎn)原子FPGA連載】<b class='flag-5'>第十五章</b> 窗口門狗(WWDG)實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

    深度參與,共話未來 —— 吹田電氣亮相第十五屆亞洲電源技術(shù)發(fā)展論壇

    在這個(gè)金秋時(shí)節(jié),吹田電氣帶著對(duì)電源技術(shù)的無限熱愛與追求,我們啟程前往第十五屆亞洲電源技術(shù)發(fā)展論壇的盛會(huì)。在這場(chǎng)匯聚了行業(yè)精英、學(xué)者與前沿技術(shù)的盛會(huì)中,我們不僅僅見證了電源技術(shù)的最新進(jìn)展,更與眾多同行
    的頭像 發(fā)表于 12-09 16:58 ?712次閱讀
    深度參與,共話未來 —— 吹田電氣亮相<b class='flag-5'>第十五</b>屆亞洲電源技術(shù)發(fā)展論壇

    銳馳智光亮相第十五屆交博會(huì)

    2025年4月23日,第十五屆中國國際道路交通安全博覽會(huì)(以下簡(jiǎn)稱“交博會(huì)”)在武漢國際博覽中心盛大啟幕。
    的頭像 發(fā)表于 04-24 17:12 ?409次閱讀
    主站蜘蛛池模板: 免费男女视频 | 91综合网| 四虎国产一区二区三区 | 在线成人亚洲 | 天堂中文在线资源 | 色黄视频 | 免费看啪啪网站 | 久久人人做人人玩人精品 | 成在线人永久免费播放视频 | 新版天堂8在线天堂 | 日本69sex护士xxx| 日本黄在线观看 | 全国男人的天堂天堂网 | 免费的色网站 | 欧美毛片网站 | 亚洲精品aaa揭晓 | 天天在线精品视频在线观看 | 日产精品卡二卡三卡四卡无卡乱码 | 天天操天天插天天射 | 国产伦精品一区二区三区 | 午夜看片 | 97视频人人| 免费免费啪视频视频观看 | 手机看高清特黄a大片 | 亚洲久优优色优在线播放 | 国产精品成人观看视频国产奇米 | 久久99精品久久久久久园产越南 | 色综合狠狠操 | 18免费视频 | 中文在线最新版天堂bt | 五月婷婷激情网 | 天天做夜夜爱 | 400部大量精品情侣网站 | 国产99久9在线视频 国产99久久九九精品免费 | 黄黄网址 | 狼狼狼色精品视频在线播放 | 色偷偷女男人的天堂亚洲网 | 色费女人18女人毛片免费视频 | 亚洲欧美高清 | 激情五月激情综合 | 久草老司机|