stm32DMA控制器的介绍

合集下载

stm32DMA控制器的介绍

stm32DMA控制器的介绍

stm32DMA控制器的介绍STM32DMA控制器是STMicroelectronics公司的一种高性能DMA控制器,可以实现STM32微控制器与外设之间高速数据传输,解放了CPU,提高了系统性能。

本文将对STM32DMA控制器进行详细介绍,包括其特点、架构、应用场景等方面。

一、STM32DMA控制器的特点1、高性能:STM32DMA控制器采用了先进的DMA技术,能够实现高速数据传输,最高可达168MB/s,大大提高了系统效率。

2、灵活性强:STM32DMA控制器支持多种传输模式,包括单次传输、循环传输、内存到内存传输等,可以根据具体应用需求进行配置。

3、资源占用少:STM32DMA控制器采用硬件协同和DMA方式进行数据传输,无需CPU 介入,从而释放了CPU的负担,使得整个系统更加稳定,资源占用也更少。

4、易于使用:STM32DMA控制器结构简单、使用方便,具有完善的应用开发文档和现成的库函数,可以降低应用开发门槛。

STM32DMA控制器是一种独立的DMA控制器,可以直接操控系统内存和外设,实现高速数据传输。

其主要由以下部分组成:1、DMA控制器:DMA控制器包括一组寄存器和状态位,用于统一管理DMA传输过程中的各种情况和参数配置。

2、DMA通道:每个DMA通道都有独立的DMA控制器和DMA寄存器,通过DMA通道可以独立地进行数据传输。

3、DMA请求源:DMA请求源是要进行数据传输的外设或者内存地址。

4、中断管理器:DMA控制器的中断管理器可以在DMA传输完成时触发中断,通知CPU 完成对DMA传输的处理。

STM32DMA控制器广泛应用于各种需要高速数据传输的应用场合,例如:1、音视频传输:通过STM32DMA控制器,可以实现音视频数据传输,例如摄像头采集图像数据,通过DMA传输到内存,再进行图像处理;或者从音频解码器中读取音频数据,通过DMA传输到音频输出设备播放。

2、实时控制:通过STM32DMA控制器,可以实现实时控制应用,例如采集温度或者电压数据,通过DMA传输到内存,再进行处理和控制。

STM32多通道ADC采集详解(DMA模式和非DMA模式)

STM32多通道ADC采集详解(DMA模式和非DMA模式)

STM32多通道ADC采集详解(DMA模式和非DMA模式)在非DMA模式下,ADC采集的数据是通过CPU直接读取的,采集效率相对较低,但是编程相对简单。

首先,需要初始化ADC模块的工作模式(单通道、多通道等)和采样时间。

然后,使能ADC模块,并配置所需的通道和采样时间。

接着,设置采样序列,指定要采集的通道和相应的排列顺序。

在采集数据时,首先需要设置ADC转换模式和采样时间,然后开始转换,并等待转换完成。

转换完成后,通过读取ADC_DR寄存器可以获取转换结果。

如果需要采集多个通道的数据,可以通过设置ADCSQR中的SQx位来启动下一次转换。

在DMA模式下,ADC采集的数据是通过DMA控制器传输到指定的内存区域,采集效率较高,适合数据量较大的应用场景。

与非DMA模式相比,DMA模式下的配置需要额外设置DMA控制器的工作模式(单次传输、循环传输等)和传输数据的目的地地址。

在采集数据前,需要设置DMA传输的目的地地址,并使能DMA传输。

在开启ADC转换后,DMA控制器会根据设置的目的地地址来自动传输数据,无需CPU干预。

采集完成后,CPU可以通过检查DMA传输完成标志位来判断数据是否已传输完毕。

总结:
使用非DMA模式的ADC采集相对简单而容易上手,适用于数据量较小且对实时性要求不高的应用场景。

DMA模式下的ADC采集效率更高,适用于数据量较大且对实时性要求较高的应用场景。

无论是DMA模式还是非DMA模式,都需要根据具体的应用需求来选择合适的模式。

在使用DMA模式时,还需要注意合理设置DMA传输的目的地地址和传输模式,以充分发挥DMA的优势。

STM32SPIDMA的使用

STM32SPIDMA的使用

STM32SPIDMA的使⽤ ⼀是想总结⼀下SPI总线的特点与注意点,⼆是总结⼀下SPI DMA的使⽤⼀、SPI信号线说明 通常SPI通过4个引脚与外部器件相连:MISO:主设备输⼊/从设备输出引脚。

该引脚在从模式下发送数据,在主模式下接收数据。

MOSI:主设备输出/从设备输⼊引脚。

该引脚在主模式下发送数据,在从模式下接收数据。

SCK:串⼝时钟,作为主设备的输出,从设备的输⼊NSS:从设备选择。

这是⼀个可选的引脚,⽤来选择主/从设备。

它的功能是⽤来作为“⽚选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。

⼆、原理 MOSI脚相互连接,MISO脚相互连接。

这样,数据在主和从之间串⾏地传输(MSB位在前)。

通信总是由主设备发起。

主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。

这意味全双⼯通信的数据输出和数据输⼊是⽤同⼀个时钟信号同步的;时钟信号由主设备通过SCK脚提供。

三、NSS说明与注意点 NSS分为内部引脚和外部引脚。

NSS外部引脚可以作为输⼊信号或者输出信号,输⼊信号⼀般⽤作硬件⽅式从机的⽚选,⽽输出信号⼀般⽤于主SPI去⽚选与之相连的从SPI。

NSS从设备选择有两种模式:1、软件模式 可以通过设置SPI_CR1寄存器的SSM位来使能这种模式,当它为1时,NSS引脚上的电平由SSI决定。

在这种模式下NSS外部引脚可以⽤作它⽤,⽽内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动。

 2、硬件模式两种⽅式:(1)对于主SPI,NSS可以直接接⾼电平,对于从SPI,可以直接接低电平。

(2)当STM32F10xxx⼯作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时主机的NSS讲作为输出信号,引脚信号被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将⾃动变成从SPI设备。

此时两个的NSS信号线可以接个上拉电阻直连。

STM32F10xDMA寄存器总结

STM32F10xDMA寄存器总结
如DMA2_FLAG_GL1& FLAG_Mask= ((uint32_t)0x10000001) &((uint32_t)0x10000000)
= ((uint32_t)0x10000000)!=0 说明是DMA2的DMAy_FLAG。
//将DMAy的中断状态寄存器与DMAy_FLAG相与,如果为0则说明相应位为0,
//将DMA_InitStruct中的参数“或”到CCR寄存器
//将DMA_InitStruct中的参数写入CNDTR寄存器、CPAR寄存器、CMAR寄存器
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct)
//DMA_InitStruct填写默认值,可以快速初始化此结构体
//DMA中断配置
//检查入口实参正确性
//3种中断,用DMAy_Channelx->CCR中的3个位来控制开关
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx,uint16_t DataNumber)
//设置DMAy_Channelx传输数量寄存器
DMA1_FLAG_TC1: DMA1Channel1 transfer complete flag.
DMA1_FLAG_HT1: DMA1Channel1 half transfer flag.
DMA1_FLAG_TE1: DMA1Channel1 transfer error flag.
等状态。
TEIE:允许传输错误中断 (Transfer error interruptenable)
HTIE:允许半传输中断 (Half transfer interruptenable)

stm32DMA控制器的介绍

stm32DMA控制器的介绍

DMA简介(1)DMA,全称为:Direct Memory Access(即直接存储器访问),DMA 用来提供在外设和存储器之间、存储器和存储器之间的高速数据传输。

当CPU 初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。

DMA传输对于高效能嵌入式系统算法和网络是很重要的,因为DMA 传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,而是直接通过硬件为RAM 与I/O 设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。

STM32 最多有2 个DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有7 个通道(如上图所示),DMA2 有5个通道。

每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。

例如,在通道1 上有以下几个DMA请求:ADC1、TIM2_CH3、TIM4_CH1。

由上可知,每一条独立的DMA通道都对应着若干个可以产生DMA请求的内置外设,这些DMA请求信号通过逻辑或后输出到对应的DMA通道上,如通道1就是由ADC1、TIM2_CH3和TIM4_CH1产生的DMA请求信号通过逻辑或后输出到通道1上,所以每一条通道任意一个时刻只能输出一个DMA请求(由于逻辑或是只要有一个请求信号便会输出到通道上,意味着在出现两个或以上的DMA请求信号的情况下无法分别到底是哪个外设的请求,因此,我们在使用某一条通道时,应尽可能做到只有一个外设的DMA 请求或者时分复用)。

仲裁器是用来协调各个DMA 通道的优先级(这里我们所说的优先级指的是DMA通道的优先级,而不是来自外设的DMA请求的优先级)。

然后,再由仲裁器根据优先级来处理各个通道的从外设(TIMx、ADC、SPIx、I2Cx 和USARTx)产生的DMA 请求,通过逻辑或输入到DMA 控制器,这就意味着同时只能有一个请求有效(从7个通道输出的请求信号只有一个有效)。

外设的DMA 请求可以通过设置相应的外设寄存器中的控制位,被独立地开启或关闭。

stm32dma工作原理

stm32dma工作原理

stm32dma工作原理STM32DMA是一种用于外设数据传输的直接存储器访问控制器。

其主要作用是增强STM32系统的数据传输速度和效率,也大大减轻了CPU的负担。

下面就来详细介绍一下STM32DMA的工作原理。

首先,STM32DMA的数据传输过程分为两个阶段:配置阶段和传输阶段。

1. 配置阶段在配置阶段,开发人员需要设置DMA的操作方式和使用的资源。

这包括源地址、目的地址、数据长度和传输方式等。

还需要设置DMA通道、DMA控制器和中断等。

①设置通道每个DMA通道都能够控制一个或多个外设,该通道负责管理该外设的数据传输。

通过设置通道的方式,就能确定当前DMA通道所控制的外设的类型。

②设置DMA控制器DMA控制器是负责控制所有DMA通道的硬件设备。

DMA控制器通过寄存器控制DMA的状态和传输,例如激活DMA传输、中断或者停止传输等。

③设置中断DMA传输完成后可以通过中断的方式来通知CPU,可以设置传输完成中断或错误中断,便于进行处理。

2. 传输阶段一旦配置完成,DMA就可以应用于数据传输。

传输阶段分为两部分:DMA启动和DMA传输。

①DMA启动在DMA启动时,DMA控制器通过设置寄存器来激活传输。

当启动DMA后,系统就开始了DMA数据传输阶段的操作。

此外,系统可以通过设置多个DMA通道来控制多个数据传输,从而提高数据传输的效率。

②DMA传输传输阶段是真正的数据传输,分为两个步骤。

DMA从存储器复制数据,然后将数据传输到外设。

在这一过程中,数据的流向可以是单向或双向的,因此需要根据具体的应用场景进行配置。

总结:在STM32DMA的工作原理中,配置阶段负责设置DMA的操作方式和使用的资源,如DMA 通道、DMA控制器和中断等,也是实现外设数据传输的关键。

而传输阶段则是数据实际传输的过程,包括DMA启动和DMA传输两步。

通过合理配置DMA传输的参数和DMA通道,可以使数据传输更加快速、高效。

同时由于这种方式不需要CPU参与数据传输,因此大大减轻了CPU的负担,提高了系统的运行效率。

stm32 uart dma 接收原理 -回复

stm32 uart dma 接收原理 -回复

stm32 uart dma 接收原理-回复STM32 UART DMA 接收原理一、引言串行通信是一种常用的数据传输方式,UART(通用异步收发传输器)是其中一种常见的串行通信接口。

对于STM32微控制器,它支持使用DMA (直接内存访问)来处理UART的接收和发送操作。

本文将重点讨论STM32 UART DMA 接收的原理,详细介绍DMA的工作原理以及如何在STM32中配置和使用DMA来实现UART的接收功能。

二、DMA 简介DMA是一种由硬件支持的直接内存访问技术,它可以在不依赖CPU的情况下,实现外设和内存之间的数据传输。

在传统的方式中,CPU需要花费大量的时间和资源来处理数据的传输,而DMA可以减轻CPU的负担,提高数据传输的效率。

对于STM32微控制器,它提供了多个DMA通道,可以与不同的外设进行数据传输。

三、UART 接收过程UART的接收过程通常分为两步:接收数据和处理数据。

1. 接收数据:UART接收数据的原理是通过接收数据寄存器(Receive Data Register)将接收到的数据保存在寄存器中,然后CPU读取该寄存器以获得接收到的数据。

在传统的方式中,CPU需要不断地查询是否有接收到的数据,并进行读取操作。

但这种方式会浪费CPU的时间和资源。

2. 处理数据:接收到的数据通常需要进行处理,例如判断数据的格式是否正确、提取有效的数据等。

这些处理过程需要CPU的参与,因此如果CPU在不断查询接收数据的过程中被占用,那么处理数据的效率将会大大降低。

四、DMA 接收原理DMA 可以在不依赖CPU的情况下自动执行数据传输操作,因此可以大大提高数据传输的效率。

对于UART的接收过程,STM32提供了DMA 来进行数据的接收,并提供了相应的寄存器和寄存器位来进行配置。

1. 配置UART DMA 模式:首先需要配置UART和DMA的工作模式。

通过UART的控制寄存器和DMA的配置寄存器,可以设置相关的模式。

stm32f407dma接收缓冲区指针归零

stm32f407dma接收缓冲区指针归零

stm32f407dma接收缓冲区指针归零1. 任务背景在嵌入式系统开发中,使用DMA(Direct Memory Access,直接内存访问)来实现数据传输是一种常见的方式。

DMA允许外设直接与内存进行数据传输,减轻了CPU的负担,提高了系统的效率。

在使用DMA接收数据时,需要使用一个缓冲区来存储接收到的数据。

而当接收完成后,为了避免数据的重复读取或者错误读取,需要将接收缓冲区的指针归零,以便重新使用缓冲区。

本文将结合stm32f407芯片的DMA功能,介绍如何实现接收缓冲区指针归零的具体步骤。

2. stm32f407芯片的DMA功能stm32f407是意法半导体(STMicroelectronics)推出的一款高性能ARM Cortex-M4内核的微控制器。

它具有丰富的外设资源,其中包括DMA控制器。

stm32f407的DMA控制器支持多个通道,每个通道可以与一个外设进行数据传输。

DMA控制器可以通过配置寄存器来设置数据传输的源地址、目的地址、传输长度等参数,然后启动传输。

在DMA传输过程中,DMA控制器会自动完成数据的传输,而不需要CPU的干预。

这样可以大大减轻CPU的负担,提高系统的效率。

3. DMA接收缓冲区指针归零的实现步骤为了实现DMA接收缓冲区指针归零,我们需要进行以下几个步骤:3.1 配置DMA控制器首先,我们需要配置DMA控制器的相关参数,包括源地址、目的地址、传输长度等。

在stm32f407芯片中,DMA控制器的配置是通过写入相应的寄存器来实现的。

具体的配置步骤如下:1.选择一个合适的DMA通道,通常选择一个未被占用的通道。

2.设置源地址,即外设的数据寄存器地址。

3.设置目的地址,即接收缓冲区的地址。

4.设置传输长度,即需要接收的数据长度。

5.配置其他相关参数,如传输方向、数据宽度、传输模式等。

3.2 启动DMA传输配置完成后,我们需要启动DMA传输,让DMA控制器开始进行数据传输。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DMA简介(1)DMA,全称为:Direct Memory Access(即直接存储器访问),DMA 用来提供在外设和存储器之间、存储器和存储器之间的高速数据传输。

当CPU 初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。

DMA传输对于高效能嵌入式系统算法和网络是很重要的,因为DMA 传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,而是直接通过硬件为RAM 与I/O 设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。

STM32 最多有2 个DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有7 个通道(如上图所示),DMA2 有5个通道。

每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。

例如,在通道1 上有以下几个DMA请求:ADC1、TIM2_CH3、TIM4_CH1。

由上可知,每一条独立的DMA通道都对应着若干个可以产生DMA请求的置外设,这些DMA请求信号通过逻辑或后输出到对应的DMA通道上,如通道1就是由ADC1、TIM2_CH3和TIM4_CH1产生的DMA 请求信号通过逻辑或后输出到通道1上,所以每一条通道任意一个时刻只能输出一个DMA请求(由于逻辑或是只要有一个请求信号便会输出到通道上,意味着在出现两个或以上的DMA请求信号的情况下无法分别到底是哪个外设的请求,因此,我们在使用某一条通道时,应尽可能做到只有一个外设的DMA请求或者时分复用)。

仲裁器是用来协调各个DMA 通道的优先级(这里我们所说的优先级指的是DMA通道的优先级,而不是来自外设的DMA请求的优先级)。

然后,再由仲裁器根据优先级来处理各个通道的从外设(TIMx、ADC、SPIx、I2Cx 和USARTx)产生的DMA 请求,通过逻辑或输入到DMA 控制器,这就意味着同时只能有一个请求有效(从7个通道输出的请求信号只有一个有效)。

外设的DMA 请求可以通过设置相应的外设寄存器中的控制位,被独立地开启或关闭。

下表是DMA1 各通道一览表:上表中的各个DMA通道所对应的DMA请求信号的逻辑或,如下图所示,例如:在通道1 上的几个DMA请求信号(ADC1、TIM2_CH3、TIM4_CH1),这几个DMA请通过逻辑或后输出到通道1 的(见下图),这样我们在同一时间,就只能使处理其中一个DMA请求,其他通道也是类似的情况。

DMA寄存器注意:下面所列举的所有寄存器中,所有与通道6和通道7相关的位,对DMA2都不适用(因为DMA2只有5个通道,而且不是所有型号的STM32都有DMA2)1.DMA 中断状态寄存器(DMA_ISR)如果开启了DMA_ISR 寄存器中所描述的事件(三个事件:传输错误、传输过半、传输完成)的中断,在达到条件后(标志位置1)就会跳到中断服务函数里面去;如果没开启中断,我们也可以通过查询这些标志位来获得当前DMA 传输的状态。

这里常用的是TCIFx(传输完成标志位,即标志着DMA通道传输完成与否)。

上述所说的事件有以下:1.通道X传输错误标志位:表示传输过程出现错误。

2.通道X半传输标志位:表示数据传输了一半。

3.通道X传输完成标志位:表示数据传输完成。

4.通道X全局中断标志位:上述三个事件任意一个有效,该位都会置位,产生中断请求(若开了中断的话)。

注意:这个寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清零(在DMA_IFCR 对应位写一来清零)。

2.DMA 中断标志清除寄存器(DMA_IFCR)。

该寄存器是用来清除寄存器DMA_ISR中相应的标志位的(通过写1来清0)。

由软件清零或置位3. DMA通道x传输数量寄存器:DMA_CNDTRX (x=1…7)用低16位来表示要传输的字节数量:可以是0~65535。

通道开启后该寄存器变为只读,指示剩余的待传输的字节数目,寄存器容在每次DMA传输后递减。

数据传输结束后,寄存器的容或者变为0;或者当该通道配置为自动重加载模式(即循环模式)时,这个寄存器的容将被自动重新加载为之前配置的数值。

当寄存器的容为0时,无论通道是否开启,都不会发生任何数据传输。

注意:每次DMA传输的字节数是由通道配置寄存器DMA_CCRx中的PSIZE和MSIZE共同决定的(一般它们的值是相等),可以是8位(字节)、16位(半字)或者32位(字)。

此时DMA_CNDTRx中相应减少的值为1、2、4。

4. DMA通道x配置寄存器:DMA_CCRx(x=1…7)该寄存器共有7个,每一个对应一条DMA通道。

作用由下图所示:5.两个地址寄存器:作为数据传输的源或者目标。

DMA简介(2)根据芯片型号的不同,stm32 中最多可以配置两个独立的DMA控制器,分别为DMA1和DMA2。

他们中的每条通道都分别连接到了不同的外设,其中DMA1有7个通道,DMA2有5个通道,尽管通道之间独立,但是在同一时刻只能处理一条通道的请求(12条中的一条)。

DMA的特点:是在脱离CPU的情况下直接利用数据总线在外设和存储器之间进行数据传输。

解放了CPU在数据传输过程中的消耗。

DMA的工作机制:类似于中断响应。

当外设的DMA事件产生后就产生DMA请求,DMA控制器根据优先级选择相应DMA通道的请求,执行数据传输。

在使用DMA通道进行数据传输前,要进行以下配置:1.优先级配置分为软件和硬件两件配置两种,软件配置有4种优先级的等级(在DMA_CCRx中设置PL[1:0]):00:低;01:中;10:高;11:最高。

可见,软件设置的优先级数目比实际的DMA通道数目少,所以硬件优先级的判定就是在两个通道的软件优先级一样的情况下,比较通道号,序号低的具有更高的优先级。

2.数据传输设置一旦DMA响应了某个外设的请求,就要开始在外设与存储器之间传输数据。

这时,要提供数据传输所用的源地址和目标地址,其中DMA_CPARx寄存器中设置外设地址,在DMA_CMARx寄存器中设置数据存储器地址(这两个地址谁为源地址,谁为目标地址。

是由传输方向决定的),然后在DMA_CCARx寄存器的DIR中设置传输的方向。

在DMA_CCRx寄存器中的PSIZE 和MSIZE位分别设置外设和存储器的位宽,这个位宽指的是每次DMA 传输的位数(8、16、32)。

一般要保持两个位宽一致,在手册中也有提到,半字传输不会出错。

3.传输模式一般一次请求会连续的传输一串数据,这是通过设置DMA_CNDTRx设置传输数据量,每传输一个字节数据将会递减1(但不规定每次只能传输一个字节,具体是根据位宽决定)。

根据DMA_CCRx寄存器中所设置的PINC和MINC标志位设定是否开启增量模式(若不开启,发送方只会传输同一地址的容;而接收方会在同一地址中一直重复覆盖容)。

在开启了增量的条件下,将会根据位宽对地址进行增减。

循环:DMA_CCRx寄存器中的CIRC设置是否开启循环模式,如果开启将会在一次请求传输完毕之后,自动复位计数值和地址(即三个寄存器被重新赋值),重新开始传输。

4.存储器之间的互传(单指SRAM到SRAM)存储器之间的互传是通过设置DMA_CCRx寄存器中的MEM2MEM位来使能的(但前提是DMA_CCRx 寄存器中的EN位使能启动DMA通道),满足上述两个条件,DMA控制器将马上开始传输数据。

此时,通道x的外设地址寄存器DMA_CPARx暂时用来存放其中之一的存储器地址,传输方向也是根据DIR位来决定。

所以,存在以下两种情况:1.硬件请求:DMA通道将硬件请求分配给了芯片的置外设(此时,地址寄存器DMA_CPARx存放外设数据存储器的地址)。

2.软件启动:存储器之间互传属于软件启动,满足EN位置位+MEM2MEM位置位,便可以传输数据。

(此时,地址寄存器DMA_CPARx存放的是存储器的地址)。

注意:这种模式不能与循环模式同时使用。

5.DMA的中断请求如下图所示,产生DMA中断的事件有三个,分别是传输过半、传输完成、传输错误,都连接在一个中断通道上(详见中断向量表)。

所以,我们可以通过配置让数据传输完成后进入中断服务函数(对应事件是传输完成),进行数据处理。

如AD采样传输到存储器之后,进行软件滤波,均值等,当然也可以用查询方式(查询DMA_ISR中的相应位)。

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

注意:在这里没有说明中断服务函数,而我们要了解清除事件的标志位是在DMA的中断服务函数中。

typedef struct {u32 DMA_PeripheralBaseAddr; // 以定义DMA外设基地址u32 DMA_MemoryBaseAddr; //以定义DMA存基地址u32 DMA_DIR ; //用来定义传输方向u32 DMA_BufferSize; //用来定义总共传输的数据的大小u32 DMA_PeripheralInc; //用来设定外设地址寄存器递增与否u32 DMA_MemoryInc; //用来设定存地址寄存器递增与否u32 DMA_PeripheralDataSize; //设定了外设数据宽度u32 DMA_MemoryDataSize; //设定了外设数据宽度u32 DMA_Mode; //用来定义工作模式:循环缓存模式或者正常缓存模式u32 DMA_Priority; //设定DMA通道x的软件优先级u32 DMA_M2M; //是否开启存储器之间的传输} DMA_InitTypeDef;上述的结构体说明了我们在使用DMA传输数据前所需要配置的东西。

下面代码是一个标准DMA设置:具体的库函数的作用详见固件函数库手册。

如:函数DMA_DeInit(通道x),是将通道x设置为缺省值(默认值)。

外设的DMA请求映像我们知道stm32的置外设是可以产生硬件的DMA请求信号的,那么是怎么产生的呢?其实是通过库函数来实现的。

见下面的介绍:要使DMA与外设建立有效连接,这不是DMA自身的事情,是各个外设的事情,每个外设都有一个xxx_DMACmd(XXXx,Enable )函数,如果要使DMA与ADC建立有效联系,就使用ADC_DMACmd函数,那么只需执行:ADC_DMACmd(参数1,参数2);//使能或者失能指定的ADC的DMA请求,其他外设的情况相类似,可能存在参数数目不同,详见固件函数库。

扩充:ADC_DMACmd(ADC1, ENABLE);// 使能ADC1的DMA请求ADC_Cmd(ADC1, ENABLE);//使用之前一定要校准ADC_ResetCalibration(ADC1);//Reset Calibration =复位校准while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_SoftwareStartConvCmd(ADC1, ENABLE);。

相关文档
最新文档