UART中的DMA数据处理过程

一、DMA简介

        DMA (Direct Memory Access) ,直接内存存储器,使用它在做数据传输时能够大大减轻CPU的负担。

        DMA,全称 Direct Memory Access,即直接存储器访问。用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。

二、主要特性整理

        (1)存储器和存储器间的传输。

        (2)外设和存储器、存储器和外设之间的传输。

        (3)有12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道。

        (4)可编程的数据传输数目:最大为65535。

        (5)源和目标地址必须按数据传输宽度对齐。

        (6)在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(小的优先于大的)。

        (7)支持循环的缓冲器管理每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

        (8)每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。

        (9)闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。

三、DMA处理过程

        (1)在发生一个事件后,外设向DMA控制器发送一个请求信号。

        (2)DMA控制器根据通道的优先权处理请求。

        (3)当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给外设一个应答信号。

        (4)当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。

        (5)如果有更多的请求时,外设可以启动下一个周期。

四、在STM32中DMA有norma和circular两种模式,每种模式在数据进行传输时需要告知传输数据的大小

        1、Normal mode:
        DMA 开始传输数据,当它传输完成后就会停止。下一次开始需要手动处理。

        2、Circular mode:
        DMA从传输开始,当它传输完成后会自动按照相同配置重新传输,周而复始直至被控制停止或传输发生错误。

五、DMA的普通模式和循环模式

        DMA传输模式有两种,普通模式和循环模式。相关寄存器有DMA_CCRx的CIRC位和DMA_CNDTRx。

        当工作在普通模式,DMA搬运了设定长度的数据后,CNDTR清0,会产生中断标志,然后DMA就停止工作了,如果再有数据也不接收了。需关断 DMA 使能后再重新配置后才能继续传输。

        当工作在循环模式,DMA搬运了设定长度的数据后,CNDTR清0,会产生中断标志,如果再有数据,DMA会循环保存到内存中,覆盖前面的数据。在CNDTR=0时DMA会自动装载初始化时的配置,CNDTR重置为初始值。

        DMA传输完成关闭是需要:1、先关闭外设;2、再关闭DMA模块,否则有一定概率导致DMA再次使用时异常。异常表现为DMA不运作。

 关于在BP10上的DMA的结构体讲解:

DMA的工作(发送和接收)

1、在DMA接收,定义DMA接收的外设ID和DMA的各种参数

2、在DMA发送,定义DMA发送的外设ID和DMA的各种参数

3、了解DMA的结构体

第一个是DMA通道的传输方向(DMA CHANNEL DIR PERI2MEM意味着DMA将从外设读取数据到内存)(DMA_CHANNEL_DIR_MEM2PERI意味着DMA将内存读取数据到外设)(DMA_CHANNEL_DIR_MEM2MEM意味着DMA将一个内存模块数据读取到另一个内存模块)

第二个是DMA传输模式,分为(DMA_BLOCK_MODE 块传输和DMA_CIRCULAR_MODE循环传输)

第三个是循环模式下的一个阈值或者长度

第四个是DMA源的数据宽度

第五个是DMA目的地数据宽度

第六个是 DMA 操作中源地址的自动增量模式,当设置为 AINCR 时,源地址将会在每次传输后自动增加,以指向下一个数据。这是为了方便从源位置连续地读取数据。

第七个是DMA 操作中目的地地址的自动增量模式,当设置为 AINCR 时,目的地地址将会在每次传输后自动增加,以指向下一个数据。这是为了方便从目的地位置连续地读取数据。

第八个是源地址

第九个是目的地地址

第十个是数据缓存长度Bufferlen

DMA的外设ID值表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/695978.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习-06】Scikit-Learn机器学习工具包进阶指南:机器学习分类模型实战与数据可视化分析

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

RK3568/RK3588智慧校园AI盒子方案,电子班牌,出入口管制,数字化校园等,支持鸿蒙,支持免费定制

智慧校园解决方案基于物联网、人工智能等新兴技术,为师生构建智能化校园环境,涵盖了校园安全、智慧教室、考勤管理、智慧食堂等多个场景,从工作、学习到生活,带来更人性化、更便捷、更高效的服务。 方案架构 方案特点 全面感知校园…

极狐GitLab 容器镜像安全扫描实践【下】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…

巴奴火锅翻车,杜中兵后悔暗讽海底捞

曾经喊出“服务不过度,样样都讲究”、内涵海底捞的巴奴火锅,又改回了2012年的广告语,试图重回“产品主义”。 巴奴火锅于2001年创立于河南安阳,彼时被视作火锅界的黑马。巴奴火锅创始人的杜中兵,坚信“产品主义”一定…

运维安全管理系统:“四集中”管理 解决迫切问题

日前,国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全产品解决方案与相关技术研究开发的领军企业——国联易安依托自身强大的研发能力,丰富的行业经验,自主研发了新一代软硬件一体化统一安全运维平台——国联易安…

品牌舆情都包含什么内容?建议收藏

一个品牌的声誉、形象、产品质量、服务质量等,无时无刻不在接受着大众的检验。互联网传播迅速,一个不好的舆论直接导致整个品牌的声誉受到严重影响。品牌舆情都包含什么内容?接下来伯乐网络传媒就来给大家讲一讲。 一、品牌舆情的基本构成 1…

Bean的生命周期与循环依赖

如有不对的地方,还请大佬指正 Bean生命周期 扫描类 得到 BeanDefinition(包含bean的class等属性值) 后在BeanFactoryPostProcessor对bean实例化之前对Bean的元数据进行操作,修改Bean的属性值、添加自定义的BeanDefinition 实例化非懒加载单例bean1. …

给返修就能炫耀几年?16.4的高分,指标优秀,行业公认top 1顶刊!

本周投稿推荐 SSCI • 2区社科类,3.0-4.0(社科均可) EI • 计算机工程类(接收广,录用极快) SCI&EI • 4区生物医学类,1.5-2.0(录用率99%) • 1区工程类&#…

【C++初阶】string模拟实现

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…

基于微信小程序+JAVA Springboot 实现的【网上商城小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 基于微信小程序的网上商城 项目技术栈 该项目采用了以下核心技术栈: 后端框架/库: Java, SSM框架数据库: MySQL前端技术: 微信开发者工具,微信小程序框架 项目展示 5.1 管理员服务…

uos server 无法通过ssh工具连接

问题现象 uos server 服务器操作系统 在虚拟机中安装好之后,防火墙已经关闭,ssh服务已经启动,但通过finalshell等ssh工具连接报错 :java.net.ConnectException: Connection timed out: connect 经过确认 防火墙已关,s…

visual sudio使用-创建空项目-创建cpp文件

新建空项目 新建cpp文件 #include <iostream> using namespace std;int main() {cout << "hello vs" << endl;cout << "hello c" << "\n";cout << "hello first day\n"; }