CH03-09-STM32F40x的DMA模块原理电子课件_第1页
CH03-09-STM32F40x的DMA模块原理电子课件_第2页
CH03-09-STM32F40x的DMA模块原理电子课件_第3页
CH03-09-STM32F40x的DMA模块原理电子课件_第4页
CH03-09-STM32F40x的DMA模块原理电子课件_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《嵌入式系统原理与开发设计》STM32F40x的DMA模块原理主讲人:赖树明东莞理工学院01DMA模块介绍02DMA模块框架分析03如何使用DMA0405DMA模块寄存器分析DMA模块应用示例01DMA模块介绍DMA概述DMA关键特征DMA模块介绍DMA概述01DMA,全称为:DirectMemoryAccess,即直接存储器访问。存储器直接与片上外设进行传输而不用CPU参与,从而解放CPU大大增加了CPU的效率.概述以串口发送字符串为例voiduart1_send_data(u8*data){

while(*data){等待发送缓冲区为空UART1->DR=*data++;}}代码存在让CPU死等的情况,导致CPU效率低下。如果采用中断的方法,可以提高CPU效率,使用中断,仍然是需要CPU参与,造成CPU频繁切换,这样CPU的效率仍然不是最高。采用DMA传输就可以大幅度提供CPU处理效率,只需要配置好DMA传输参数,DMA就可以自动把源数据不断搬运到串口数据寄存器中。DMA使用很简单,抓住其关键要素,即可轻松驾驭它。我们可以把DMA是一个专门用来搬运数据的的硬件模块,CPU只需要告诉如何搬运数据,启动搬运就可以自动工作。关键的在要素:源地址、目标地址、搬运的数据量,一次搬运的数据位宽。这些要素都是通过寄存器中进行设置。DMA模块介绍DMA概述01DMA使用很简单,抓住其关键要素,即可轻松驾驭它。我们可以把DMA是一个专门用来搬运数据的的硬件模块,CPU只需要告诉如何搬运数据,启动搬运就可以自动工作。关键的在要素:源地址、目标地址、搬运的数据量,一次搬运的数据位宽。这要要素都是通过寄存器中进行设置。DMA模块介绍DMA概述01传输方向存储器传输数据到存储器03把一块内存空间或片内Flash空间的数据使用DMA模块搬运到另外一块内存空间中去,搬运数据的过程中无须CPU执行传统for循环这类代码即可实现数组数据的复制,整个复制过程是由DMA模块硬件自动完成。存储器传输数据到外设02DMA把存储器缓冲区的数据传输到外设模块的某个寄存器中,例如可以使用DMA模块把要通过UART模块发送出去的数据(保存在存储器中的数组内容或字符串)搬运到UART数据寄存器DR中外设传输数据到存储器01DMA把外设模块某个寄存器的数据传输到存储器的缓冲区,例如可以使用DMA模块把UART模块数据寄存器DR接收到的内容保存到存储器分配的缓冲区中(通常是一个数组)ADC模块介绍ADC模块特征01双AHB主总线架构,一个用于存储器访问,另一个用于外设访问

●仅支持32位访问的AHB从编程接口●每个DMA控制器有8个数据流,每个数据流有多达8个通道(或称请求)

●每个数据流有单独的四级32位先进先出存储器缓冲区(FIFO),可用于FIFO模式或直接模式。

●通过硬件可以将每个数据流配置为:

支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道

●8个数据流中的每一个都连接到专用硬件DMA通道(请求)●DMA数据流请求之间的优先级可用软件编程(4个级别:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定优先级(例如,请求0的优先级高于请求1)

●每个数据流也支持通过软件触发存储器到存储器的传输(仅限DMA2控制器)

●可供每个数据流选择的通道请求多达8个。此选择可由软件配置,允许几个外设启动DMA请求

●要传输的数据项的数目可以由DMA控制器或外设管理:

—DMA流控制器:要传输的数据项的数目是1到65535,可用软件编程

—外设流控制器:要传输的数据项的数目未知并由源或目标外设控制,这些外设通过硬件发出传输结束的信号关键特征02ADC模块框架分析DMA模块介绍DMA框架02每个DMA控制器有8个数据流,每个数据流有多达8个通道,或称DMA请求,框架图中的REQ_STRx_CHy(其中x取值0~7,y取值0~7),分别表示8个数据流;其中每个数据流有8个通道,但是每个数据流的8个通道同一时间只能有一个通道在工作;8个数据流如果同时请求了DMA模块传输数据,则有可能产生冲突,通过仲裁器来设置优先级;仲裁器可以设置每个流请求的优先级别,其中有4个级别:非常高、高、中、低;每个数据流配置为支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道;02以UASRT1为示例:USART1_TX发送请求连接到REQ_STR7_CH7,数据源是一个数组,目标地址是USART1的DR数据寄存器,我们需要配置好通道、源地址和目标地址、在USART1模块中使能DMA发送功能,最后使能DMA工作即可。以上这些信息都是通过寄存器来配置,主阅读后面的寄存器介绍UASRT1->DR等发送的数据内在首地址UASRT1_TX多个数据流同时请示传输时,仲裁器决定优先传输哪一个DMA模块介绍DMA框架03如何使用DMADMA概述数据流及通道选择FIFO模式外设至存储器模式存储器至外设模式存储器至存储器模式地址自增加循环模式如何使用DMA03选择合适的DMA数据流和通道传输数据,因为DMA每个数据流可以和哪些外设配合使用一般情况下是有规定的,可以从阅读芯片用户官方手册DMA章节可以得知。确认好数据传输方向类型,DMA数据传输类型有3种:外设到存储器、存储器到外设、存储器到存储器。确认待传输的数据源地址和数据搬运的目标地址。确认搬运数据方式:总字节数量、每次搬运的字节数(分别包含数据源和目标地址数据位宽度)、源地址和目标地址每次搬运地址变化模式(地址递增或不变:如UART通过DMA来发送数据,则存储器是源地址,每发送一字节会递增,UART的数据寄存器DR是目标地址,是固定不变的)。配置DMA中断功能,选择DMA的搬运数据完成后是否产生中断通知CPU去处理。所有配置完成后,启动DMA传输数据,DMA硬件会根据设置的参数来自动搬运数据,如果使能了它的某些中断功能,则在发生对应事件的阶段会产生中断事件通知CPU工作进行处理。DMA概述

关键特征如何使用DMA03每个数据流都与一个DMA请求相关联,此DMA请求可以从8个可能的通道请求中选出,此选择由数据流控制寄存器DMA_SxCR寄存器中的CHSEL[2:0]这三个位控制,DMA数据流及通道选择通道选择外设请求数据流0数据流1数据流2数据流3数据流4数据流5数据流6数据流7通道0SPI3_RXSPI3_RXSPI2_RXSPI2_TXSPI3_TXSPI3_TX

通道1I2C1_RXTIM7_UPTIM7_UPI2C1_RXI2C1_TXI2C1_TX

通道2TIM4_CH1I2S3_EX_RXTIM4_CH2I2S2_EXT_TXI2S3_EXT_TXTIM4_UPTIM4_CH3

通道3I2S3_EXT_RXTIM2_UPTIM2_CH3I2C3_RXI2S2_EXT_RXI2C3_TXTIM2_CH1TIM2_CH2TIM2_CH4TIM2_CH4TIM2_UPDMA1请求映射源如何使用DMA03每个数据流都与一个DMA请求相关联,此DMA请求可以从8个可能的通道请求中选出,此选择由数据流控制寄存器DMA_SxCR寄存器中的CHSEL[2:0]这三个位控制,DMA数据流及通道选择通道选择外设请求数据流0数据流1数据流2数据流3数据流4数据流5数据流6数据流7通道5UART8_TX(1)UART7_TX(1)TIM3_CH4TIM3_UPUART7_RX(1)TIM3_CH1TIM3_TRIGTIM3_CH2UART8_RX(1)TIM3_CH3通道6TIM5_CH3TIM5_UPTIM5_CH4TIM5_TRIGTIM5_CH1TIM5_CH4TIM5_TRIGTIM5_CH2TIM5_UP

通道7

TIM6_UPI2C2_RXI2C2_RXUSART3_TXDAC1DAC2I2C2_TX外设请求数据流0数据流1数据流2数据流3数据流4数据流5数据流6数据流7DMA1请求映射源如何使用DMA04每个数据流都与一个DMA请求相关联,此DMA请求可以从8个可能的通道请求中选出,此选择由数据流控制寄存器DMA_SxCR寄存器中的CHSEL[2:0]这三个位控制,DMA数据流及通道选择通道选择外设请求数据流0数据流1数据流2数据流3数据流4数据流5数据流6数据流7通道0ADC1

TIM8_CH1TIM8_CH2TIM8_CH3

ADC1

TIM1_CH1TIM1_CH2TIM1_CH3

通道1

DCMIADC2ADC2

SPI6_TX(1)SPI6_RX(1)DCMI通道2ADC3ADC3

SPI5_RX(1)SPI5_TX(1)CRYP_OUTCRYP_INHASH_IN通道3SPI1_RX

SPI1_RXSPI1_TX

SPI1_TX

DMA2请求映射源如何使用DMA03每个数据流都与一个DMA请求相关联,此DMA请求可以从8个可能的通道请求中选出,此选择由数据流控制寄存器DMA_SxCR寄存器中的CHSEL[2:0]这三个位控制,DMA数据流及通道选择通道选择外设请求数据流0数据流1数据流2数据流3数据流4数据流5数据流6数据流7通道5

USART6_RXUSART6_RXSPI4_RX(1)SPI4_TX(1)

USART6_TXUSART6_TX通道6TIM1_TRIGTIM1_CH1TIM1_CH2TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM1_CH3

通道7

TIM8_UPTIM8_CH1TIM8_CH2TIM8_CH3SPI5_RX(1)SPI5_TX(1)TIM8_CH4TIM8_TRIGTIM8_COM通道5

USART6_RXUSART6_RXSPI4_RX(1)SPI4_TX(1)

USART6_TXUSART6_TXDMA2请求映射源如何使用DMA03FIFO用于在源数据传输到目标之前临时存储这些数据。每个数据流都有一个独立的4字FIFO(16字节),阈值级别可由软件配置为1/4、1/2、3/4或满,过将DMA_SxFCR寄存器中的DMDIS位置1来禁止直接模式,这样就使能FIFO功能(FIFO模式下源和目标的数据宽度可以不一样)FIFO模式FIFO模式FIFO结构如何使用DMA03FIFO模式FIFO结构如何使用DMA03传输方向使用DMA_SxCR寄存器中的DIR[1:0]这两个位进行配置,有三种可能的传输方向:存储器到外设、外设到存储器或存储器到存储器。当数据宽度(在DMA_SxCR寄存器的PSIZE或MSIZE位中编程)分别是半字或字时,写入DMA_SxPAR或DMA_SxM0AR/M1AR寄存器的外设或存储器地址必须分别在字或半字地址的边界对齐。数据源、目标及数据流传输模式DMA_SxCR寄存器的位DIR[1:0]方向源地址目标地址00外设到存储器DMA_SxPARDMA_SxM0AR01存储器到外设DMA_SxM0ARDMA_SxPAR10存储器到存储器DMA_SxPARDMA_SxM0AR11保留--源和目标的地址如何使用DMA03DMA_SxM1AR表示用于双缓冲区模式,该模式每次产生外设请求,数据流都会启动数据源到FIFO的传输。直接模式:不使用FIFO阈值,如果DMA_SxNDTR寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。外设至存储器模式如何使用DMA03存储器到外设模式FIFO模式:将DMA_SxCR寄存器中的位EN置1每次产生外设请求,数据流都会启动数据源到FIFO的传输。达到FIFO的阈值级别时,FIFO的内容移出并存储到目标中。停止传输的三种条件如果DMA_SxNDTR寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。直接模式:当DMA_SxFCR寄存器中的DMDIS值为“0”不使用FIFO的阈值级别控制:每完成一次从外设到FIFO的数据传输后相应的数据立即就会移出并存储到目标中。如何使用DMA03DMA_SxM1AR表示用于双缓冲区模式,该模式每次产生外设请求,数据流都会启动数据源到FIFO的传输。直接模式:不使用FIFO阈值,如果DMA_SxNDTR寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。存储器到外设模式如何使用DMA03存储器到外设模式FIFO模式:将DMA_SxCR寄存器中的位EN置1数据流会立即启动传输从源完全填充FIFO。停止传输的三种条件如果DMA_SxNDTR寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。直接模式:当DMA_SxFCR寄存器中的DMDIS值为“0”一旦使能了数据流,DMA便会预装载第一个数据将其传输到内部FIFO。一旦外设请求数据传输,DMA便会将预装载的值传输到配置的目标。然后,它会使用要传输的下一个数据再次重载内部空FIFO。预装载的数据大小为DMA_SxCR寄存器中PSIZE位字段的值。研究意义停止传输的三种条件如果DMA_SxNDTR寄存器达到零、外设请求传输终止(在使用外设流控制器的情况下)或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。如何使用DMA03此模式DMA通过将DMA_SxCR寄存器中的使能位(EN)置1来使能数据流时,数据流会立即开始填充FIFO,直至达到阈值级别,达到阈值级别后,FIFO的内容便会移出,并存储到目标中,DMA_SxNDTR寄存器达到零或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。使能一次数据流,搬移的数据量等于一次搬移的数据量乘以搬移的次数。存储器到存储器模式注意:使用存储器到存储器模式时,不允许循环模式(DMA搬运ADC的结果)和直接模式。只有DMA2控制器能够执行存储器到存储器的传输。如何使用DMA03存储器到存储器模式FIFO模式:将DMA_SxCR寄存器中的位EN置1数据流会立即启动传输从源完全填充FIFO。停止传输的两种条件DMA_SxNDTR寄存器达到零或DMA_SxCR寄存器中的EN位由软件清零,传输即会停止。。触发启动:将DMA_SxCR寄存器中的使能位(EN)置1来使能数据流时数据流会立即开始填充FIFO,直至达到阈值级别。达到阈值级别后FIFO的内容便会移出,并存储到目标中。研究意义如何使用DMA03地址自增地址自增有相应的要求,就是一次搬移的数据量后,地址增加多少,例如,一次搬移一个字节数据,地址自增1。根据DMA_SxCR寄存器中PINC和MINC位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。如果使能了递增模式,则根据在DMA_SxCR寄存器PSIZE或MSIZE位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增1(对于字节)、2(对于半字)或4(对于字)。缓冲区存储器到外设外设地址1地址2地址3固定搬运到外设寄存器地址.....地址n地址递增地址不变如何使用DMA03地址自增地址自增有相应的要求,就是一次搬移的数据量后,地址增加多少,例如,一次搬移一个字节数据,地址自增1。根据DMA_SxCR寄存器中PINC和MINC位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。如果使能了递增模式,则根据在DMA_SxCR寄存器PSIZE或MSIZE位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增1(对于字节)、2(对于半字)或4(对于字)。缓冲区外设到存储器外设地址1地址2地址3从外设寄存器地址中搬运数据.....地址n地址需要改变地址不变如何使用DMA03地址自增地址自增有相应的要求,就是一次搬移的数据量后,地址增加多少,例如,一次搬移一个字节数据,地址自增1。根据DMA_SxCR寄存器中PINC和MINC位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。如果使能了递增模式,则根据在DMA_SxCR寄存器PSIZE或MSIZE位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增1(对于字节)、2(对于半字)或4(对于字)。缓冲区外设到存储器缓冲区地址1地址1地址2地址2地址3

从一个缓冲区中搬运数据到另一个缓冲区地址3..........地址n地址n地址需要改变地址需要改变如何使用DMA03循环模式循环模式可用于处理循环缓冲区和连续数据流(如ADC扫描模式),可以使用DMA_SxCR寄存器中的CIRC位使能此特性。当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应DMA请求。注意:在非循环模式下配置数据流,传输结束后(要传输的数据数目达到零)除非软件重新对数据流编程并重新使能数据流(通过将DMA_SxCR寄存器中的EN位置1),否则DMA即会停止传输(通过硬件将DMA_SxCR寄存器中的EN位清零)并且不再响应任何DMA请求。如何使用DMA03循环模式循环模式可用于处理循环缓冲区和连续数据流(如ADC扫描模式),可以使用DMA_SxCR寄存器中的CIRC位使能此特性。当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应DMA请求。注意:在非循环模式下配置数据流,传输结束后(要传输的数据数目达到零)除非软件重新对数据流编程并重新使能数据流(通过将DMA_SxCR寄存器中的EN位置1),否则DMA即会停止传输(通过硬件将DMA_SxCR寄存器中的EN位清零)并且不再响应任何DMA请求。模式说明如何使用DMA03DMA中断对于每个DMA数据流,可在发生以下事件时产生中断:达到半传输;传输完成;传输错误;FIFO错误(上溢、下溢或FIFO级别错误);直接模式错误。中断说明中断事件事件标志使能控制位半传输HTIFHTIE传输完成TCIFTCIE传输错误TEIFTEIEFIFO上溢/下溢FEIFFEIE直接模式错误DMEIFDMEIE如何使用DMA03流控制器控制要传输的数据数目的实体称为流控制器。此流控制器使用DMA_SxCR寄存器中的PFCTRL位针对每个数据流独立配置。流控制器可以是:1)DMA控制器:要传输的数据项的数目在使能DMA数据流之前写入DMA_SxNDTR寄存器。2)外设源或目标:当要传输的数据项的数目未知时属于这种情况。当所传输的是最后的数据时,外设通过硬件向DMA控制器发出指示。仅限能够发出传输结束信号的外设支持此功能,如SDIO模块,当外设流控制器用于给定数据流时,写入DMA_SxNDTR的值对DMA传输没有作用。实际上,不论写入什么值,一旦使能数据流,硬件即会将该值强制置为0xFFFF。外设源或目标为流控制器时,实际传输的字节数量计算分以下几种情况:

①当DMA_SxCR寄存器中的EN位重置为0,或收到最后的数据硬件信号正常流中断,状态寄存器中相应数据流的TCIFx标志置1以指示DMA完成传输。DMA传输期间传输的数据项的数量为0xFFFF减去DMA_SxNDTR寄存器的值。

②当DMA_SxNDTR寄存器达到0,状态寄存器中相应数据流的TCIFx标志置1以指示强制的DMA传输完成,已传输的数据不会丢失。即在外设流控制模式下,DMA在单独的事务中最多处理65535个数据项。流控制器说明04DMA模块寄存器DMA寄存器详解DMA数据流配置流程DMA模块寄存器分析04位27、21、11、5—TCIFx:数据流x传输完成中断标志(x=3..0)0:数据流x上无传输完成事件;1:数据流x上发生传输完成事件。位26、20、10、4—HTIFx:数据流x半传输中断标志(x=3..0)0:数据流x上无半传输事件;1:数据流x上发生半传输事件。位25、19、9、3—TEIFx:数据流x传输错误中断标志(x=3..0)0:数据流x上无传输错误;1:数据流x上发生传输错误。位24、18、8、2—TDMEIFx:数据流x直接模式错误中断标志(x=3..0)0:数据流x上无直接模式错误;1:数据流x上发生直接模式错误。位22、16、6、0—TFEIFx:数据流xFIFO错误中断标志(x=3..0)0:数据流x上无FIFO错误事件;1:数据流x上发生FIFO错误事件。说明:这些位将由硬件置1,由软件清零,软件只需将1写入DMA_HIFCR寄存器的相应位。DMA低中断状态寄存器(DMA_LISR)(只对比较常用域进行说明)DMA模块寄存器分析04位27、21、11、5—TTCIFx:数据流x传输完成中断标志(x=7..4)0:数据流x上无传输完成事件;1:数据流x上发生传输完成事件。位26、20、10、4—THTIFx:数据流x半传输中断标志(x=7..4)0:数据流x上无半传输事件;1:数据流x上发生半传输事件。位25、19、9、3—TTEIFx:数据流x传输错误中断标志(x=7..4)0:数据流x上无传输错误;1:数据流x上发生传输错误。位24、18、8、2—TDMEIFx:数据流x直接模式错误中断标志(x=7..4)0:数据流x上无直接模式错误;1:数据流x上发生直接模式错误。位22、16、6、0—TFEIFx:数据流xFIFO错误中断标志(x=7..4)0:数据流x上无FIFO错误事件;1:数据流x上发生FIFO错误事件。说明:这些位将由硬件置1,由软件清零,软件只需将1写入DMA_HIFCR寄存器的相应位。DMA高中断状态寄存器(DMA_HISR)(只对比较常用域进行说明)DMA模块寄存器分析04这个寄存器用于清零DMA0~3这4个数据流的中断标志。位27、21、11、5—TCTCIFx:数据流x传输完成中断标志清零(x=3..0)位26、20、10、4—TCHTIFx:数据流x半传输中断标志清零(x=3..0)位25、19、9、3—TCTEIFx:数据流x传输错误中断标志清零(x=3..0)位24、18、8、2—TCDMEIFx:数据流x直接模式错误中断标志清零(x=3..0)位23、17、7、1—T:保留,必须保持复位值。位22、16、6、0—TCFEIFx:数据流xFIFO错误中断标志清零(x=3..0)说明:这些位将1写入此位时,DMA_LISR寄存器中相应的中断标志就会被清零。DMA低中断标志清零寄存器(DMA_LIFCR)(只对比较常用域进行说明)DMA模块寄存器分析04这个寄存器用于清零了DMA4~7这4个数据流的中断标志。位27、21、11、5—TCTCIFx:数据流x传输完成中断标志清零(x=7..4)位26、20、10、4—TCHTIFx:数据流x半传输中断标志清零(x=7..4)位25、19、9、3—TCTEIFx:数据流x传输错误中断标志清零(x=7..4)位24、18、8、2—TCDMEIFx:数据流x直接模式错误中断标志清零(x=7..4)位22、16、6、0—TCFEIFx:数据流xFIFO错误中断标志清零(x=7..4)说明:这些位将1写入此位时,DMA_LISR寄存器中相应的中断标志就会被清零。DMA高中断标志清零寄存器(DMA_HIFCR)(只对比较常用域进行说明)DMA模块寄存器分析04位27:25—TCHSEL[2:0]:通道选择,这些位将由软件置1和清零。000:选择通道0;001:选择通道1;010:选择通道2;011:选择通道3;100:选择通道4;101:选择通道5;110:选择通道6;111:选择通道7。位24:23—MBURST:存储器突发传输配置,这些位将由软件置1和清零。00:单次传输;01:INCR4(4个节拍的增量突发传输);10:INCR8(8个节拍的增量突发传输);11:INCR16(16个节拍的增量突发传输)。在直接模式中,当EN=1时,这些位由硬件强制置为0x0。位22:21—PBURST[1:0]:外设突发传输配置,这些位将由软件置1和清零。00:单次传输;01:INCR4(4个节拍的增量突发传输);10:INCR8(8个节拍的增量突发传输);11:INCR16(16个节拍的增量突发传输)。DMA数据流x配置寄存器(DMA_SxCR)(x=0..7)DMA模块寄存器分析04位19—CT:当前目标(仅在双缓冲区模式),此位由硬件置1和清零,也可由软件写入。0:当前目标存储器为存储器0(使用DMA_SxM0AR);

1:当前目标存储器为存储器1(使用DMA_SxM1AR)。只有EN=0时,此位才可以写入,以指示第一次传输的目标存储区。在使能数据流后,此位相当于一个状态标志,用于指示作为当前目标的存储区。位18—DBM:双缓冲区模式

,0:传输结束时不切换缓冲区;1:DMA传输结束时切换目标存储区。位17:16—PL[1:0]:优先级(Prioritylevel)

00:低;01:中;10:高;11:非常高。DMA数据流x配置寄存器(DMA_SxCR)(x=0..7)DMA模块寄存器分析04位15—PINCOS:外设增量偏移量0:外设地址的偏移量与PSIZE相关;1:外设地址的偏移量固定为4(32位对齐)。位14:13—MSIZE[1:0]:存储器数据大小,00:字节(8位);01:半字(16位);10:字(32位);11:保留。在直接模式下,当EN=1时,MSIZE位由硬件强制置为与PSIZE相同的值。位12:11—PSIZE[1:0]:外设数据大小00:字节(8位);01:半字(16位);10:字(32位);11:保留。位10—MINC:存储器递增模式0:存储器地址指针固定;

1:每次数据传输后,存储器地址指针递增(增量为MSIZE值)。此位受到保护,只有EN=0时才可以写入。DMA数据流x配置寄存器(DMA_SxCR)(x=0..7)DMA模块寄存器分析04位9—PINC:外设递增模式0:外设地址指针固定;1:每次数据传输后,外设地址指针递增(增量为PSIZE值)位8—CIRC:循环模式,此位由软件置1和清零,并可由硬件清零。0:禁止循环模式;1:使能循环模式如果外设为流控制器(位PFCTRL=1)且使能数据流(位EN=1),由硬件自动强制清零。如果DBM位置1,当使能数据流(位EN=1)时,此位由硬件自动强制置1。位7:6—DIR[1:0]:数据传输方向00:外设到存储器;01:存储器到外设;10:存储器到存储器;11:保留。位5—PFCTRL:外设流控制器,0:DMA是流控制器;1:外设是流控制器。选择存储器到存储器模式(位DIR[1:0]=10)后,此位由硬件自动强制清零。DMA数据流x配置寄存器(DMA_SxCR)(x=0..7)DMA模块寄存器分析04位4—TCIE:传输完成中断使能

0:禁止TC中断;

1:使能TC中断。位3—HTIE:半传输中断使能

0:禁止HT中断;

1:使能HT中断。位2—TEIE:传输错误中断使能

0:禁止TE中断;

1:使能TE中断。位1—DMEIE:直接模式错误中断使能

0:禁止DME中断;1:使能DME中断。位0—EN:数据流使能/读作低电平时数据流就绪标志,0:禁止数据流;1:使能数据流。以下情况下,此位可由硬件清零:

1)DMA传输结束时(准备好配置数据流);

2)AHB主总线出现传输错误时;

3)存储器AHB端口上的FIFO阈值与突发大小不兼容时。DMA数据流x配置寄存器(DMA_SxCR)(x=0..7)DMA模块寄存器分析04位15:0—NDT[15:0]:要传输的数据项数目要传输的数据项数目(0~65535)。只有在禁止数据流时,才能向此寄存器执行写操作。使能数据流后,此寄存器为只读,用于指示要传输的剩余数据项数,每次DMA传输后,此寄存器将递减。传输完成后,此寄存器保持为零(数据流处于正常模式时),或者在以下情况下自动以先前编程的值重载:

1)以循环模式配置数据流时;

2)通过将EN位置1来重新使能数据流时;注意:如果该寄存器的值为零,使能数据流,也无法完成任何事务。DMA数据流x数据项数寄存器(DMA_SxNDTR)(x=0..7)DMA模块寄存器分析04位31:0~PAR[31:0]:外设地址读写数据的外设数据寄存器的基址。只有DMA_SxCR寄存器中的EN=0时才可以写入。DMA数据流x外设地址寄存器(DMA_SxPAR)(x=0..7)DMA模块寄存器分析04位31:0~M0A[31:0]:存储器0地址,读写数据的存储区0的基址。这些位受到写保护,只有在以下情况下才可以写入:禁止数据流(DMA_SxCR寄存器中的位EN=0);使能数据流(DMA_SxCR寄存器中的EN=1)且DMA_SxCR寄存器中的位CT=1(在双缓冲区模式下)。DMA数据流x存储器0地址寄存器(DMA_SxM0AR)(x=0..7)DMA模块寄存器分析04位31:0~M1A[31:0]:存储器1地址(用于双缓冲区模式)读写数据的存储区1的基址。此寄存器仅用于双缓冲区模式。只有在以下情况下才可以写入:禁止数据流(DMA_SxCR寄存器中的位EN=0);使能数据流(DMA_SxCR寄存器中的EN=1)且DMA_SxCR寄存器中的位CT=0。DMA数据流x存储器1地址寄存器(DMA_SxM1AR)(x=0..7)DMA模块寄存器分析04位7—FEIE:FIFO错误中断使能,

0:禁止FE中断;1:使能FE中断。位5:3—FS[2:0]:FIFO状态,这些位为只读,在直接模式(DMDIS位为零)下,这些位无意义。000:0<fifo_level<1/4;001:1/4≤fifo_level<1/2;010:1/2≤level<3/4;011:3/4≤fifo_level<满;100:FIFO为空;101:FIFO已满。位2—DMDIS:直接模式禁止,由软件置1和清零,也可由硬件置1。只有EN=0时才可以写入。0:使能直接模式;1:禁止直接模式。在存储器到存储器模式下(DMA_SxCR中的DIR=10),并且DMA_SxCR寄存器中的EN=1,则此位由硬件置1,因为在存储器到存储器配置不能使用直接模式。位1:0—FTH[1:0]:FIFO阈值选择,在直接模式(DMDIS值为零)下,不使用这些位。这些位受到保护,只有EN=1时才可以写入。00:FIFO容量的1/4;01:FIFO容量的1/2;10:FIFO容量的3/4;11:FIFO完整容量。DMA数据流xFIFO控制寄存器(DMA_SxFCR)(x=0..7)DMA数据流配置流程05①清零DMA_SxCR寄存器中的EN位将其禁止,然后读取此位直到真正变成0为止;②配置DMA_SxCR寄存器:选择通道、单次传输/突发传输、是否双缓冲模式、设置通道优先级、存储器传输数据大小、外设传输数据大小、存储器/外设地址递增模式、数据方向、外设流控器、是否采用循环模式及DMA相关中断使能(根据需要使能);③在DMA_SxNDTR寄存器中配置要传输的数据项的总数,每出现一次外设事件或每出现一个节拍的突发传输,该值都会递减;④在DMA_SxPAR寄存器中设置外设端口寄存器地址;⑤在DMA_SxMA0R寄存器(如使用双缓冲区模式还需要配置DMA_SxMA1R寄存器)中设置存储器地址;⑥在DMA_SxFCR寄存器中配置FIFO的使用情况(使能或禁止,发送和接收阈值);⑦启用DMA数据流通道工作。DMA数据流配置流程总结05DMA模块示例硬件分析软件分析软件编程原理图说明本示例在前面ADC示例的基础上增加了DMA功能,使用DMA模块自动读取ADC数据寄存器DR的值,保存到数组缓冲区中,然后每100次ADC采集求平均值打印输出。原理图分析ADC的基准电压为3.3V;模拟信号接在PA4上,上面具有ADC1/2_IN4功能;PA4引脚上接着一个光敏电阻,根据光照强度不同,电阻值发生变化导致输出电压不相同,将这个模拟量送入STM32F407的ADC模块进行测量转换成数字量。STM32F40XDMA模块示例硬件分析05设计思路初始化ADC:关于ADC初始化大部分内容保持和前面ADC的示例相同,本节不再重述,不同点如下:不再需要依靠ADC模块转换完成中断来读取ADC转换结果;需要开启ADC模块的DMA传输功能功能。DMA初始化:使用DMA2的数据流0的通道0(查DMA2的通道映射表得出可以使用哪个通道);

配置外设到存储器模式,外设地址固定,存储器地址递增;传输数量设置为100次、采用循环模式、流控制器是DMA,DMA传输完成中断;配置DMA中断,配置NVIC中断控制器。5.数据处理:每采集100次,如果使能了传输完成中断,则会产生DMA传输完成中断,在中断服务程序中求平均值,当然,也可以不使用中断,在main函数中检测DMA低中断状态寄存器(DMA_LISR)的第5位TCIF是否为1来判断是否已经完成100次ADC采集。

本示例采用查询方式来处理传输完成的数据,掌握后大家可以修改为中断方式实现。6.主程序通过在每完成100次数据采集后进行求平均值然后使用UART1输出结果。STM32F40XDMA模块示例软件分析05ADC初始化voidadc1_in4_init(void){ RCC->AHB1ENR|=1<<0;

//开PA组时钟 GPIOA->MODER|=0X3<<8;//PA4配置为模拟功能 RCC->APB2ENR|=1<<8;

//开ADC1时钟 ADC->CCR&=~(0X3<<16); ADC->CCR|=1<<16;

//配置4分频值--ADCCLK=21M

//位9DDS:1表示只要发生数据转换且DMA=1,即发出DMA请求。 ADC1->CR2

|=

(1<<9)|(1<<8)|(1<<1)|(1<<0);

//选择注入通道,单次不扫描模式 ADC1->SMPR2=7<<0;//480个周期采样时间;转换结束需要23.4μs。 ADC1->SQR1=1<<20;

//总共转换1次 ADC1->SQR3=4<<0;

//第一次转换是通道4}软件编程05STM32F40XDMA模块示例DMA初始化函数形参:ch:通道号;m_addr:存储器地址;p_addr:外设地址;data_num:传输数量;msize:数据位宽。voidDMA2_stream_0_p2m_init(u32ch,u32m_addr,u32p_addr,u32msize,u32data_num){RCC->AHB1ENR|=1<<22;

//开DMA2时钟 DMA2_Stream0->CR=0;

//关闭数据流while(DMA2_Stream0->CR&(1<<0)){}

//等待数据流关闭

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论