DMA控制器

2023-05-16

DMA控制器

DMA 简介

直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传
输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可
供其它操作使用。
DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结
合在一起,优化了系统带宽。
两个 DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理
一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每
个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。

	DMA_DeInit(DMA1_Stream1);  
	/* 恢复默认配置 */
	DMA_InitStruct.DMA_Channel = DMA_Channel_4;
	/* 设置DMA通道 */
	DMA_InitStruct.DMA_PeripheralBaseAddr =(u32)(&USART3->DR);
	/* 外设基地址 */
	DMA_InitStruct.DMA_Memory0BaseAddr = (u32)USART3_RX_BUF;
	/* 存储器基地址 */
	DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
	/* DMA数据传输方向*/
	DMA_InitStruct.DMA_BufferSize = USART3_LEN;
	/* buffer数组大小 */
	DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	/* 外设地址是否增加 */
	DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
	/* 存储器地址是否增加 */
	DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
	/* 存储器数据大小 */
	DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
	/* 存储器数据大小 */
	DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
	DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
	/* 初始化DMA配置时,如果正常模式,传输结束后,除非软件重新对数据流编程并重新使能数据流,否则DMA就会停止传输,并且不会再响应任何DMA请求。*/
	DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;
	/* 存储器数据大小 */
	DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
	/* FIFO模式 */
	DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; 
	/*  */
	DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	/* 存储器突发传输 */
	DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
	/* 外设突发传输 */
	DMA_Init(DMA1_Stream1, &DMA_InitStruct);
	/* 初始化DMA */
	DMA_Cmd(DMA1_Stream1, ENABLE);  
	/* 使能DMA */

DMA模式选择注意事项

注意: 仅在外设到存储器模式下,传输的完成取决于 FIFO 中要传输到存储器的剩余数据。这种情 况不适用于存储器到外设模式。
如果是在非循环模式下配置数据流,传输结束后(即要传输的数据数目达到零),除非软件重新对数据流编程并重新使能数据流(通过将 DMA_SxCR 寄存器中的 EN 位置 1),否则 DMA 即会停止传输(通过硬件将 DMA_SxCR 寄存器中的 EN 位清零)并且不再响应任何 DMA 请求。

需要使用此函数将DMA_SxCR寄存器EN位置1
void DMA_Cmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState)

位 0 EN:数据流使能/读作低电平时数据流就绪标志 (Stream enable / flag stream ready when
read low)
此位由软件置 1 和清零。
0:禁止数据流
1:使能数据流
以下情况下,此位可由硬件清零:
— DMA 传输结束时(准备好配置数据流)
— AHB 主总线出现传输错误时
— 存储器 AHB 端口上的 FIFO 阈值与突发大小不兼容时
此位读作 0 时,软件可以对配置和 FIFO 位寄存器编程。EN 位读作 1 时,禁止向这些寄存
器执行写操作。

注意:将 EN 位置“1”以启动新传输之前,DMA_LISR 或 DMA_HISR 寄存器中与数据流相 对应的事件标志必须清零。

需要使用此函数将DMA_LISR和DMA_HISR寄存器事件标志清零
void DMA_ClearITPendingBit(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DMA控制器 的相关文章

  • 基于STM32F411使用SPI+DMA驱动LCD

    先看效果 F411CE 硬件SPI xff0b DMA驱动LCD 基于HAL库 其实HAL库我用不太习惯 xff0c 一直也是用的标准库 但HAL库确实是好上手一些 xff0c 就迅速创建一个新的template 这次就当尝试一下吧 xff
  • DMA 中断 查询三者的区别

    1 DMA xff08 DIRECT MEMORY ACCESS xff09 即直接存储器存取 xff0c 是指外部设备不通过CPU而直接与系统内存交换数据的接口技术 要把外设的数据读入内存或把内存的数据传送到外设 xff0c 一般都要通过
  • 关于RS485的DMA发送,以及EN使能脚的自动切换

    一 电路设计 1 低成本非隔离 xff1a 3 3v系统同样 xff0c 将5V改为3 3即可 同时采用TX连接三极管 xff0c 实现三极管驱动RS485芯片的EN使能脚 xff0c 从而省下一个IO口控制 隔离只需要将两个信号线用光耦隔
  • 【STM32】DMA原理,配置步骤超详细,一文搞懂DMA

    目录 DMA xff08 Direct Memory Access xff09 简介 DMA传输方式 DMA功能框图 DMA请求映像 DMA1控制器 DMA2控制器 通道 仲裁器 DMA主要特性 DMA处理 DMA数据配置 从哪里来到哪里去
  • 5.GD32F103C8T6 串口DMA+IDLE方式接收数据

    1 串口的基本初始化 span class token keyword void span span class token function usart base init span span class token punctuatio
  • AMD IOMMU与Linux (3) -- DMA

    Linux中DMA会使用硬件IOMMU如AMD IOMMU INTEL VT D xff0c 也会使用软件的SWIOTLB 这篇梳理一下LINUX内核在有AMD IOMMU的情况下 xff0c 是如何做DMA的 xff0c 内容包括如下 1
  • 查询方式/中断方式/DMA方式的区别及适用范围

    区别 xff1a 查询方式 xff1a CPU与设备串行工作 数据传送与主程序串行工作 xff1b 中断方式 xff1a CPU与设备并行工作 数据传送与主程序串行工作 xff1b DMA方式 xff1a CPU与设备并行工作 数据传送与主
  • STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流

    STM32使用串口空闲中断 xff08 IDLE xff09 和 DMA接收不定长数据 方法一 使用宏定义判断IDLE标志位 空闲的定义是总线上在一个字节的时间内没有再接收到数据 xff0c USART IT IDLE空闲中断是检测到有数据
  • STM32 USART 串口DMA收发注意事项

    正常情况这里不介绍 目录 1 低波特率情况 xff0c 接收信号可能会出现干扰 2 波特率300时 xff0c DMA接收无法工作 3 波特率1200时DMA发送 4 具体现象如下 环境 xff1a 主频72M STM32F103C8 注意
  • 串口+DMA 数据收发编程实践

    更多交流欢迎关注作者抖音号 xff1a 81849645041 目标 了解DMA 的工作原理 xff0c 通过配置 STM32F407 芯片的DMA xff0c 实现串口 43 DMA数据收发 原理 基于USART的数据通讯中采用中断方式可
  • FIFO和DMA

    FIFO SPI端口增加了FIFO xff0c 使得传输数据有了缓冲区间 FIFO存储器是一个先入先出的双口缓冲器 xff0c 即第一个进入其内的数据第一个被移出 xff0c 其中一个存储器的输入口 xff0c 另一个口是存储器的输出口 主
  • HAL_DMA_IRQHandler()代码详细分析

    这里使用ADC1联动DMA1 xff0c 开启半传输中断 传输中断 debug时 xff0c dma也一直在工作 xff0c 所以半传输中断 传输中断会同时生效 1 adc1使用了DMA1 Stream0 xff0c Instance表示如
  • *32.什么是DMA方式?什么是中断方式?有什么区别?

    DMA是l O设备与主存之间由硬件组成的直接数据通路 xff0c 主要用于高速I xff0f O设备与主存之间的成组数据传送 xff08 外设快 慢了没意义 然后数据多 xff0c 少了也没多大意义 xff09 首先讲一下外设跟内存进行数据
  • 16. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据

    adc 使用教程2 dma 连续扫描方式采集数据 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 注意 dma使用时存在一个外设映射到一个dam外设
  • STM32ADC多通道采集(基于DMA)

    首先简单介绍DMA DMA Direct Memory Access 直接内存存取 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 无需CPU干预 节省CPU资源 ADC转换出来的值直接赋值给定义好的变量中 配置好的DMA可
  • STM32F407的ADC+DMA 的简单使用

    这里以ADC3通道14为例 adc h ifndef adc H define adc H include stm32f4xx conf h ADC GPIO 宏定义 define RHEOSTAT ADC GPIO PORT GPIOF
  • STM32CubeMX—串口空闲中断+DMA接收

    一 实验说明 实验平台 STM32F103C8T6 实验内容 使用串口一空闲中断结合DMA 完成不定长数据接收 STM32的串口接收数据的方式 1 轮询接收 所谓轮询 就是在主函数中判断接收完成的标志位 举个不太恰当例子 就比如 此时你正在
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓
  • glBufferSubData什么时候返回? [复制]

    这个问题在这里已经有答案了 我想将一个非常大的内存块的内容传输到足够大的 GPU 缓冲区 然后立即更改 CPU 上的内存内容 伪代码是这样的 glBindBuffer very large buffer glBufferSubData ve

随机推荐

  • 虚拟机出现command XXX is available in /bin/ls问题

    问题 xff1a 使用本地的shell命令时候 The command could not be located because 39 usr bin bin 39 is not included in the PATH environme
  • 科大讯飞2022届春招补录内推开启

    xff01 xff01 xff01 科大讯飞2022届春招补录内推开启 xff01 xff01 xff01 内推岗位 xff1a 内推对象 xff1a 招聘流程 xff1a 投递方式 xff1a Step1 内推码 xff1a zyxie6
  • Django中select_related的作用和用法

    在数据库有外键的时候 xff0c 使用 select related 和 prefetch related 可以很好的减少数据库请求的次数 xff0c 从而提高性能 本文通过一个简单的例子详解这两个函数的作用 虽然QuerySet的文档中已
  • 由浅入深掌握Python多线程原理与编程步骤

    由浅入深掌握Python多线程编程 一 Python多线程编程原理1 什么是线程2 线程工作原理3 Python全局锁与线程关系4 Python 支持多线程的模块 二 由简单的示例初步了解多线程编程步骤三 标准库 threading 模块介
  • element-ui如何在表格中插入图片

    第一种 xff1a span class token operator lt span el span class token operator span table span class token operator span colum
  • Cannot find module node-sass解决

    过假期想着在家跑下项目 xff0c 写下代码 xff0c 结果把代码拉下来之后 xff0c 就死活跑不起来了 xff0c 以为是自己电脑node版本的原因 xff0c 结果卸载了node安装了最新版本的 xff0c 结果npm run de
  • element-ui表格中复选框只能选中一个

    代码 xff1a span class token operator lt span el span class token operator span table ref span class token operator 61 span
  • python操作鼠标进行点击

    python中的pyautogui库可以操作鼠标 安装 xff1a pip install pyautogui span class token keyword import span time span class token keywo
  • go中的bcrypt加密

    1 bcrypt是不可逆的加密算法 xff0c 无法通过解密密文得到明文 2 bcrypt和其他对称或非对称加密方式不同的是 xff0c 不是直接解密得到明文 xff0c 也不是二次加密比较密文 xff0c 而是把明文和存储的密文一块运算得
  • go gRPC 服务端推送给客户端流demo

    具体文件目录看上一篇的grpc xff0c 这个demo演示的是服务端以流的形式推送给客户端 pb hello proto syntax span class token operator 61 span span class token
  • docker常用命令

    打包镜像 docker build span class token operator span t demo v1 span class token punctuation span 运行镜像 docker run span class
  • docker镜像加载原理

    docker的镜像实际上是由一层一层的文件系统组成 xff0c 这种层级的文件系统叫做UnionFS bootfs boot file system 主要包含bootloade和kernel xff0c bootloader主要是引导加载k
  • docker网络

    docker network常见的四种模式 桥接模式 bridge xff1a 为每一个容器分配 设置ip等 xff0c 并将容器连接到一个叫做docker0的虚拟网桥 xff0c docker网络默认为该模式 xff0c 使用 netwo
  • 玩客云刷armbian更新源报错The repository ‘http://apt.armbian.com stretch Release‘ does not have a Release file

    玩客云刷armbian系统更新源报错的解决方法 xff08 E The repository 39 http apt armbian com stretch Release 39 does not have a Release file x
  • GPT-4工具是软件工程师工作效率的倍增器

    1 xff0c 你现在正在哪个领域学习或工作呢 xff1f 你用过哪些AI智能工具 xff1f 主要从事AI算法数据集处理 xff0c 模型部署工具开发 xff0c 以及低代码工具开发 使用 Github的 Copilot 编程伴侣超过1个
  • HDFS Java API操作(IDEA版)

    目标 通过Java API来操作HDFS xff0c 完成的操作有 xff1a 文件上传 文件下载 新建文件夹 查看文件 删除文件 前提条件 1 Windows下安装好jdk1 8 2 Windows下安装好maven xff0c 这里使用
  • Ubuntu20.04 安装 CUDA10.1 和 CUDNN7.6.5

    说明 xff1a 本人的实验环境为 xff1a ubuntu20 04 xff0c 显卡 xff1a GTX1060 xff0c 已安装Nvidia驱动 查看你的NVIDIA显卡驱动是否支持cuda10 1版本 查看显卡驱动命令 xff1a
  • C++ 20 新特性 ranges 精讲

    C 43 43 20 新特性 ranges 精讲 C 43 43 20 中的 ranges 库使得使用 STL 更加舒适和强大 ranges 库中的算法是惰性的 xff0c 可以直接在容器上工作 xff0c 并且可以很容易地组合 简而言之
  • C语言学习篇(概念题)

    关键字static的作用是什么 1 xff09 在模块内 xff08 在函数内 xff09 xff0c 则此静态变量只能在该函数内使用 超出范围不能使用 但是它还占用内存 还存在 2 xff09 在模块内 xff08 但在函数体外 xff0
  • DMA控制器

    DMA控制器 DMA 简介 直接存储器访问 DMA 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传 输 可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据 这样节省的 CPU 资源可 供其它操作使用 DMA 控制器基