單芯片解決方案,開啟全新體驗(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的無限可能。
第十五章 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控制器的框圖:
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ā)板。
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ū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
-
單片機(jī)
+關(guān)注
關(guān)注
6065文章
44946瀏覽量
648205 -
控制器
+關(guān)注
關(guān)注
114文章
17026瀏覽量
183302 -
寄存器
+關(guān)注
關(guān)注
31文章
5427瀏覽量
123712 -
dma
+關(guān)注
關(guān)注
3文章
574瀏覽量
102556
發(fā)布評(píng)論請(qǐng)先 登錄
第十五章 DAC (上篇)

第十五章 DAC (下篇)

《DNK210使用指南 -CanMV版 V1.0》第十五章 按鍵中斷實(shí)驗(yàn)
至芯科技之a(chǎn)ltera 系列FPGA教程 第十五篇 安裝驅(qū)動(dòng)
視頻詳解:上海尤老師verilog入門到實(shí)戰(zhàn)第十五課
基于RFID和MySQL實(shí)現(xiàn)小區(qū)門禁系統(tǒng)
「正點(diǎn)原子Linux連載」第十五章按鍵輸入試驗(yàn)
第十五屆智能車入門淺談 精選資料分享
第十五講 組合邏輯電路的分析方法和設(shè)計(jì)方法

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

第十五屆智能車入門淺談

【正點(diǎn)原子FPGA連載】第三十五章高速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

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

評(píng)論