STM32 F407VG (二)DMA

根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M4核的模块;主要功能是通信“桥梁”的作用,可以将所有外设寄存器和内存空间“连接”起来,这样就可以高速问各寄存器,其传输不受CPU的支配,其间的通讯不占CPU资源,访问速度高,传输还是双向的(双AHB主总线结构);它可以将外设寄存器中的数据与储存器中变量建立绑定,还可以将一外设的寄存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯。

1.DMA初始化

DMA_Init(DMAx_Streamy, &DMA_InitStructure);

F407有2个DMA控制器每个有8个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。

如果ADC1要使用DMA,通过查询以上表格可知道 ADC1 占用DMA2的数据流0,外设通过0通道进行请求,DMA_InitStructure是初始化用到的数据结构体:

1)通道选择,选择DMA2的stream0的零通道

DMA_Init(DMA2_Stream0, &DMA_InitStructure);

DMA_InitStructure.DMA_Channel = DMA_Channel_0;

2)确定通道两头的地址(位置)

//要提前声明内存中存储位置如:  uint16_t ADC_RCVTab[16] ;

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;  //DMA外设ADC基地址

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_RCVTab;//DMA内存基地址

//两头的地址是否是增加的。

//对于外设来说就是ADC1的地址,不增加。

DMA_InitStructure.DMA_PeripheralInc
= DMA_PeripheralInc_Disable;

//对于内存来说,地址是增加的,是用来存储16个通道的数组。

DMA_InitStructure.DMA_MemoryInc
= DMA_MemoryInc_Enable;

3) 通道建完后,要规定通道通信的软协议

a)通信方向

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

b)通道两头收发数据的基本单位

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

c)通信完成一次要传输的基本单位的数量。

由于AHB编程接口只支持32位访问所以虽然访问16个AD通道,每通道为12位,但是在访问的时候还是按每通道32位进行读取,所以 每次传输 16个通道*32位/传输单位(16位)=32

DMA_InitStructure.DMA_BufferSize = 32;

d) 通信的工作模式(此处为循环通信)

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

e)通信优先级

可以分为4级:VeryHigh,High,Medium,Low.

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

f)是否制定stream fifo模式或直接模式

//这里是直接模式

DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

//FIFO的阀值水平

DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

g)在一个单一的非可中断期内传输的数据数量(只有地址增量模式才有效)

DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

3)调用DMA初始化函数

DMA_Init(DMA2_Stream0, &DMA_InitStructure);

4)DMA使能

/* DMA2_Stream0 enable */

DMA_Cmd(DMA2_Stream0, ENABLE);

2.以上是DMA的配置,那么怎样在外设中使用DMA呢?

这个后面ADC部分会讲到,先提一下。

/* Enable ADC1 DMA */

ADC_DMACmd(ADC1, ENABLE);

简单吧?只要上路了就简单了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 10:20:34

STM32 F407VG (二)DMA的相关文章

STM32 F4 ADC DMA Temperature Sensor

STM32 F4 ADC DMA Temperature Sensor Goal: detecting temperature variations using a temperature sensor, ADC with DMA and TIM3 as a trigger (ADC sampling frequency = TIM3 trigger frequency). Note: Using TIM3 as a trigger is suited for monitoring temper

STM32 F4 DAC DMA Waveform Generator

STM32 F4 DAC DMA Waveform Generator Goal: generating an arbitrary periodic waveform using a DAC with DMA and TIM6 as a trigger. Agenda: Modeling a waveform in MATLAB and getting the waveform data Studying the DAC, DMA, and TIM6 to see how it can be u

STM32开发指南-DMA

DMA,直接存储器访问.传输数据时,外设通过DMA控制器直接访问内存,不经过cpu直接控制传输数据.不需要像中断处理方式需要保留和恢复现场的过程.通过硬件为内存和I/O设备开辟一条直接传送数据的通道,提高CPU的效率. DMA的核心硬件是DMA控制器,来管理DMA方式的数据传送,一般包含多个通道,每个通道专门用来管理来自于一个或多个外设对存储器的访问请求.另外还有一个仲裁来协调各个DMA请求的优先权. DMA的支持的一些特性: 存储器和存储器间的传输 外设和存储器,存储器和外设的传输 ... D

STM32的串口DMA收发以及双缓冲区的实现

在使用STM32的UART的DMA功能总结如下: 首先上代码,这里采用STM32 的USART1作为Demo,RX的DMA为DMA1_Channel5,TX的DMA为DMA1_Channel4.初始化如下,红色的标记需要注意: RX-DMA初始化 1 // DMA Rx 2 USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); 3 DMA_Cmd(DMA1_Channel5,DISABLE); 4 DMA_InitStruct.DMA_PeripheralBa

关于Stm32定时器+ADC+DMA进行AD采样的实现

Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间! 2.把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存.但是这样做的话还得加一个定时中断,用来定时读取内存中的数据! 3.使用ADC的定时器触发ADC转换的功能,

STM32 DMA简述

STM32 DMA简述 DMA (Direct Memory Access) 直接内存存储器,在做数据传输时能够大大减轻CPU的负担. DMA的作用 DMA提供了一个关于数据的高数传输通道,这个通道不占用CPU的资源.换句话说,通过DMA通道,你在传输大规模数据的时候CPU同时也能够去干其他事. 你可以控制DMA通道的接入口,灵活配置传输的数据源和目的地.以下几个是常用的DMA传输路径: 从外设到内存 从内存A区域传到内存B区域 从一个外设传输到另一个外设 从内存传输数据到外设 .... DMA

stm32+lwip(一):使用STM32CubeMX生成项目

系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32+lwip(四):网页服务器测试 stm32+lwip(五):以太网帧发送测试 STM32CubeMX是一个图形化的配置工具,根据用户配置可以生成相应的代码,可以帮助开发人员摆脱部分底层开发的烦恼. 一.工程配置 本项目使用stm32407开发板,phy芯片为LAN8720A,硬件原理图如下: 根据原理图,STM32CubeMX配置

ADC

  stm32f207,  引脚对应的模拟通道: PA0 IN0, PA1 PA2 PA3 PA4 PA5 PA6 PA7 IN PB0 IN8 PB1 IN9 PC0 IN10 PC1 PC2 PC3  PC4 IN14 PC5 IN15  ADC采样转换时间 ADC转换就是输入模拟的信号量,单片机转换成数字量.读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期.采样周期一般来说=转换时间+读取时间.而转换时间=采样时间+12.5个时钟周期.采样时间是你通过寄存器告诉stm32采样模拟

ucodii-2(选做)

任务要求 阅读附件中的代码,回答: ucos是如何分层的? HAL都有哪些代码? 分析任务是如何切换的? 1. ucos是如何分层的? 分为四层: 硬件相关层 该层中,要尽量所有硬件相关都囊括在其中.不管是GPIO还是定时器,或串行接口.这其中有三个最为重要的接口Open.Close.Ctrl. Open主要来完成对应硬件初始化,形参中包括了一些初始化的相关参数. Close失能硬件. Ctrl来实现一些控制的修改如优先级.中断回调函数等等,硬件不同,内容不同. 驱动接口层 该层会用到一个或多个