0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32串口收发数据为什么要使用DMA

GReq_mcu168 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2022-02-12 13:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源,相关文章推荐:详解STM32中的DMA原理。

在STM32控制器中,芯片采用Cortex-M3架构,总线结构有了很大的优化,DMA占用另外的总线,并不会与CPU的系统总线发生冲突。也就是说,DMA的使用不会影响CPU的运行速度。

STM32串口收发数据为什么要使用DMA

DMA数据拷贝过程,典型的有:

内存—>内存,内存间拷贝

外设—>内存,如uart、spi、i2c等总线接收数据过程

内存—>外设,如uart、spi、i2c等总线发送数据过程

串口有必要使用DMA吗

串口(UART)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。PC与STM32单片机通信实例推荐:按下按键,通过串口发送数据实例。

对于小于或者等于115200bps波特率的,而且数据量不大的通信场景,一般没必要使用DMA,或者说使用DMA并未能充分发挥出DMA的作用。

对于数量大,或者波特率提高时,必须使用DMA以释放CPU资源,因为高波特率可能带来CPU资源过度浪费的问题。

举个例子

对于发送,使用循环发送,可能阻塞线程,需要消耗大量CPU资源“搬运”数据,浪费CPU。对于发送,使用中断发送,不会阻塞线程,但需浪费大量中断资源,CPU频繁响应中断。以115200bps波特率,1s大约传输11520字节,大约69us需响应一次中断,如波特率再提高,将消耗更多CPU资源。

对于接收,如仍采用传统的中断模式接收,同样会因为频繁中断导致消耗大量CPU资源。

因此,在高波特率传输场景下,串口非常有必要使用DMA。

原文标题:STM32串口收发数据为什么要使用DMA?

文章出处:【微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    463

    文章

    54379

    浏览量

    469022
  • 控制器
    +关注

    关注

    114

    文章

    17860

    浏览量

    195026
  • STM32
    +关注

    关注

    2312

    文章

    11189

    浏览量

    374523

原文标题:STM32串口收发数据为什么要使用DMA?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口

    仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬件和接线 硬件需要一块STM32F103C8T6的开发板,杜邦线诺干,2.4寸串口屏一块 接线 串口STM32
    的头像 发表于 02-10 17:07 524次阅读
    <b class='flag-5'>STM32</b>驱动<b class='flag-5'>串口</b>屏,<b class='flag-5'>STM32</b>F103C8T6<b class='flag-5'>串口</b>发送指令控制HMI<b class='flag-5'>串口</b>屏

    串口调试步骤(适合免驱动的232串口设备)

    密码切换到root超级管理下 apt update 更新插件 apt-get install cutecom 安装系统自带的串口调试工具 cutecom 输入串口测试的指令会弹出一个图形界面如下图 32串口协议测试需要将第2和第
    的头像 发表于 12-17 17:23 1614次阅读
    <b class='flag-5'>串口</b>调试步骤(适合免驱动的232<b class='flag-5'>串口</b>设备)

    NucleiStudio_IDE_201909串口打印浮点型数据时无数据输出,软件该如何配置串口才能打印浮点型数据

    NucleiStudio_IDE_201909串口打印浮点型数据时无数据输出,软件该如何配置串口才能打印浮点型数据
    发表于 11-07 07:57

    UWB650串口测距通信定位模块规格书

    UWB650串口测距通信定位模块规格书
    发表于 11-03 17:40 1次下载

    rt-thread 在使用串口DMA模式的时候,接收数据接收不到00,为什么?

    硬件为STM32F103ZET6: 在使用串口通讯时,在DMA接收模式下,收不到00数据,遇到00数据,好像
    发表于 10-14 06:20

    GD32的串口DMA收发数据失败怎么解决?

    我在使用RTT的GD32F303的BSP时,配置使用串口DMA收发(rt_device_open),发现错误,最终无法收发数据,对比了
    发表于 09-17 06:04

    STM32H743 UART DMA接收不到数据是为什么?

    ); rt_thread_mdelay(1000); } } 使用串口助手,PC端能收到“hello”,但是PC端下发的数据,没有收到。 如果配置上不使用DMA串口
    发表于 09-11 07:14

    关于stm32f4zgt6和mspm0g3507串口通信问题

    本人在使用stm32f4zgt6和mspm0g3507串口通信时出现问题,情况如下: m0芯片使用软件超时解析进行数据接收,使用标准库的transmit函数进行数据发送。
    发表于 09-01 11:11

    串口DMA发送失败的原因?怎么解决?

    #include #include #include// 包含 RT-Thread 设备驱动相关定义 #include// 包含 GPIO 驱动相关定义 /* 根据实际485串口来修改 */ #define
    发表于 08-15 06:21

    DTU的S485/232串口能够复用吗?

    想问一下,DTU的S485/232串口能够复用吗?就是窗口下面接很多传感器设备那种,主要是传感器数量过大,一个传感器接一台DTU太过于浪费。
    发表于 08-06 06:58

    求助,关于stm32H7多DMA数据流问题求解

    情况如下:stm32H7配置了一个adc进行采样,通过dma进行数据传输,串口接收和发送命令,用两个dma
    发表于 07-29 15:02

    STM32串口发送数据,USART_FLAG_TC无法置位怎么解决?

    STM32串口发送数据,在经过一段时间的数据发送,大概200ms发送一下,一次发送大概二三十个字节的数据,有可能会发生USART_FLAG_
    发表于 07-29 11:44

    串口转网网关有哪些功能应用

    直接接入信息网络的痛点,同时支持多协议解析、边缘计算与安全防护等高级功能。 在工业自动化生产线上,大量设备如 PLC(可编程逻辑控制器)、传感器、仪表等仍采用串口通信,而上位机则是通过以太网进行通信。串口转网
    的头像 发表于 07-17 17:10 902次阅读
    <b class='flag-5'>串口</b>转网<b class='flag-5'>口</b>网关有哪些功能应用

    cyw43907串口数据错位问题怎么解决?

    1.串口数据会偶发错位问题,具体在附件中描述。 2.目前使用串口0进行通信,发现在配置波特率为460800的时候通讯异常,debug发现貌似是波特率误差过大,所以选择了467500,有无推荐误差比较小且波特率与460800差不多
    发表于 07-09 08:16

    STM32驱动ADS1256串口输出-AD转换

    文章介绍了如何使用STM32通过SPI接口初始化并驱动ADS1256高精度AD转换器,包括ADS1256的芯片特点、引脚说明、模块配置、程序初始化以及实验中的接线和现象。在实验中,通过读取各个通道的AD值并转换为电压,展示了芯片功能的正确实现。
    的头像 发表于 07-01 14:59 2499次阅读
    <b class='flag-5'>STM32</b>驱动ADS1256<b class='flag-5'>串口</b>输出-AD转换