91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

UART需要使用DMA發(fā)送嗎 ?

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-07 16:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

DMA一種在嵌入式實(shí)時(shí)任務(wù)處理中常用的功能。

UART發(fā)送數(shù)據(jù)包,使用DMA方式能大量減輕CPU處理的時(shí)間,使其CPU資源不被大量浪費(fèi),尤其在UART收發(fā)大量數(shù)據(jù)包(如高頻率收發(fā)指令)時(shí)具有明顯優(yōu)勢(shì)。

Ⅰ簡(jiǎn)述DMA

DMA:Direct Memory Access,直接內(nèi)存存取/訪問(wèn)。簡(jiǎn)單來(lái)說(shuō)就是內(nèi)存RAM直接和其他設(shè)備(外設(shè))進(jìn)行數(shù)據(jù)交互,而不需要CPU參與的一種控制器

DMA它允許不同速度的硬件裝置來(lái)溝通,而不需要依賴(lài)于 CPU 的大量中斷負(fù)載。否則,CPU 需要從來(lái)源把每一片段的數(shù)據(jù)復(fù)制到暫存器,然后把它們?cè)俅螌?xiě)回到新的地方。在這個(gè)時(shí)間中,CPU 對(duì)于其他的工作來(lái)說(shuō)就無(wú)法使用。

ⅡDMA優(yōu)點(diǎn)

DMA在系統(tǒng)中的角色好比一個(gè)公司的員工,CPU好比是公司的老板。

老板想要寄送一個(gè)快遞到北京,只需要一個(gè)口令安排員工即可,具體填寫(xiě)快遞單號(hào)、物流、派送等一系列工作老板不用關(guān)心。最后快遞被對(duì)方收到,通知一聲老板即可。

回到UART發(fā)送數(shù)據(jù),同樣的道理,CPU只需要簡(jiǎn)單的操作(類(lèi)似上面的“安排”),就可把一串?dāng)?shù)據(jù)包丟給DMA直接發(fā)送,最后發(fā)送完成,收到一個(gè)發(fā)送完成中斷,通知CPU發(fā)送完成即可。

說(shuō)到這里相信大部分人都明白了,老板可以親自開(kāi)車(chē)或者坐飛機(jī)送快遞,完成這件事情,但會(huì)耽擱老板很多時(shí)間。

同樣,如果我們使用UART自己發(fā)送,CPU就會(huì)不停仲裁發(fā)送結(jié)果,占據(jù)CPU大量資源。

RTOS中,特別是有大量任務(wù)需要處理的時(shí)候,UART使用DMA發(fā)送就會(huì)帶來(lái)很大方便。使用裸機(jī)運(yùn)行的相同,尤為突出。

ⅢUART使用DMA發(fā)送配置

本文使用STM32F4 MCU、標(biāo)準(zhǔn)外設(shè)庫(kù)為例給大家簡(jiǎn)單講述一下配置。


1.USART配置

USART(COM)宏定義:

/* COMM通信 */ #define COMM_COM USART2 #define COMM_COM_CLK RCC_APB1Periph_USART2 #define COMM_COM_TX_GPIO_CLK RCC_AHB1Periph_GPIOD //UART TX #define COMM_COM_TX_PIN GPIO_Pin_5 #define COMM_COM_TX_GPIO_PORT GPIOD #define COMM_COM_TX_SOURCE GPIO_PinSource5 #define COMM_COM_TX_AF GPIO_AF_USART2 #define COMM_COM_RX_GPIO_CLK RCC_AHB1Periph_GPIOD //UART RX #define COMM_COM_RX_PIN GPIO_Pin_6 #define COMM_COM_RX_GPIO_PORT GPIOD #define COMM_COM_RX_SOURCE GPIO_PinSource6 #define COMM_COM_RX_AF GPIO_AF_USART2 #define COMM_COM_IRQn USART2_IRQn #define COMM_COM_Priority 9 //優(yōu)先級(jí) #define COMM_COM_BaudRate 115200 //波特率 #define COMM_COM_IRQHandler USART2_IRQHandler //中斷函數(shù)接口(見(jiàn)stm32f4xx_it.c)

USART配置:

/************************************************函數(shù)名稱(chēng) : USART_COMM_Configuration功 能 : 通信串口配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/ void USART_COMM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 時(shí)鐘配置 */ RCC_AHB1PeriphClockCmd(COMM_COM_TX_GPIO_CLK | COMM_COM_RX_GPIO_CLK, ENABLE); if((USART1 == COMM_COM) || (USART6 == COMM_COM)) RCC_APB2PeriphClockCmd(COMM_COM_CLK, ENABLE); else RCC_APB1PeriphClockCmd(COMM_COM_CLK, ENABLE); /* 復(fù)用配置 */ GPIO_PinAFConfig(COMM_COM_TX_GPIO_PORT, COMM_COM_TX_SOURCE, COMM_COM_TX_AF); GPIO_PinAFConfig(COMM_COM_RX_GPIO_PORT, COMM_COM_RX_SOURCE, COMM_COM_RX_AF); /* 引腳配置 */ GPIO_InitStructure.GPIO_Pin = COMM_COM_TX_PIN; //USART Tx GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復(fù)用模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(COMM_COM_TX_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = COMM_COM_RX_PIN; //USART Rx GPIO_Init(COMM_COM_RX_GPIO_PORT, &GPIO_InitStructure); /* NVIC配置 */ NVIC_InitStructure.NVIC_IRQChannel = COMM_COM_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = COMM_COM_Priority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* USART配置 */ USART_InitStructure.USART_BaudRate = COMM_COM_BaudRate; //波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //傳輸位數(shù) USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; //校驗(yàn)位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)功能 USART_Init(COMM_COM, &USART_InitStructure); USART_ClearFlag(COMM_COM, USART_FLAG_RXNE | USART_FLAG_TC); USART_ITConfig(COMM_COM, USART_IT_RXNE, ENABLE); //接收中斷 USART_DMACmd(COMM_COM, USART_DMAReq_Tx, ENABLE); //使能DMA USART_Cmd(COMM_COM, ENABLE); //使能USART }

2.DMA配置

DMA宏定義:

/* COMM_DMA */ #define COMM_DR_ADDRESS ((uint32_t)USART2 + 0x04) #define COMM_DMA DMA1 #define COMM_DMA_CLK RCC_AHB1Periph_DMA1 #define COMM_TX_DMA_CHANNEL DMA_Channel_4 #define COMM_TX_DMA_STREAM DMA1_Stream6 #define COMM_TX_DMA_FLAG_TCIF DMA_FLAG_TCIF6 #define COMM_TX_DMA_IRQn DMA1_Stream6_IRQn #define COMM_TX_DMA_Priority 8 //優(yōu)先級(jí) #define COMM_TX_DMA_IRQHandler DMA1_Stream6_IRQHandler //中斷函數(shù)接口(見(jiàn)stm32f4xx_it.c) #define COMM_TX_DMA_IT_TCIF DMA_IT_TCIF6

DMA配置:

/************************************************函數(shù)名稱(chēng) : USART_COMM_DMA_Configuration功 能 : 通信串口的DMA配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/ void USART_COMM_DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 使能時(shí)鐘 */ RCC_AHB1PeriphClockCmd(COMM_DMA_CLK, ENABLE); /* NVIC配置 */ NVIC_InitStructure.NVIC_IRQChannel = COMM_TX_DMA_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = COMM_TX_DMA_Priority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* DMA配置 */ DMA_DeInit(COMM_TX_DMA_STREAM); DMA_InitStructure.DMA_Channel = COMM_TX_DMA_CHANNEL; //DMA通道 DMA_InitStructure.DMA_PeripheralBaseAddr = COMM_DR_ADDRESS; //外設(shè)地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0; //內(nèi)存地址(待傳入?yún)?shù)) DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //傳輸方向 DMA_InitStructure.DMA_BufferSize = 0; //傳輸長(zhǎng)度(待傳入?yún)?shù)) DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)遞增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存遞增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //數(shù)據(jù)寬度 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //循環(huán)模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //優(yōu)先級(jí) DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(COMM_TX_DMA_STREAM, &DMA_InitStructure); DMA_ClearFlag(COMM_TX_DMA_STREAM, COMM_TX_DMA_FLAG_TCIF); DMA_ITConfig(COMM_TX_DMA_STREAM, DMA_IT_TC, ENABLE); //使能DMA傳輸完成中斷 DMA_Cmd(COMM_TX_DMA_STREAM, DISABLE); //初始化禁止 } ⅣDMA發(fā)送UART數(shù)據(jù)包

DMA發(fā)送函數(shù):

/************************************************函數(shù)名稱(chēng) : COMM_SendBufByDMA功 能 : 通信串口通過(guò)DMA發(fā)送數(shù)據(jù)參 數(shù) : Buf ------ 數(shù)據(jù)(地址) Length --- 數(shù)據(jù)長(zhǎng)度(字節(jié))返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/ void COMM_SendBufByDMA(uint8_t *Buf, uint16_t Length){ DMA_Cmd(COMM_TX_DMA_STREAM, DISABLE); //關(guān)閉DMA //內(nèi)存地址 DMA_MemoryTargetConfig(COMM_TX_DMA_STREAM, (uint32_t)Buf, DMA_Memory_0); DMA_SetCurrDataCounter(COMM_TX_DMA_STREAM, Length); //設(shè)置DMA傳輸長(zhǎng)度 DMA_Cmd(COMM_TX_DMA_STREAM, ENABLE); //使能DMA }

細(xì)心的朋友會(huì)發(fā)現(xiàn),這個(gè)發(fā)送函數(shù)其實(shí)很簡(jiǎn)單,當(dāng)然,這里是使用STM32F4芯片,其他芯片也差不多,原理類(lèi)似。 HAL庫(kù)同樣可以完成。

關(guān)于DMA發(fā)送完成中斷,可根據(jù)實(shí)際情況,如果使用RTOS,一般發(fā)送數(shù)據(jù)是一個(gè)任務(wù),這個(gè)任務(wù)會(huì)OS等待(檢測(cè))發(fā)送完成信號(hào)(即DMA發(fā)送完成中斷)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11074

    瀏覽量

    216904
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1275

    瀏覽量

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

    關(guān)注

    3

    文章

    576

    瀏覽量

    103132
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    請(qǐng)問(wèn)收到HCI_DOWNLOAD_MINIDRIVER響應(yīng)后是否需要LAUNCH_RAM命令?

    如果在收到 HCI_DOWNLOAD_MINIDRIVER 響應(yīng)后需要使用 LAUNCH_RAM 命令,則應(yīng)使用什么地址? 這與 CYBT353027-02 特別相關(guān)。 開(kāi)機(jī)后似乎需要立即執(zhí)行以下
    發(fā)表于 07-07 06:56

    如何才能拿到UART通過(guò)DMA收取回來(lái)的數(shù)據(jù)呢?

    你好,我想詢(xún)問(wèn)一下UART使用DMA時(shí)收取數(shù)據(jù)的代碼。之前我是用的是非DMA模式,使用的函數(shù)是CyU3PUartReceiveBytes,但是其處理速度不符合我的要求。因此我使用DMA
    發(fā)表于 05-22 08:31

    如何使用EXIT0來(lái)觸發(fā)DMA實(shí)現(xiàn)SPI發(fā)送數(shù)據(jù)?

    請(qǐng)問(wèn)一下,我想使用EXIT0來(lái)觸發(fā)DMA實(shí)現(xiàn)SPI發(fā)送數(shù)據(jù)。我現(xiàn)在使用PB0作為EXIT0的觸發(fā)源,我把PB0配置為外部中斷模式,DMAMUX同步模式使能,選擇EXIT0作為同步信號(hào)源,這種情況下
    發(fā)表于 04-23 07:31

    為什么無(wú)法使用Lpuart_Uart_Ip_ 發(fā)送任何數(shù)據(jù)回調(diào)中的AsyncSend?

    我已經(jīng)實(shí)現(xiàn)了基于 LPUART 的 DMA ,我可以發(fā)送使用 Lpuart_Uart_Ip_ 接收的數(shù)據(jù)同步發(fā)送 in lpuart_6_callback , 但是,我無(wú)法
    發(fā)表于 04-11 07:51

    stm32 DMA串口接收到數(shù)組,數(shù)組元素順序錯(cuò)亂怎么解決?

    配置DMA循環(huán)模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函數(shù)將串口數(shù)據(jù)循環(huán)發(fā)送到4個(gè)元素的buffer數(shù)組內(nèi),上位機(jī)20ms發(fā)送一次
    發(fā)表于 03-12 08:02

    DMA發(fā)送函數(shù)只能被調(diào)用一次是怎么回事?

    逐步debug DMA發(fā)送函數(shù),HAL_UART Transmit DMA,發(fā)現(xiàn)函數(shù)會(huì)對(duì)串口句柄的一個(gè)狀態(tài)位,gState 進(jìn)行判斷,只有在 huart->gState==HAL
    發(fā)表于 03-12 07:37

    STM32H743 UART DMA接收不到數(shù)據(jù),為什么?

    failed!\\n\", \"uart3\"); return RT_ERROR; } /* 以 DMA 接收及輪詢(xún)發(fā)送方式打開(kāi)串口設(shè)備
    發(fā)表于 02-19 06:14

    開(kāi)源直接用!UDP-UART數(shù)據(jù)透?jìng)鱽?lái)了

    UDP連接將數(shù)據(jù)發(fā)送到遠(yuǎn)程設(shè)備,然后將這些數(shù)據(jù)通過(guò)UART接口發(fā)送到本地設(shè)備。 這種通信方式在需要將遠(yuǎn)程設(shè)備的數(shù)據(jù)傳輸?shù)奖镜卦O(shè)備時(shí)非常有用,例如在遠(yuǎn)程監(jiān)控和遠(yuǎn)程控制系統(tǒng)中。 ▼ UDP
    的頭像 發(fā)表于 02-05 17:14 ?328次閱讀
    開(kāi)源直接用!UDP-<b class='flag-5'>UART</b>數(shù)據(jù)透?jìng)鱽?lái)了

    雅特力AT32F402/F405 DMA使用指南

    通道都支持外設(shè)的DMA請(qǐng)求映射到任意通道上。圖1.DMA控制器架構(gòu)DMAMUX簡(jiǎn)介對(duì)于如何將外設(shè)的DMA請(qǐng)求映射到任意的數(shù)據(jù)流通道上,就需要使用到DMAMUX。DM
    的頭像 發(fā)表于 11-20 01:03 ?993次閱讀
    雅特力AT32F402/F405 <b class='flag-5'>DMA</b>使用指南

    DMA是什么?詳細(xì)介紹

    系統(tǒng)性能。 DMA(直接內(nèi)存訪問(wèn))概述 1. DMA的定義 直接內(nèi)存訪問(wèn)(DMA)是一種硬件特性,允許外圍設(shè)備直接讀寫(xiě)系統(tǒng)內(nèi)存,而不需要CPU的直接控制。這種技術(shù)主要用于高速數(shù)據(jù)傳輸,
    的頭像 發(fā)表于 11-11 10:49 ?1.8w次閱讀

    uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

    ) :是衡量UART通信速度的單位,表示每秒傳輸?shù)谋忍財(cái)?shù)(bits per second,bps)。它反映了UART設(shè)備在發(fā)送和接收數(shù)據(jù)時(shí)使用的傳輸
    的頭像 發(fā)表于 10-06 16:12 ?6910次閱讀
    <b class='flag-5'>uart</b>波特率和傳輸頻率的關(guān)系 <b class='flag-5'>UART</b>串口的常用波特率為多少

    MSPM0 UART通信中DMA和Ring Buffer環(huán)形緩沖的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《MSPM0 UART通信中DMA和Ring Buffer環(huán)形緩沖的應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 09-05 11:01 ?0次下載
    MSPM0 <b class='flag-5'>UART</b>通信中<b class='flag-5'>DMA</b>和Ring Buffer環(huán)形緩沖的應(yīng)用

    揭秘車(chē)載VCU項(xiàng)目之外掛界的“大哥”DMA

    引腳配置此實(shí)例選擇CAN0進(jìn)行配置。三、外設(shè)配置對(duì)于DMA,其采用的固定映射,對(duì)于通道0至通道15,其映射一部分外設(shè),通道16至通道31映射一部分外設(shè),所以對(duì)于外設(shè)要使DMA,也需要
    的頭像 發(fā)表于 07-30 08:11 ?1346次閱讀
    揭秘車(chē)載VCU項(xiàng)目之外掛界的“大哥”<b class='flag-5'>DMA</b>

    在main里面調(diào)用uart_sample(),可以發(fā)送出去,但是接收不到發(fā)進(jìn)來(lái)的數(shù)據(jù),為什么?

    (serial, RT_DEVICE_FLAG_DMA_RX); /* 設(shè)置接收回調(diào)函數(shù) */ rt_device_set_rx_indicate(serial, uart_input); /* 發(fā)送字符串
    發(fā)表于 07-25 06:16

    RL78系列MCU DMAUART中的使用

    對(duì)于RL78系列的MCU,為了提高運(yùn)行效率,減少CPU的占用,建議UART數(shù)據(jù)收發(fā)使用DMA功能。DMA(Direct Memory Access)是RL78 MCU內(nèi)置的一個(gè)控制器,能在支持
    的頭像 發(fā)表于 07-17 14:24 ?1230次閱讀
    RL78系列MCU <b class='flag-5'>DMA</b>在<b class='flag-5'>UART</b>中的使用
    主站蜘蛛池模板: 久久久国产精品网站 | 中文字幕一区二区三区 精品 | 99久久精品国产自免费 | 四虎院影永久在线观看 | 中文字幕视频一区 | 哪个网站可以看av | 狼干综合 | 日本免费色 | 免费色在线 | 岛国最新资源网站 | 国产精品久久久久久久人热 | 天天干影院 | 亚洲日本视频在线观看 | 147西西人体大胆免费网 | 欧美黑人性色黄在线视频 | 免费视频不卡 | 港台无码| 欧美黄色xxx | 亚洲一在线 | 2022天天干| 一级毛片美国一级j毛片不卡 | 天天综合在线视频 | 小屁孩cao大人免费网站 | 欧美另类图片亚洲偷 | 你懂得国产 | 狠狠干视频网 | 欧美成人天天综合天天在线 | 四虎永久在线精品2022 | 国产精品7m凸凹视频分类大全 | 三级三级三级网站网址 | 全部免费特黄特色大片视频 | 一级特级女人18毛片免费视频 | 欧美色图首页 | 午夜a视频 | 鸥美三级 | 国产激情电影综合在线看 | 国产精品虐乳在线播放 | 97久久草草超级碰碰碰 | 亚洲乱码一区二区三区在线观看 | 日本久久高清视频 | 亚洲精品91香蕉综合区 |