你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32CubeMX-直接存储器访问(DMA)

[复制链接]
STMCU小助手 发布时间:2022-6-26 12:24
    直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。说白了DMA就是一个搬运工,将数据从一个地方搬到另一个地方而不需要CPU处理。作为一个搬运工,要他正常工作必须要确定几个重要的参数:
  • 传输模式:数据从哪里搬到哪里。三种可能的传输方向:存储器到外设、外设到存储器或存储器到存储器
  • 通道选择:就是数据传输的是走那条道路
  • 仲裁器:多个DMA传输是优先级高的优先传输
  • 数据长度:每次传输的数据长度,可以一个字节,两个字节(半字),四个字节(字)
  • 指针递增:如果使能了递增模式,则下一次传输的地址将是前一次传输的地址递增 1(对于字节)、2(对于半字)或4(对于字)

    打开STM32CubeMX重新建工程,配置和上一章配置一样。只是这个工程中,在DMA设置栏添加UASART发送TX和接收RX的DMA。发送选择 DMA1 Channel 4通道,方向从存储器到外设。优先级为低。接收选择DMA1 Channel 5通道,方向外设到存储器,优先级为低。Mode为Normal,Data Width选择Byte。

微信图片_20220626122245.png

    其中mode设置可以选择Normal表单次传输,传输一次后终止传输,Circular表示循环传输,传输完成后又重新开始继续传输,不断循环永不停止。此处选择单次传输。

微信图片_20220626122248.png

    Increment Address表示地址指针递增。串口发送数据是将数据不断存进串口的发送数据寄存器(USARTx_TDR)。所以外接的地址是不递增。而内存储器存储的是要发送的数据,所以地址指针要递增才能将所以的数据发送出去。

微信图片_20220626122252.png

    串口数据发送寄存器只能存储8bit,每次发送一个字节,所以数据长度选择Byte。另外要注意的一点,必须要开启串口中断。DMA1中断已默认开启。生成报告以及代码,编译程序。在usart.c文件中,可以找到刚才的DMA设置。

微信图片_20220626122258.png

    在main函数前面添加发送的数据。

微信图片_20220626122301.png

    在main()函数的while(1)循环中添加应用程序,通过DMA将数据发送出去。这是只测试发送,至于接收可以看USART文内容。

微信图片_20220626122303.png

    编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200,接收到如图信息。需要注意的是,如果不开启串口中断,则程序只能发送一次数据,程序不能判断DMA传输是否完成,USART一直处于busy状态。

微信图片_20220626122306.png

收藏 评论0 发布时间:2022-6-26 12:24

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版