任何一个技术的出现都是为了解决当时出现的问题,任何一个技术既有优点也会有缺点,任何一个技术的适用都需要分场景,看条件。DMA也不例外。
1 直接存储器存取DMA(Direct Memory Access)
DMA处于总线矩阵的前级,与内核cortex-M3同级别,属于主设备(Master)。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
2 DMA工作过程
手册描述:
以上的官方描述信息量较大:
1) DMA会暂停系统总线若干个周期。意思是DMA工作时,CPU被挂起?
2) 然后总线仲裁器又执行循环调度。如何调度保证CPU可执行?
分析:
DMA在进行外设1与内存之间的数据传输时,CPU依然可以通过总线矩阵访问外设工作,只不过无法访问外设1,这可以理解(被DMA占用)。那CPU是否也无法访问内存呢?答案是可以访问内存,有以下三种方式(wiki解释):
主要意思:
1)突发传输,停止CPU访问内存:由DMA控制器发一个停止信号给CPU,要求CPU放弃对连接内存的数据总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传输,知道传输完成后发送完成信息中断,通知CPU。
优点:控制简单,它适用于数据传输率很高的设备进行传输。
缺点:在DMA控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。
2)周期挪用:当外设I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个内存周期。
与停止CPU访内的DMA方法比较,该方法既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。
3)透明传输模式
DMA与CPU相互配合,交替执行,时分复用。这种DMA传送对CPU来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂。
3 适用场景
DMA方式主要适用于一些高速的外设I/O设备。这些设备传输字节或字的速度非常快。对于这类高速I/O设备,如果用输入输出指令或采用中断的方法来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而DMA方式能使I/O设备直接和存储器进行成批数据的快速传送。
但是,使用DMA也是有缺点的:它势必会影响到CPU访问内存的速度(CPU与DMA时分复用数据总线),影响其他功能的执行速度。
对于数据量较小的传输来说,更没必要使用DMA,毕竟DMA每一次传输完成后也会引发CPU中断,而直接使用CPU中断,也是一次中断。只不过在中断向量表中的位置不同而已。
4 寄存器配置
配置通道,传输地址,字节数,方式等。具体可参考手册。
参考资料:
STM32F103C8T6参考手册
关键字:STM32 DMA 直接存储器存取
引用地址:
【STM32】STM32之深入理解DMA
推荐阅读最新更新时间:2024-11-24 22:10
STM32 代码中类型修饰符 volatile 的作用
今天还在做 STM32 DAC Function generator 唉~ 毕竟单片机的机能有限,做函数发生器略显吃力,不过STM32自带DAC能实现 100KHz 40样点正弦信号 确实已经相当强悍了。DAC 使用DMA + 定时器触发转换。 而今天的问题在于 做这个Function generator时编写的一套简单串口终端界面出现了一个令我百思不得其解小BUG..... 输入部分: USART2_Puts(star ); USART2_Puts( Enter Frequency: ); while(Uart2_Get_Data!=0x0d&&nde 6) { if(Uart2_Get_Flag) {
[单片机]
基于STM32的数字PDA系统软件系统设计
数字PDA系统整体由硬件电路和软件系统2部分组成,硬件电路由低功耗ARM微控制器STM32ZET6控制的PDA外围电路组成,软件系统则由硬件驱动程序、μC/OS-Ⅱ实时操作系统、FATFS文件系统、GUI等部分组成。数字PDA系统将整个软件系统进行了整合,提供一种基于页的机制方法,即每页都是一个线程,利用μC/OS-Ⅱ的信号量、邮箱机制实现多线程之间的任务切换。PDA系统采用页机制的设计,旨在减少增加应用程序时代码的修改量和提高整个PDA软件系统的稳定性,以及提高应用程序的开发速度。 以Cortex-M3为内核的处理器由于其低功耗以及低成本并且是32位处理器,越来越多的研究人员已经从51处理器、AVR等处理器开始转移到这个领域
[单片机]
彻底搞清printf在STM32上的使用
重定向printf ARMCC版本(keil MDK) 下面这段代码,在实现串口发送一个字节的函数后,可以在勾不勾选”微库“的情况下都可以正常使用printf函数。__MICROLIB是勾选微库后会被定义的宏,因而可以通过条件编译的方式兼容。 对应文件要包含 stdio.h 头文件,否则会提示FILE无定义。 #if !defined(__MICROLIB) #pragma import(__use_no_semihosting) void _sys_exit(int x) //避免使用半主机模式 { x = x; } struct __FILE { int handle; }; FILE __stdout; #endif
[单片机]
STM32-初学者必知
STM32的核心Cortex-M3处理器是一个标准化的微控制器结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CPU,并行总线结构,嵌套中断向量控制单元,调试系统以及标准的存储映射。 嵌套中断向量控制器(Nested Vector Interrupt Controller,简称NVIC)是Cortex-M3处理器中一个比较关键的组件,它为基于Cortex-M3的微控制器提供了标准的中断架构和优秀的中断响应能力,为超过240个中断源提供专门的中断入口,而且可以赋予每个中断源单独的优先级。利用NVIC从可以达到极快的中断响应速度,从收到中断请求到执行中断服务的第一条指令仅需12个周期。这种极快的响应速度一方面得
[单片机]
【STM32】SysTick滴答定时器(delay延时函数讲解)
STM32F1xx官方资料: 《Cortex-M3权威指南-中文》-第8章最后一个小节:Systick定时器 SysTick定时器 Systick定时器,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使
[单片机]
stm32专题二十五:实现基本定时器定时
利用基本定时器定时过程: 1 开启基本定时器的时钟; 2 定义时基初始化结构体,然后只需要配置分频系数PSC和重装载计数值ARR,其他结构体成员不用管; 3 开启定时器中断,这里要选择为定时器更新中断; 4 使能定时器。 接下来是配置过程,非常简单。 bsp_BasicTim.c #include bsp_BasicTim.h // 中断优先级配置 static void BASIC_TIM_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGrou
[单片机]
STM32:ADC采集数据实例(采用DMA模式)
SOC:STM32F103RCT6 软件平台:STM官方库V3.5.0 开发工具:Keil 1. 摘要 本文章将给出STM32F103RCT6控制AT24C02的代码。如有疑问和错误,欢迎留言告之。 2.硬件连接 AT24C02使用I2C进行数据访问,板子上使用STM32的I2C控制器2和AT24C02进行连接。 具体来说,PB10作为SCL和AT24C02相连,PB11作为SDL和AT24C02相连。 这里就不给出硬件连接图了,比较简单。 3. AT24C022C访问代码(轮询) I2C这里使用轮询方法,不是中断,请留意。 首先,给出I2C控制器的初始化代码,和读写代码,一共三个函数,对应三个功能。 注意
[单片机]
STM32小笔记(一) GPIO口的配置
GPIO口的使用: 1.GPIO和AFIO 全系列支持 GPIO寄存器 (1)两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH); (2)两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR); (3)一个32位置为/复位寄存器(GPIOx_BSRR); (4)一个16位复位寄存器(GPIOx_BRR); (5)一个32位锁存器(GPIOx_LCKR); 输入配置 当I/O端口配置为输入时: ● 输出缓冲器被禁止 ● 施密特触发输入被激活 ● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 ● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 ● 对输入数据寄
[单片机]