DMA介绍

news/2024/11/28 7:33:36/

文章目录

  • 一 DMA简介
  • 二 DMA有什么用
  • 三 数据从什么地方送到什么地方?
  • 四 DMA可以传递多少数据?
  • 五 外设的DMA请求映像

一 DMA简介

DMA全称Direct Memory Access, 直译为“直接存储器访问”。
DMA的作用是帮助CPU在内存之间搬运数据,搬运的过程中无需CPU的干涉,也不存在中断方式传送数据的那样保留现场和恢复现场的过程,这样的DMA控制器通过硬件来为RAM和IO设备之间开辟一条直接传送数据的通路(从源地址搬运到目的地址),从而使CPU的负担大大减少。

二 DMA有什么用

直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

三 数据从什么地方送到什么地方?

外设到SRAM,FLASH(I2C/UART等获取数据并送入SRAM,FLASH);
SRAM的两个区域之间;
外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比);
SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形);

四 DMA可以传递多少数据?

我理解在STM32中,它的概念被扩展了,也许更多的时候快速是其应用的重点,数据可以从1~65535个。
总之,每个DMA传送由3个操作组成:
1. 从外设数据寄存器或者从DMA_CMARx寄存器指定地址的存储器单元执行加载操作。
2. 存数据到外设数据寄存器或者存数据到DMA_CMARx寄存器指定地址的存储器单元。
3. 执行一次DMA_CNDTRx寄存器的递减操作。该寄存器包含未完成的操作数目。

仲裁器根据通道请求的优先级来启动外设/存储器的访问。
优先级分为两个等级:(可以在DMA传输过半、传输完成和传输错误时产生中断)
1.软件(4个等级:最高、高、中等、低);
2.硬件(有较低编号的通道比拥有较高编号的通道有较高的优先权);

DMA_DeInit(DMA1_Channel6);
//peripheral base address
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;
//memory base address
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DST_Buffer;
//数据传输方向    Peripheral is source
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//缓冲区大小 Number of data to be transferred (0 up to 65535).数据传输数目
DMA_InitStructure.DMA_BufferSize = BufferSize;
// the Peripheral address register is incremented
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
//the memory address register is incremented
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//the Peripheral data width
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//the DMAy Channelx will be used in memory-to-memory transfer
//DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
DMA_Init(DMA1_Channel6, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA1_Channel6, ENABLE);

五 外设的DMA请求映像

要使DMA与外设建立有效连接,这不是DMA自身的事情,是各个外设的事情,每个外设都有 一个
xxx_DMACmd(XXXx,Enable )函数,如果使DMA与ADC建立有效联系,就使用ADC_DMACmd

(ADC1,Enable); (这里我启用了ADC中的ADC1模块)。
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2; 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1, ENABLE);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
//内部温度传感器  添加这一句
ADC_TempSensorVrefintCmd(ENABLE);
//################ Channel 10(电位器)
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);
//###### 内部温度传感器  Channel 16 ###################
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_55Cycles5);
//使能ADC1的DMA请求映像
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
//使用之前一定要校准
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

http://www.ppmy.cn/news/155723.html

相关文章

达梦数据库DM8

达梦数据库 DM8(达梦8)是一款由武汉达梦数据库有限公司基于C/C语言开发的国产关系型数据库,有支持X86和ARM平台的版本,可以部署到开源系统CentOS6.X及国产系统KyLin-V4上;作为国产关系型数据库,其DM8与Oracle数据库的…

DMA/DMA2D概念

目录 DMA DMA-系统框图 DMA分类 传输方向 传输行为 模块设计 学习过程中的疑问 DMA2D DMA2D框图 DMA2D应用方式 (1条消息) 【STM32】 DMA原理,步骤超细详解,一文看懂DMA_Z小旋的博客-CSDN博客_dma stm32 对DMA请求如何产生的理解_pangyinglong的博客-CSD…

DMHS(DM8-DM8)搭建

一、准备工作 1.DM8数据库安装 在配置DMHS同步之前,需要安装完成相应的DM8数据库。 2.DMHS安装 根据DM8数据库的类型以及操作系统环境,安装对应的DMHS版本软件。 二、配置部署 1.开启归档和逻辑日志 (1)设置归档标记和逻辑…

DMZ讲解

DMZ全称: (Demilitarized Zone)隔离区,也称非军事化区,与军事区和信任区相对应。 拓扑图 非军事区(DMZ): 不信任系统提供服务的孤立网段,其目的是把敏感的内部网络和其他提供访问服务的网络分开,阻止内网和…

DM8安装教程

DM8安装与卸载 一、安装 我这里是创建了一个dmdba用户,这里不再展示过程,开始准备安装数据库。 先设置好安装目录: 创建dm8文件夹,并修改安装目录的所属组给 dmdba 用户和该用户所属组挂载镜像文件 切换到该目录可以看到两个…

DMHS学习(DM8-DM8)

相关概念 优点: 1.DMHS 使用检查点机制实现断点续传,断点包括两个部分,即 DMHS 前置的变化数据捕捉模块数据抽取位置检查点和 DMHS 主程序的数据装载模块的已装载位置检查点。DMHS 的前置模块与主程序模块采取完备的消息应答机制来保障数据传…

安装DM8

DM逻辑体系结构 1.数据库由一个或多个表空间组成; 2. 每个表空间由一个或多个数据文件组成; 3. 每个数据文件由一个或多个簇组成; 4. 段是簇的上级逻辑单元,一个段可以跨多个数据文件; 5. 簇由磁盘上连续的页组成&…

dmhs之dm8 to dm8

目录 DMHS介绍 DMHS搭建 DMHS安装配置 常见错误 DMHS介绍 支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统 支持一对一、一对多广播型、多对一聚合型、多对多以及级联复制等多种数据复制形式 总体架构:单进程多线程架构(dmhs_serve…