历史上的今天
返回首页

历史上的今天

今天是:2025年02月17日(星期一)

正在发生

2020年02月17日 | 一文了解stm32使用DMA模块的相关操作

2020-02-17 来源:elecfans

DMA(Direct Memory Access)常译为“存储器直接存取”。早在Intel的8086平台上就有了DMA应用了。


一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。这样的数据搬运工作将使CPU的负荷显得相当繁重。


严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CPU还需要负责复杂的中断申请和响应,以保证芯片的实时性能。


数据搬运这一工作占用了大部分的CPU资源,成为了降低CPU的工作效率的主要原因之一。于是需要一种硬件结构分担CPU这一职能—— DMA。


从数据搬运的角度看,如果要把存储地址A的数值赋给另外一个地址上B的变量,CPU实现过程为首先读出A地址上的数据存储在一个中间变量,然后再转送到B地址的变量上。使用DMA则不需要中间变量,直接将A地址的数值传送到B地址的变量里。无疑减轻了CPU的负担,也提高了数据搬运的效率。


stm32中 DMA1有7个通道,DMA2有5个通道。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。

stm32使用DMA的相关操作:

1、DMA的配置

void DMA_Configuration(void){ DMA_InitTypeDefDMA_InitStructure; //DMA设置: //设置DMA源:内存地址&串口数据寄存器地址 //方向:内存-->外设 //每次传输位:8bit //传输大小DMA_BufferSize=SENDBUFF_SIZE //地址自增模式:外设地址不增,内存地址自增1 //DMA模式:一次传输,非循环 //优先级:中 DMA_DeInit(DMA1_Channel4);//串口1的DMA传输通道是通道4 DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为DMA的目的端 DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//传输大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增1 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

//DMA_Mode_Normal(只传送一次), DMA_Mode_Circular(不停地传送) DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//(DMA传送优先级为中等) DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure);}

注:

1、传输通道:

通过查表,串口1的发送对应的是DMA的通道4,所以此处选择通道4.

2、DMA传输方式:

(1)DMA_Mode_Normal,正常模式,当一次DMA数据传输完后,停止DMA传送,对于上例而言,就是DMA_PeripheralDataSize_Byte个字节的传送完成后,就停止传送。

(2) DMA_Mode_Circular

循环模式,当传输完一次后,重新接着传送,永不停息。

2、外设的DMA方式设置

将串口1设置成DMA模式:

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

3、待传输数据的定义和初始化#define SENDBUFF_SIZE 10240vu8 SendBuff[SENDBUFF_SIZE];

for(i=0;i

4、开始DMA传输(使能对应的DMA通道) DMA_Cmd(DMA1_Channel4, ENABLE);

5、DMA传输的完成while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET) { LED_1_REV; //LED翻转 Delay(); //浪费时间 }

当传输完成后,就会跳出上面的死循环。

推荐阅读

史海拾趣

HEC Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

GainSpan ( Telit)公司的发展小趣事

风华高科自成立以来,一直注重技术创新和产品多元化发展。公司不断投入研发资源,成功开发出多种新型电子元器件和电子材料,如片式电阻器、片式电感器、超小型铝电解电容器等。这些产品广泛应用于通讯、消费、计算机、汽车电子等领域,满足了市场多样化的需求。同时,公司还建立了完善的质量管理体系,确保产品质量符合国际标准。

博流(Bouffalo Lab)公司的发展小趣事

随着公司的发展壮大,博流积极寻求与全球知名企业的合作机会。其中,与谷歌的合作尤为引人注目。作为Google Matter EAP合作伙伴,博流与谷歌共同推动Matter协议在智能家居生态系统中的应用,为用户提供更加便捷、智能的家居体验。此外,博流还与多家产业链上下游企业建立了紧密的合作关系,共同推动物联网产业的发展。

永丰盈(CST)公司的发展小趣事

随着市场的不断发展,CST意识到技术创新是企业持续发展的关键。因此,公司加大了对技术研发的投入,引进了一批高素质的研发人才,建立了先进的研发实验室。经过不懈努力,CST在电子接插件领域取得了多项技术突破,产品性能得到了显著提升,进一步巩固了其在市场中的领先地位。

FREESCALE (NXP)公司的发展小趣事

深圳市永丰盈电子有限公司(CST)成立于2003年,初始阶段,公司只有几名员工和几台设备,专注于电子接插件产品的生产与销售。在创始人坚定的信念和团队不懈的努力下,CST逐步在市场上崭露头角。公司秉持“诚信、踏实、齐心、努力”的经营理念,通过严格的质量控制和持续的技术创新,赢得了客户的信任。

全志(Allwinner)公司的发展小趣事

全志科技在早期以电源管理IC AXP系列和多媒体解码F系列芯片为核心技术,成功挖掘了第一桶金。特别是在播放器等中小企业需求市场中,全志的产品获得了广泛认可。这种对市场需求的敏锐洞察和扎实的技术研发能力,使得全志在激烈的市场竞争中脱颖而出。

问答坊 | AI 解惑

电磁兼容中的接地技术

摘要:讨论了电磁兼容中的接地技术,包括接地的种类和目的、接地方式、接地电阻的计算以及设备和系统的接地等。其主要目的在于提高电力电子设备的电磁兼容能力。 接地技术最早是应用在强电系统(电力系统、输变电设备、电气设备)中,为了设备和人 ...…

查看全部问答>

关于锁相环问题

请问各位大侠,什么产品会用到锁相环电路的设计呢?哪一种产品对这项技术的要求比较高呢?…

查看全部问答>

id3v2

有谁对id3v2比较了解的,我现在想知道如何提取一首mp3歌曲文件的封面图片的信息,然后再把图片完整的显示在屏上!…

查看全部问答>

AM29LV800_Init()的问题

在2410的eboot中AM29LV800_Init()是做什么用的?哪里来的这块FLASH?nand 或 nor?…

查看全部问答>

驱动开发

如何向一个寄存器的某一位写值呢? 我在开发一个led的驱动,用2440的cpu,将这个led接在一个gpio口上,用寄存器的某一位控制led的关灭,但是没成功,希望哪位大侠能给我提点建议,小弟万分感谢!…

查看全部问答>

有一张图我想把它变成uc/gui中所支持的数据

用的RTT + uc/GUI 图片的格式要求如下 GUI_CONST_STORAGE GUI_BITMAP picture = { 128, /* XSize */ 128, /* YSize */ 256, /* BytesPerLine */ 16, /* BitsPerPixel */ (unsigned char *)acItem_test, /* Pointer to picture data */ ...…

查看全部问答>

来看看TI M4的高价评估板!!

EKC-LM4F232 - EKC-LM4F232 Evaluation Kit with CodeSourcery Tools价格还是很不给力的,$149.00 有感兴趣的朋友请关注TI官网 http://www.ti.com/tool/ek-lm4f232?DCMP=cortexm4f&HQS=ek-lm4f232…

查看全部问答>

关于干扰信号的问题

本人学了一段时间的51单片机,现在想自己制作一个可以干扰信号的东西,譬如说干扰移动信号,只是不知道该怎么做,有没有哪位懂的,给我点指示就可以,~~!~!~!~!!!…

查看全部问答>

stm32定时器中断问题

本帖最后由 Bolten 于 2014-10-22 09:55 编辑 我用串口调试程序,想做精准1sLED亮灭,可以进串口中断,进不去定时器中断,急求!!!各位大师求指点 void BSP_Init (void) {                ...…

查看全部问答>