色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口DMA其實一點兒都不難

朱老師物聯網大講堂 ? 2024-04-29 08:10 ? 次閱讀

DMA一種在嵌入式實時任務處理中常用的功能。而UART發送數據包,使用DMA方式能大量減輕CPU處理的時間,使其CPU資源不被大量浪費,尤其在UART收發大量數據包(如高頻率收發指令)時具有明顯優勢。

一、簡述DMA

ecb153ba-05bc-11ef-9118-92fbcf53809c.pngDMA:Direct Memory Access,直接內存存取/訪問。簡單來說就是內存RAM直接和其他設備(外設)進行數據交互,而不需要CPU參與的一種控制器。DMA它允許不同速度的硬件裝置來溝通,而不需要依賴于 CPU 的大量中斷負載。否則,CPU 需要從來源把每一片段的數據復制到緩存器,然后把它們再次寫回到新的地方。在這個過程中,CPU不能做其他的工作。

二、DMA的優點

ecb153ba-05bc-11ef-9118-92fbcf53809c.pngDMA在系統中的角色好比一個公司的員工,CPU好比是公司的老板。回到UART發送數據,同樣的道理,CPU只需要簡單的操作(“安排任務”),就可把一串數據包丟給DMA直接發送,最后發送完成,收到一個發送完成中斷,通知CPU發送完成即可。說到這里相信大部分人都明白了,老板可以親自開車或者坐飛機送快遞,完成這件事情,但會耽擱老板很多時間。同樣,如果我們使用UART自己發送,CPU就會不停仲裁發送結果,占據CPU大量資源。在RTOS中,特別是有大量任務需要處理的時候,UART使用DMA發送就會帶來很大方便。使用裸機運行的相同,尤為突出。

三、實例代碼:DMA發送配置

ecb153ba-05bc-11ef-9118-92fbcf53809c.png本文使用STM32F4 MCU、標準外設庫為例給大家簡單講述一下配置。

01

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 //優先級#define COMM_COM_BaudRate 115200 //波特率#define COMM_COM_IRQHandler USART2_IRQHandler //中斷函數接口(見stm32f4xx_it.c)

USART配置:

/************************************************函數名稱 :USART_COMM_Configuration功 能 :通信串口配置參 數 :無返 回 值 :無作 者 :strongerHuang*************************************************/void USART_COMM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
/* 時鐘配置 */ 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);
/* 復用配置 */ 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; //復用模式 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; //傳輸位數 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(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}


02

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 //優先級#define COMM_TX_DMA_IRQHandler DMA1_Stream6_IRQHandler //中斷函數接口(見stm32f4xx_it.c)#define COMM_TX_DMA_IT_TCIF DMA_IT_TCIF6

DMA配置:

/************************************************函數名稱 :USART_COMM_DMA_Configuration功 能 :通信串口的DMA配置參 數 :無返 回 值 :無作 者 :strongerHuang*************************************************/void USART_COMM_DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
/* 使能時鐘 */ 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; //外設地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0; //內存地址(待傳入參數) DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //傳輸方向 DMA_InitStructure.DMA_BufferSize = 0; //傳輸長度(待傳入參數) 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_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); //初始化禁止}

03

DMA發送UART數據包

DMA發送函數:

/************************************************函數名稱 :COMM_SendBufByDMA功 能 :通信串口通過DMA發送數據參 數 :Buf ------ 數據(地址) Length --- 數據長度(字節)返 回 值 :無作 者 :strongerHuang*************************************************/void COMM_SendBufByDMA(uint8_t *Buf, uint16_t Length){ DMA_Cmd(COMM_TX_DMA_STREAM, DISABLE); //關閉DMA //內存地址 DMA_MemoryTargetConfig(COMM_TX_DMA_STREAM, (uint32_t)Buf, DMA_Memory_0); DMA_SetCurrDataCounter(COMM_TX_DMA_STREAM, Length); //設置DMA傳輸長度 DMA_Cmd(COMM_TX_DMA_STREAM, ENABLE); //使能DMA}

細心的朋友會發現,這個發送函數其實很簡單,當然,這里是使用STM32F4芯片,其他芯片也差不多,原理類似。HAL庫同樣可以完成。
關于DMA發送完成中斷,可根據實際情況,如果使用RTOS,一般發送數據是一個任務,這個任務會OS等待(檢測)發送完成信號(即DMA發送完成中斷)。

本文轉載自公眾號|strongerHuang

如有侵權 |聯系刪除

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 串口
    +關注

    關注

    14

    文章

    1581

    瀏覽量

    78418
  • dma
    dma
    +關注

    關注

    3

    文章

    569

    瀏覽量

    102120
  • 數據包
    +關注

    關注

    0

    文章

    269

    瀏覽量

    24836
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    高鐵跑得快,不靠車頭帶

    這句話也是一點兒毛病都沒有。但是如果你想用這句話描述當今高鐵列車的動力系統,那毛病大了。今天就來和大家聊聊,高鐵跑得那么快,既不是車頭帶的,又不是你領導帶的,那到底
    的頭像 發表于 02-08 11:25 ?387次閱讀
    高鐵跑得快,不靠車頭帶

    用LMP91200采集PH信號,LMP91200輸出的電壓會一點一點下降,是什么原因導致的?

    我用LMP91200采集PH信號。在前段信號無變化的情況下,LMP91200輸出的電壓會一點一點下降。電路連接我是參考LMP91200開發板的。 請問可能是什么原因?需要采取什么措施解決?
    發表于 02-05 06:12

    ZYNQ基礎---AXI DMA使用

    前言 在ZYNQ中進行PL-PS數據交互的時候,經常會使用到DMA其實在前面的ZYNQ學習當中,也有學習過DMA的使用,那就是通過使用自定義的IP,完成HP接口向內存寫入和讀取數據的方式。同樣
    的頭像 發表于 01-06 11:13 ?1663次閱讀
    ZYNQ基礎---AXI <b class='flag-5'>DMA</b>使用

    救助,定義個大一點的數組導致編譯不通過問題。

    本例使用 CSU-IDE V6.0.6 ,單片機為CSU38F20,發現在改大數組的時候編譯不通過,請各位大神指教。具體問題描述如下: 正常情況: 串口收發緩沖區定義小一點沒有問題,如下
    發表于 01-01 15:43

    串口設計些關鍵注意!千萬別踩雷!

    本文將以Air700ECQ/EAQ/EMQ為例,帶你從硬件設計的角度,起來了解串口設計中的些關鍵注意;軟件開發或者AT設置方面不做深入探討。 ?
    的頭像 發表于 12-25 17:01 ?537次閱讀
    <b class='flag-5'>串口</b>設計<b class='flag-5'>一</b>些關鍵注意<b class='flag-5'>點</b>!千萬別踩雷!

    光纖外面的皮破了一點有關系嗎

    光纖外面的皮破了一點,在般情況下,只要光纖的纖芯沒有受到損傷,對通信通常是沒有影響的。光纖的外皮主要起保護作用,能夠防止光纖受到機械損傷、腐蝕、潮濕等外部環境的損害。如果外皮破損,但纖芯仍然保持
    的頭像 發表于 11-25 10:04 ?1754次閱讀

    TPA3255音量稍微大一點就會保護,需要重新啟動,怎么解決?

    經過反復測3255 雙聲道模式2歐喇叭單元,音量稍微大一點就會保護,需要重新啟動,4歐以上就沒有任何問題,這個情況供電超過36V 才明顯,尤其高壓50V左右,只要音量有一點就保護了。單聲道模式可以55V供電不保護。尋求解決辦法,調整電阻,電容,或者加粗銅箔走線,并沒有得
    發表于 09-30 08:32

    求推薦帶寬高的單電源儀表放大器?

    有沒有帶寬高一點兒的單電源儀表放大器
    發表于 09-23 06:56

    大功率貼片電感的電感值偏大一點可以用嗎

    電子發燒友網站提供《大功率貼片電感的電感值偏大一點可以用嗎.docx》資料免費下載
    發表于 09-20 11:33 ?0次下載

    VCA810可變增益放大器按PDF的原理圖來設計,怎么效果一點都不好呢?

    VCA810可變增益放大器,按著PDF的原理圖來設計,怎么效果一點都不好呢,跟理論值差好遠啊,增益變化根本不成線性,調了好久了,實在沒有辦法!
    發表于 09-14 06:18

    電感碎了一點點能正常用嗎

    電子發燒友網站提供《電感碎了一點點能正常用嗎.docx》資料免費下載
    發表于 09-04 11:32 ?0次下載

    HMC470控制電平改變,但是HMC470的衰減倍數還是一點都不變,為什么?

    HMC470控制電平改變,但是芯片的衰減倍數還是一點都不變 芯片是根據芯片的幾個引腳的輸入改變衰減倍數的 HMC470芯片是LCC封裝的,就是那種四周有16個引腳的,引腳在芯片的正下方,芯片大小
    發表于 09-03 06:47

    發電機轉子一點接地如何處理

    故障原因分析 發電機轉子一點接地故障的原因主要有以下幾種: 1.1 機械損傷 發電機轉子在運行過程中,由于振動、摩擦等原因,可能導致轉子繞組的絕緣層受到損傷,從而引發接地故障。 1.2 絕緣老化
    的頭像 發表于 08-20 17:05 ?2864次閱讀

    【GD32F303紅楓派開發板使用手冊】第十六講 USART-DMA串口收發實驗

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

    沒開玩笑!高速信號不能參考電源網絡這條規則,其實很難做到

    ?這難道很難做到嗎?PCB的設計和疊層圖都給你截出來了,只要疊層夠,這一點都不難啊! 是的,高速信號線不能參考電源平面這條規則是很容易滿足的,但是大家再認真看看我們的題目是怎么說的?是“高速信號不能
    發表于 05-28 14:56
    主站蜘蛛池模板: 成人永久免费视频网站在线观看 | 欧美性猛交AAA片免费观看 | chinese情侣自拍啪hd | 浪荡受自我调教纯肉BL | seyeye在清在线 | 免费看亚洲 | 国产99RE在线观看69热 | 亚洲精品久久无码AV片银杏 | 久久青青草原综合伊人 | 国产 有码 无码 电影 | 仓井空torrent | vr亚洲成年网址在线观看 | 亚洲AV福利天堂一区二区三 | 亚洲中文字幕手机版 | 欧美 亚洲综合在线一区 | 色欲无码国产喷水AV精品 | 爽a中文字幕一区 | 亚洲AV无码乱码国产麻豆P | 同居了嫂子在线观看 | 国产亚洲视频中文字幕 | 国产精品AV无码免费播放 | 真实国产乱子伦精品一区二区三区 | 亚洲伊人久久一次 | 国产精品亚洲第一区二区三区 | 精品香蕉99久久久久网站 | 亚洲精品线在线观看 | 无码AV免费精品一区二区三区 | 美女被强奷到抽搐的动态图 | 亚洲最大日夜无码中文字幕 | 国产成人在线视频观看 | 伊人久久大香线蕉综合bd高清 | 9久久99久久久精品齐齐综合色圆 | 国产成人高清亚洲一区app | 免费观看男生桶美女私人部位 | 日本久久久WWW成人免费毛片丨 | 日本A级作爱片金瓶双艳 | 国产精品亚洲精品影院 | 成年人免费在线视频观看 | 神马伦理2019影院不卡片 | 成人AV无码一二二区视频免费看 | 日本三级黄色大片 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品