STM32中DMA的使用入门

发布者:数字火花最新更新时间:2021-08-05 来源: eefocus关键字:STM32  DMA  使用入门 手机看文章 扫描二维码
随时随地手机看文章

今天刚看了一个ADC采集的程序,和之前用其他单片机写的程序还是有比较大的差别,这个差别主要就在DMA。这里面总结一下,有一部分是转载别人的。

 

什么是STM32的DMA?其全称是:Direct Memory Access;根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M3内核的模块,有点类似与ADC、PWM、TIMER等模块;主要功能是通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速问各寄存器,其传输不受CPU的支配,传输还是双向的;例如,从“表面”上看,它可以将flash中的数据与储存器中变量建立通讯,还可以将一外设的积存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯,有点像把外设硬件之间用“导线”连接在一起了。其间的通讯不占CPU资源,访问速度高,对于实时性强的应用将是一个很好的选择;当然,对于实时性非常强的,建议还是采用专用的DSP芯片


怎样启用DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对模块初始化,还要先了解该模块相应的结构及其函数,以便正确的设置;由于DMA较为复杂,我就只谈谈DMA的基本结构和和常用函数,这些都是ST公司提供在库函数中的。


1、下面代码是一个标准DMA设置,当然实际应用中可根据实际情况进行裁减:

 

DMA_DeInit(DMA_Channel1);


上面这句是给DMA配置通道,根据ST提供的资料,STM3210Fx中DMA包含7个通道(CH1~CH7),这里需要选择一个传输通道

 

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;


上面语句中的DMA_InitStructure是一个DMA结构体,在库中有声明了,当然使用时就要先定义了;DMA_PeripheralBaseAddr是该结构体中一个数据成员,给DMA一个起始地址,好比是一个buffer起始地址,数据流程是:外设寄存器à DMA_PeripheralBaseAddàmemory中变量空间(或flash中数据空间等),ADC1_DR_Address是ADC1的地址,既然是桥梁,肯定要连接两个端点,这里需要明白所需要连接的外设的地址;

 

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;


上面这句很显然是DMA要连接在Memory中变量的地址,ADC_ConvertedValue是我自己在memory中定义的一个变量;

 

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;


上面的这句是设置DMA的传输方向,就如前面我所说的,DMA可以双向传输,也可以单向传输,这里设置的是单向传输,如果需要双向传输:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。

 

DMA_InitStructure.DMA_BufferSize = 2;


上面的这句是设置DMA在传输时缓冲区的长度,前面有定义过了buffer的起始地址:ADC1_DR_Address ,为了安全性和可靠性,一般需要给buffer定义一个储存片区,这个参数的单位有三种类型:Byte、HalfWord、word,我设置的2个half-word(见下面的设置);32位的MCU中1个half-word占16 bits。

 

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;


上面的这句是设置DMA的外设递增模式,如果DMA选用的通道(CHx)有多个外设连接,需要使用外设递增模式:DMA_PeripheralInc_Enable;我的例子里DMA只与ADC1建立了联系,所以选用DMA_PeripheralInc_Disable

 

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;


上面的这句是设置DMA的内存递增模式,DMA访问多个内存参数时,需要使用DMA_MemoryInc_Enable,当DMA只访问一个内存参数时,可设置成:DMA_MemoryInc_Disable。

 

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;


上面的这句是设置DMA在访问时每次操作的数据长度。有三种数据长度类型,前面已经讲过了,这里不在叙述。

 

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

与上面雷同。在此不再说明。

 

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;


上面的这句是设置DMA的传输模式:连续不断的循环模式,若只想访问一次后就不要访问了(或按指令操作来反问,也就是想要它访问的时候就访问,不要它访问的时候就停止),可以设置成通用模式:DMA_Mode_Normal

 

DMA_InitStructure.DMA_Priority = DMA_Priority_High;


上面的这句是设置DMA的优先级别:可以分为4级:VeryHigh,High,Medium,Low.

 

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


上面的这句是设置DMA的2个memory中的变量互相访问的

 

DMA_Init(DMA_Channel1,&DMA_InitStructure);


前面那些都是对DMA结构体成员的设置,在次再统一对DMA整个模块做一次初始化,使得DMA各成员与上面的参数一致。

 

/*DMA Enable*/

DMA_Cmd(DMA_Channel1,ENABLE);

使能此通道。

当然更多的还需要看固件库函数的说明。

 

这里面知识DMA的一个简单应用,后面做很多设计在数据传输上需要做这种转变,特别是像我这样从单片机学过来的,现在里面有了更好的方式要学会去运用,不能固守原来单片机的设计思路。这个相信也是后面学习中很重要的一部分。

关键字:STM32  DMA  使用入门 引用地址:STM32中DMA的使用入门

上一篇:STM32启动过程解析-2.02固件库启动文件分析
下一篇:Keil STM32工程环境搭建

推荐阅读最新更新时间:2024-11-12 11:06

STM32与SD卡通信问题详解
SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。 我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 1)驱动层 驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的
[单片机]
ADIS16203角度传感器的stm32驱动实现要点
一、前言 ADIS16203是一款完整的倾斜角测量系统,采用ADI公司的 iSensor™集成技术制造,全部功能均集成于一个紧凑的封装中。该器件采用嵌入式信号处理解决方案来增强ADI公司的 iMEMS®传感器技术,可提供适当格式的工厂校准、传感器数字倾斜角数据,从而利用串行外设接口(SPI)即可方便地访问数据。通过SPI接口可以访问多个测量结果:360°线性倾斜角、±180°线性倾斜角、温度、电源和一个辅助模拟输入。由于可以轻松访问校准的数字传感器数据,因此开发者能够获得可立即供系统使用的器件,使开发时间、成本和编程风险得以减少。 通过数个内置特性,如单命令失调校准等,以及方便的采样速率控制和带宽控制,该器件很容易适应终端系统
[单片机]
ADIS16203角度传感器的<font color='red'>stm32</font>驱动实现要点
stm32之can总线过滤器研究
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失) CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure
[单片机]
中国移动多媒体广播智能网络监测系统的设计与实现
随着高速总线和射频技术的大量应用,电子电路的设计工作日益复杂。除传统的模拟和数字电路测试外,示波器增加了越来越多的测试能力,以满足测试需求的增长。本届IIC China 2013展会上,罗德与施瓦茨公司(Rohde & Schwarz)带来了其多款优异性能的示波器。此外,在该公司展台上,笔者还看到了该公司最新的无线通信综测仪、矢量网络分析仪、矢量信号发生器及信号和频谱分析仪等测试测量产品。 据罗德与施瓦茨公司技术支持经理付国映介绍,该公司RTO示波器具有极佳的信号保真度、极高的采样率和全球第一个实时数字式触发系统,结构紧凑,属于600MHz至4GHz级别的仪器。这些示波器具有硬件加速的测量与分析功能,以及先进的用户界面,能
[测试测量]
中国移动多媒体广播智能网络监测系统的设计与实现
STM32的FSMC学习手记(一)
FSMC应用简介 FSMC全称 静态存储器控制器 ,STM32可以通过FSMC与SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。 一、FSMC的特点: 1、 FSMC的一大特点是支持不同位宽的异步读写操作。 2、 FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。当FSMC同时使用多个外部存储器时,FSMC会通过总线悬空延时时间参数,来防止访问冲突发生。 3、 支持代码从FSMC扩展的外部存储器中直接运行。不需要首先调入内部SRAM。 二、FSMC的结构组成: 如图所示,FSMC主要分为四部分: 1、 FSMC一端连
[单片机]
<font color='red'>STM32</font>的FSMC学习手记(一)
STM32 APB1和APB2挂接端口
SYSCLK 系统时钟,最大72MHzHCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟经过总线桥AHB-- APB. 通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟不过PCLK2时钟最高可达72MHz. PCLK1对应APB1外设最大36MHz。 PCLK2对应APB2外设最大72MHz。 APB2负责AD,I/O,高级TIM,串口1。 APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB1Periph_USART2,ENABLE); RCC_AP
[单片机]
STM32 SDIO详解
1、SDIO简介 SDIO,全称:Secure Digital Input and Output,即安全数字输入输出接口。它是在SD卡接口的基础上发展而来,它可以兼容之前的SD卡,并可以连接SDIO接口设备,比如:蓝牙、WIFI、照相机等。 SDIO和SD卡规范间的一个重要区别是增加了低速标准。低速卡的目标应用是以最小的硬件开支支持低速I/O能力。低速卡支持类似调制解调器、条码扫描仪和GPS接收器等应用。 STM32的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SDI/O卡和CE-ATA设备。 SDIO框图 复位后SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置) 如果一个多媒体卡
[单片机]
<font color='red'>STM32</font> SDIO详解
STM32 Systick分析
前言:目前我觉得自己还没有能够深入用到这个SysTick的时候,只是要用到了delay_us()和delay_ms(),因为碰到了这个问题,所以想着提前了解一下,免得后来造成一脸懵逼的情况;毕竟没有社会经验的高手指点迷津,这里学习还是系统一点好; systick是个啥? 是一个24位倒记数定时器; systick的功能是什么 为操作系统提供硬件上的定时中断(滴答中断); 保证系统运行的时候不会让一个任务而占用整个系统; 可以制作精准的定时功能; …… systick定时器的特点 可以工作在芯片睡眠状态下 此定时器被捆绑在NVIC(中断向量控制器)中,可以用于产生异常和中断; …… 编程涉及到的寄存器 SysTick_C
[单片机]
<font color='red'>STM32</font> Systick分析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved