DMA的简单了解与认识

DMA就是为了减轻CPU的负担来设置的存储方式。当从外设取到的数据就不需要经过内核操作,而是通过DMA直接把外设的数据放到内存SRAM中,这样就会减少CPU的负担,让CPU在此同时能做更多的事情。(直接存储器)

对于32的学习已经轻车熟路了,这时我们就会开始想到会有一个关于DMA的结构体即DMA_InitTypeDef

这时就会想到对其结构体的参数进行配置

void USART1_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;

NVIC_Config(); //中断的配置

/开启DMA时钟/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/设置DMA源:串口数据寄存器地址//到哪里去/
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;

/内存地址(要传输的变量的指针)/这里一般的话都是变量
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;

/方向“从内存到外设”/ (当外设作为地址的时候)
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

/传输的大小/
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;

/外设地址不增/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

/内存地址自增/(因为有5000个字节所以每次发完一个就指向下一个)
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

/外设的数据单元/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

/内存的数据单元/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

/传输模式:这是支循环一次(不断循环)*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
// DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

/优先级为中/
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;

/禁止内存到内存传输*/
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

/根据上面配置DMA的4通道/
DMA_Init(DMA1_Channel4, &DMA_InitStructure);

/使能DMA/
DMA_Cmd (DMA1_Channel4,ENABLE);
/配置DMA传输完毕产生中断/
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); 
}

看到这DMA的配置图就知道,先给配置时钟信号(可以在时钟树图上看到DMA是接着AHB上到的)

首先看到的是DMA_PeripheralBaseAddr = USART1_DR_Base

这是MDA源,也就是外设的基地址,对于USART1_DR_Base,我们能看到这是

#define USART1_DR_Base  0x40013804 // 0x40013800 + 0x04 = 0x40013804

也就是这是DR寄存器的基地址=USART1的地址+偏移量

下图是部分基地址

然后看下DR寄存器

可以看到偏移量为0x04

还有一点注意的就是内存到内存的传输,不能和循环检测一起使用。

DMA的认识的更多相关文章

  1. STM32基于HAL库通过DMA读写SDIO

    通过STM32CUBEMX生成DMA读写sdio的工程,再读写过程中总会卡死在DMA中断等待读写完成的while中,最终发现while等待的标志在SDIO的中断里置位的,而SDIO中断优先级如果小于或 ...

  2. z-stack协议uart分析(DMA)

    1.从ZMain里面的main函数开始分析 2.进入int main( void ); HalDriverInit();   //硬件相关初始化,有DMA初始化和UART初始化 3.进入HalDriv ...

  3. STM32之DMA+ADC

    借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不 ...

  4. STM32F103之DMA

    一.背景: 需要使用STM32的DAC,例程代码中用了DMA,对DMA之前没有实际操作过,也很早就想知道DMA到底是什么,因此,看了一下午手册,代码和网上的资料,便有了此篇文章,做个记录. 二.正文: ...

  5. ASM:《X86汇编语言-从实模式到保护模式》越计卷:实模式下对DMA和Sound Blaster声卡的控制

    说实话越计卷作者用了16页(我还是删过的),来讲怎么控制声卡,其实真正归纳起来就那么几点. ★PART1:直接存储访问 1. 总线控制设备(bus master) 在硬件技术不发达的早期,处理器是最重 ...

  6. 【SPI】Polling Interrupt DMA

    三種將資料在I/O間傳送的方法有 1. Polling2. Interrupt-driven I/O3. DMA(Direct Memory Access) Polling:最簡單的方式讓I/O de ...

  7. 关于DMA和它的仇家

    [基础知识]什么叫做DMA?DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输.[/基础知识]不太明白?我举个简单的例 ...

  8. STM32——DMA接收和发送的实现

    最近写程序,需要一段一段数据的接收,再通过其他串口发送出去. 老司机们建议用DMA通信,以节约CPU资源.然后,我听了,发现挺好用的.特此,把自己写的代码贴上了. DMA发送接收的步骤如下: 1.初始 ...

  9. include/asm/dma.h

    /* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root Exp root $ * linux/include/asm/dma.h: Defines for using ...

  10. DMA控制器

    DMA控制器依赖于平台硬件,这里只对i386的8237 DMA控制器做简单的说明,它有两个控制器,8个通道,具体说明如下: 控制器1: 通道0-3,字节操作, 端口为 00-1F 控制器2: 通道 4 ...

随机推荐

  1. R语言封装函数

    R语言封装函数 原帖见豆瓣:https://www.douban.com/note/279077707/ 一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分. 1. 函数名称,即要 ...

  2. 利用C51单片机模拟SPI进行双机通信

    SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...

  3. javaweb各种框架组合案例(八):springboot+mybatis-plus+restful

    一.介绍 1. springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之 ...

  4. handy源码阅读(三):SafeQueue类

    SafeQueue类继承与信号量mutex(用于加锁),nonocopyable 定义如下: template <typename T> struct SafeQueue : privat ...

  5. [USACO16JAN]愤怒的奶牛Angry Cows (单调队列优化dp)

    题目链接 Solution 应该可以用二分拿部分分,时间 \(O(n^2logn)\) . 然后可以考虑 \(n^2\) \(dp\) ,令 \(f_i\) 代表 \(i\) 点被激活,然后激活 \( ...

  6. 【CF1243A】Maximum Square【贪心】

    题意:给你n个长度为ai的木板,求最大能拼成的矩形为多大 题解:显然贪心每次选最大的进去拼,那么剧需要枚举矩形长度x,看最长的k个能够拼出长度为x的矩形即可 #include<iostream& ...

  7. 人脸对比微信小程序

    https://cloud.tencent.com/document/product/867/17584 测试数据: 图片1: 图片2:

  8. (转)Window 中杀死指定端口 cmd 命令行 taskkill

    Windows平台   两步方法 :  1 查询端口占用,2 强行杀死进程 netstat -aon|findstr "8080" taskkill /pid 4136-t -f ...

  9. IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数

    总结自谢希仁老师的<计算机网络>第五版 每一类网络地址都由两部分组成:网络号net-id+主机号host-id.IP地址的分类可以参看下图: 可以看到各个类别的区别,同时,所有的类别都是3 ...

  10. win7系统开机启动出现蓝屏,提示BAD_SYSTEM_CONFIG_INFO

    因为我在msconfig->引导->高级选项中将最大内存勾选,最大内存勾选后是4096MB,但是在点击确定按钮后,会自动变成0MB(点击确定按钮后再点击高级选项),导致系统无法识别内存,开 ...