第8章直接存储器存取ppt课件.ppt

上传人:牧羊曲112 文档编号:1428636 上传时间:2022-11-23 格式:PPT 页数:71 大小:2.24MB
返回 下载 相关 举报
第8章直接存储器存取ppt课件.ppt_第1页
第1页 / 共71页
第8章直接存储器存取ppt课件.ppt_第2页
第2页 / 共71页
第8章直接存储器存取ppt课件.ppt_第3页
第3页 / 共71页
第8章直接存储器存取ppt课件.ppt_第4页
第4页 / 共71页
第8章直接存储器存取ppt课件.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《第8章直接存储器存取ppt课件.ppt》由会员分享,可在线阅读,更多相关《第8章直接存储器存取ppt课件.ppt(71页珍藏版)》请在三一办公上搜索。

1、退出,嵌入式单片机原理及应用,电气工程学院仪器科学与工程系,1 ARM嵌入式系统概述2 STM32单片机结构和最小系统 3 基于标准外设库的C语言程序设计基础 4 STM32通用输入输出GPIO5 STM32外部中断6 STM32通用定时器7 STM32通用同步/异步收发器USART8 直接存储器存取DMA9 STM32的模数转换器ADC10 STM32的集成电路总线I2C11 STM32的串行外设接口SPI,第8章 直接存储器存取DMA,8.1 DMA简介8.2 STM32的DMA结构8.3 DMA相关寄存器8.4 DMA的工作过程8.5 DMA应用设计,退出,8.1 DMA简介,DMA用来

2、提供外设与外设之间、外设与存储器之间、存储器与存储器之间的高速数据传输,无需CPU干预,数据可以通过DMA快速传输,节省CPU的资源。在实现DMA传输时,由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题,即DMA传输前,CPU把总线控制权交给DMA控制器,在结束DMA传输后,DMA控制器立即把总线控制权交回CPU。,8.2 STM32的DMA结构,STM32最多拥有两个DMA控制器,DMA1控制器拥有7个独立的可配置通道,DMA2有5个独立的可配置通道,每个通道用来管理来自于一个或多个外设对存储器访问的请求。STM32F103RBT6只有DMA1控制器。,8.2 STM32的DM

3、A结构,每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1 ,依此类推) 。 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。,STM32的DMA主要特性如下:,8.2 STM32的DMA结构,支持循环的缓冲器管理 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。存储器和存储器间的传

4、输 、外设和存储器、存储器和外设之间的传输闪存、SRAM 、外设的SRAM 、APB1、APB2和AHB外设均可作为访问的源和目标。可编程的数据传输数目:最大为65535,STM32的DMA主要特性如下(续):,8.2 STM32的DMA结构,DMA1模块的通道和外设的对照表,使用DMA的通道的时候,每一个通道对应的外设是不一样的,需要根据相应的外设来选择DMA的通道,DMA是AHB总线上的设备,它有2个AHB端口:一个是从端口,用于配置DMA,一个是主端口,用于设备间数据传输。两个AHB/APB桥在AHB和两个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作速度限于72

5、MHz。,8.2 STM32的DMA结构,循环优先调度 NVIC和Cortex-M3处理器实现了高性能低延时中断调度。所有的Cortex-M3指令既可以在单周期内执行,也可以在总线周期上被中断。循环优先级调度能够确保CPU在必要的时候每两个总线周期就去访问其它总线。多层结构和总线挪用 多层结构允许两个主要设备并行执行数据传输。使用总线挪用存取机制,CPU访问和DMA通过APB总线存取外设可以并行工作。DMA总线挪用机制使得总线利用效率更高,减少软件执行时间。在Cortex-M3哈佛架构下提高数据的并行性,减少执行时间,优化DMA效率。,总线矩阵有两个主要特征: 循环优先调度、多层结构和总线挪用

6、。,8.3 DMA相关寄存器,DMA的功能是通过操作两类寄存器实现的:一类是具有DMA功能的相关外设寄存器,主要用来设置外设开启DMA功能,例如在通用定时器中的DMA/中断使能寄存器(TIMx_DIER)、DMA控制寄存器(TIMx_DCR)和连续模式的DMA地址寄存器(TIMx_DMAR);通用异步/同步收发器USART中的控制寄存器3(USART_CR3)。另一类是DMA相关寄存器,用来设置DMA的具体工作方式。DMA中断状态寄存器(DMA_ISR)DMA中断标志清除寄存器(DMA_IFCR)DMA通道x配置寄存器(DMA_CCRx)(x = 17)DMA通道x传输数量寄存器(DMA_CN

7、DTRx)(x = 17)DMA通道x外设地址寄存器(DMA_CPARx)(x = 17)DMA通道x存储器地址寄存器(DMA_CMARx)(x = 17)。,8.3 DMA相关寄存器,1. DMA中断状态寄存器(DMA_ ISR)该寄存器保存着DMA中断的状态,偏移地址00H,复位值为00000000H,其格式如下:,8.3 DMA相关寄存器,1. DMA中断状态寄存器(DMA_ ISR)该寄存器保存着DMA中断的状态,偏移地址00H,复位值为00000000H,其格式如下:,8.3 DMA相关寄存器,2. DMA中断标志清除寄存器(DMA_ IFCR)该寄存器用来清除DMA中断标志,偏移地

8、址04H,复位值为000000H,其格式如下:,8.3 DMA相关寄存器,2. DMA中断标志清除寄存器(DMA_ IFCR)该寄存器用来清除DMA中断标志,偏移地址04H,复位值为000000H,其格式如下:,8.3 DMA相关寄存器,3. DMA通道x配置寄存器(DMA_ CCRx)(x=1.7) 该寄存器用来配置DMA工作模式,31:15: 保留,始终读为00MEM2MEM:1:存储器到存储器模式,0:非存储器到存储器模式PL1:0:通道优先级(Channel priority level)这些位由软件设置和清除:00:低, 01:中, 10:高,11:最高MSIZE1:0:存储器数据宽

9、度(Memory size)这些位由软件设置和清除。00:8位, 01:16位, 10:32位,11:保留MINC:存储器地址增量模式(Memory increment mode)0:不执行存储器地址增量操作 1:执行存储器地址增量操作PINC:外设地址增量模式(Peripheral increment mode)0:不执行外设地址增量操作 1:执行外设地址增量操作CIRC:循环模式(Circular mode)0:不执行循环操作 1:执行循环操作,8.3 DMA相关寄存器,3. DMA通道x配置寄存器(DMA_ CCRx)(x=1.7) 该寄存器用来配置DMA工作模式,1,1,1,8.3 D

10、MA相关寄存器,4. DMA通道x传输数量寄存器(DMA_ CNDTRx)(x=1.7)该寄存器用来配置DMA传输数据量,8.3 DMA相关寄存器,5. DMA通道x外设地址寄存器(DMA_ CPARx)(x = 1.7) 该寄存器用来配置DMA通道外设地址,8.3 DMA相关寄存器,6. DMA通道x存储器地址寄存器(DMA_ CMARx)(x=1.7) 该寄存器用来配置DMA通道存储器地址,8.4 DMA的工作过程,1DMA传送2仲裁器3DMA通道4错误管理5DMA请求映射,8.4 DMA的工作过程,1DMA传送DMA传输三要素:传输源:DMA控制器从传输源读出数据;传输目标:数据传输的目

11、标地址;触发信号:用于触发一次数据传输的动作,执行一个单位的传输源至传输目标的数据传输;用于控制数据传输的时机。,8.4 DMA的工作过程,1DMA传送(过程)(1)IO设备准备好后,向DMAC发出DMA请求;(2)DMAC向CPU发出总线请求;(3)CPU向DMAC发出总线响应,总线控制权由DMAC接管(图中阴影所示)。(4)DMAC向IO设备发出DMA响应,按事先设置的初始地址和传送字节数,依次发送地址和寄存器(或I/O)读写命令,实现RAM和IO设备直接交换数据,直至传送完毕。(5)DMA传送结束,撤销向CPU的总线请求,总线响应和DMA响应随即失效,CPU重新控制总线。,8.4 DMA

12、的工作过程,2仲裁器 仲裁器根据通道请求的优先级来启动外设/存储器的访问。 优先权管理分2个阶段:软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级: 最高优先级 高优先级 中等优先级 低优先级 硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。如,通道2优先于通道4。注意: 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级,8.4 DMA的工作过程,3DMA通道每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据量最大65535。包含要传输的数据项数量的寄存器,在每次传输后递减。

13、可编程的数据宽度:外设和存储器的传输数据宽度可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程。指针增量:设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后自动增量修改。增量值取决于所选的数据宽度。第一个传输的地址是存放在DMA_CPARx /DMA_CMARx寄存器中地址。在传输过程中,这些寄存器保持不变,软件不能改变和读出当前正在传输的地址。,8.4 DMA的工作过程,当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的DMA传输,需要在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目

14、。 在循环模式下,最后一次传输结束时,DMA_CNDTRx寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx /DMA_CMARx寄存器设定的初始基地址。,8.4 DMA的工作过程,4错误管理 在DMA读写操作中一旦发生总线错误,硬件会自动的清除发生错误的通道所对应的通道配置寄存器(DMA_ CCRx)的EN位,该通道操作被停止,此时DMA_ ISR寄存器中对应该通道的传输错误中断标志位(TEIF)被置位,如果设置了传输错误中断,则产生中断。,8.4 DMA的工作过程,5DMA请求映射 从外设(TIMx, ADC, SPIx, I2Cx

15、和USARTx)产生的7个请求,通过逻辑或输入到DMA控制器。每个通道对应不同的外设。外设DMA请求可以通过软件设置相应外设寄存器中的控制位,独立的开启或关闭。,8.5 DMA应用设计,8.5.1 DMA常用库函数8.5.2 DMA使用流程8.5.3 DMA数据传输应用实例,8.5 DMA应用设计,8.5.1 DMA常用库函数库函数:DMA_DeInit函数DMA_Init函数DMA_StructInit函数DMA_Cmd函数DMA_ITConfig函数DMA_GetCurrDataCounter函数DMA_GetFlagStatus函数DMA_ClearFlag函数DMA_GetITStat

16、us函数DMA_ClearITPendingBit函数,8.5 DMA应用设计,DMA_InitTypeDef DMA_InitStructure;,8.5 DMA应用设计,DMA_PeripheralBaseAddr 该参数用以定义DMA外设基地址。 DMA_MemoryBaseAddr 该参数用以定义DMA内存基地址。 DMA_DIR 参数规定了外设是作为数据传输的目的地,还是数据来源。 DMA_BufferSize参数用来设置一次传输数据量的大小。 DMA_PeripheralInc用来设定外设地址寄存器是否递增。,8.5 DMA应用设计,DMA_MemoryInc 用来设定内存地址寄存

17、器递增与否。DMA_PeripheralDataSize 设定了外设数据宽度。DMA_MemoryDataSize 设定了内存数据宽度。,8.5 DMA应用设计,DMA_Mode 设置了DMA的工作模式(循环、正常)。DMA_Priority 设定DMA通道x的软件优先级,它一共有4个优先级,DMA_M2M设置是否是内存到内存的模式传输。,8.5 DMA应用设计,DMA_Init(DMA1_Channel6, ,8.5 DMA应用设计,DMA_ ITConfig(DMA1_ Channel6, DMA_ IT_ TC, ENABLE);,8.5 DMA应用设计,CurrDataCounterB

18、egin = DMA_ GetCurrDataCounter(DMA1_ Channel6);,8.5 DMA应用设计,DMA_ Cmd(DMA1_ Channel6, ENABLE);/开启DMA,8.5 DMA应用设计,8.5.2 DMA使用流程 DMA应用广泛,可完成内存到内存、外设到内存、内存到外设的传输。以使用中断方式为例,其基本使用流程由三部分构成,即NVIC设置、DMA模式及中断配置、中断服务程序。,8.5 DMA应用设计,1. NVIC设置 完成中断分组、中断通道选择、中断优先级设置及使能中断的功能,流程图如图8-2所示。其中值得注意的是通道的选择,对于不同DMA请求,根据表8

19、-7选择相应的DMA通道,中断通道的选择参考第6章。,8.5 DMA应用设计,2. DMA模式及中断配置用来配置DMA工作模式及开启DMA中断。DMA使用的是AHB总线,使用函数RCC_AHBPeriphClockCmd()开启DMA时钟。某外设的DMA通道外设基地址是由该设备的外设基地址加上相应数据寄存器的偏移地址得到的。例如,ADC1外设基地址(0 x4001 2400)加上ADC数据寄存器(ADC_DR)的偏移地址(Ox4C)得到0 x4001 244C,即为ADC1的DMA通道外设基地址。,8.5 DMA应用设计,2. DMA模式及中断配置内存基地址为内存数组地址。传输方向是针对外设说

20、的,即外设为源或目标。缓冲区大小可以为0-65535之间。对于外设而言,地址自增应禁止,对于存储器则需要使用地址自增。数据宽度有三种选择,即字节、半字和字,应根据外设特点选择相应的宽度。传输模式可选为普通模式(传输一次)或者循环模式,在内存到内存传输时,只能选择普通模式。,8.5 DMA应用设计,3.中断服务进入DMA中断后需根据设计完成响应操作,DMA中断服务流程图如图8-4所示。在启动文件中定义了DMA中断的入口,对于不同的中断请求要采用相应的中断函数名。进入中断后首先要检测中断请求是否为所需中断,以防误操作。如果确实是所需中断,则进行中断处理,中断处理完成后清除中断标志位,避免重复处于中

21、断。,8.5 DMA应用设计,8.5.3 DMA数据传输应用实例 利用DMA通道6将处理器片内Flash中的32位数据缓冲区的内容传送到RAM中所定义的缓冲区内。在传输完成后产生传输完成中断,最后将源缓冲区中数据与目的缓冲区中数据对比来检测所有数据是否传输正确。 由于进行片内存储器到存储器之间的数据传输,因此无需硬件连接。根据设计要求,程序完成以下工作: (1)设置DMA通道6,实现Flash到RAM的DMA传输; (2)通过串口将传输的状态及内容输出; (3)启动DMA,传输结束后比较源数据与目的数据,检测传输结果。 DMA数据传输程序流程图如图8-5所示:,8.5 DMA应用设计,8.5.

22、3 DMA数据传输应用实例,8.5 DMA应用设计,8.5.3 DMA数据传输应用实例int main(void) uint32_t count; TestStatus TransferStatus = FAILED; NVIC_Config(); USART_Config(); DMA_Config(); delay(); printf(nThis is a DMA test!n); printf(Boot success!n); /等待传送结束,在传输完成中断中读取当前数据量的值 while (CurrDataCounterEnd!=0);/DMA传送过程,8.5 DMA应用设计,8.5.

23、3 DMA数据传输应用实例 printf(Complete transfer!n); /输出源数据内容 printf(nThe contents of the SRC_Const_Buffer are:); for(count=0; countBufferSize; count+) if(count%4 = 0) printf(n); printf(0 x% -9x,SRC_Const_Buffercount); ,8.5 DMA应用设计,8.5.3 DMA数据传输应用实例 /输出目的数据内容 printf(nnThe contents of the DST_Buffer are:); for

24、(count=0; countBufferSize; count+) if(count%4 = 0) printf(n); printf(0 x% -9x,DST_Buffercount); /比较源数据和目的数据内容是否相同 TransferStatus = Buffercmp(SRC_Const_Buffer, DST_Buffer, BufferSize); if(TransferStatus = FAILED) printf(nDMA test fail!n); else printf(nnDMA test success!n); while(1);,8.5 DMA应用设计,8.5.3

25、 DMA数据传输应用实例void NVIC_Config(void)NVIC_InitTypeDef NVIC_InitStructure;/* DMA中断NVIC配置*/NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC

26、_Init(,8.5 DMA应用设计,8.5.3 DMA数据传输应用实例void USART_Config(void)GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed =

27、 GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA,8.5 DMA应用设计,8.5.3 DMA数据传输应用实例USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity =

28、USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, ,8.5.3 DMA数据传输应用实例,void DMA_Config(void)DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);D

29、MA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DST_Buffer;DMA_ InitStructure.DMA_DIR=DMA_ DIR_PeripheralSRC;/缓冲区大小,065535DMA_ InitStructure.DMA_ BufferSize=BufferS ize;/外设地址自增1DMA_ InitStructure.DMA_ PeripheralInc=DMA_ Peripheral

30、Inc_ Enable;/RAM地址自增1DMA_ InitStructure.DMA_MemoryInc=DMA_ MemoryInc_ Enable;/外设数据宽度DMA_ InitStructure.DMA PeripheralDataSize=DMA PeripheralDataSize_Word;,8.5.3 DMA数据传输应用实例,/RAM数据宽度DMA_ InitStructure.DMA_MemoryDataSize=DMA_ MemoryDataSize_Word;/传输模式,一次传送DMA_ InitStructure.DMA_Mode=DMA_Mode_ Normal;/

31、优先级高DMA_ InitStructure.DMA_ Priority=DMA_ Priority_High;/内存到内存传输DMA_ InitStructure.DMA_M2M=DMA_ M2M_ Enable;DMA_ Init(DMA1_ Channel6, ,8.5 DMA应用设计,TestStatus Buffercmp(const uint32_t* pBuffer, uint32_t* pBuffer1, uint16_t BufferLength) while(BufferLength-) if(*pBuffer != *pBuffer1) return FAILED; pB

32、uffer+; pBuffer1+; return PASSED;,8.5 DMA应用设计,void DMA1_ Channel6_IRQHandler(void) /*检测DMA 1 Channel6传输完成中断*/ if(DMA_ GetITStatus(DMA1_ IT_ TC6) /*传输完成后得到当前计数*/ CurrDataCounterEnd=DMA_ GetCurrDataCounter(DMA1_ Channel6); /*清除中断*/ DMA_ ClearITPendingBit(DMA1_ IT_ GL6); ,DMA应用实例2串口发送数据,例:按K2键,串口2使用DMA

33、方式传送10个字符数据unsigned char uart2_trx256, uart2_tx, uart2_rx;unsigned char tx2buff11 = 0 x1, 0 x2, 0 x3, 0 x4, 0 x5, 0 x11,0 x12,0 x13,0 x14,0 x15;,DMA应用实例2串口发送数据,int main(void) SystemInit (); /定义系统定时器 usart2_conf(); /初始化串口 gpio_conf(); /初始化IO口 while (1) key_work(); /调用键盘扫描 if(uart2_rx != uart2_tx) Uar

34、t2_PutChar(uart2_trxuart2_tx+) ; /USART_SendData(USART2, uart2_trxuart2_tx+ ); ,DMA应用实例2串口发送数据,void usart2_conf(void) USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; / 使能PA外设时钟、复用时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2P

35、eriph_AFIO, ENABLE); /使能串口2外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,DMA应用实例2串口发送数据,USART_InitStructure.USART_BaudRate = 115200

36、; /串口速率为115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b;/ 8位数据传输 USART_InitStructure.USART_StopBits = USART_StopBits_1;/ 1个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; / 无校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/无流量控制 USART_Init

37、Structure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, /使能串口2,DMA应用实例2串口发送数据,void Uart2_PutChar(unsigned char data) USART_SendData(USART2, data); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) = RESET);/等待数据发送完毕void USART2_IRQHandler(void) if(USART_GetITStatus(USART2, USART_IT_R

38、XNE) != RESET) uart2_trxuart2_rx+ = USART_ReceiveData(USART2);/把接收到数据写入到缓存中 ,void dma_usart2_tx(void) DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/DMA1时钟使能 DMA_DeInit(DMA1_Channel7); DMA_InitStructure.DMA_PeripheralBaseAddr = 0 x40004404;/串口2(DR)发射基地址; DMA_In

39、itStructure.DMA_MemoryBaseAddr = (uint32_t) tx2buff;/DMA内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;/外设作为数据传输的目的地址 DMA_InitStructure.DMA_BufferSize = (uint16_t)10;/DMA缓存大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外设地址不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryI

40、nc_Enable; /内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;/8位外设数据宽度 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;/8位内存外设数据宽度 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;/正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DM

41、A_M2M = DMA_M2M_Disable;/没有设置内存到内存传输 DMA_Init(DMA1_Channel7, / DMA1通道7使能,DMA应用实例2串口发送数据,void gpio_conf(void) GPIO_InitTypeDef GPIO_InitStructure; /* GPIOB 外设时钟使能 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); /* 配置PB3-7外设为输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3

42、| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP; GPIO_Init(GPIOB, ,DMA应用实例2串口发送数据,void key1(void) LED1B(); uart2_trxuart2_rx+ = 0X31; void key2(void) LED2B(); uart2_trxuart2_rx+ = 0X32; dma_usart2

43、_tx();,调试结果:按K1键,LED1跳变一次,串口调试助手接收区显示31;按K2键,LED2跳变1次,串口调试助手增加显示”32 01 02 03 04 05 11 12 13 14 15”这11个数。,/ 定义LED1的亮灭和跳变#define LED1ON() GPIOB-ODR |= GPIO_Pin_7;#define LED1OFF() GPIOB-ODR ,DMA应用实例2DMA中断接收数据,例:利用串口调试助手给串口2发送数据,当发送10个数据时,跳变LED1,并将数据回传上位机。,unsigned char uart2_trx256,uart2_tx,uart2_rx;u

44、nsigned char rx2buff30 ;void usart2_conf(void) USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); / 使能PA外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);/ 使能串口2外设时钟 GPIO_PinAFCo

45、nfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);/ 配置PA2为AF_1外设 GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);/ 配置PA3为AF_1外设 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; /使用外设功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Pu

46、Pd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_Init(GPIOA, ,USART_InitStructure.USART_BaudRate = 115200; /串口速率为115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b;/ 8位数据传输 USART_InitStructure.USART_StopBits = USART_StopBits_1;/ 1个停止位 USART_InitStructure.

47、USART_Parity = USART_Parity_No; / 无校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/无流量控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, /使能串口2,void Uart2_PutChar(unsigned char data) USART_SendData(USART2, data); while(USART_GetF

48、lagStatus(USART2, USART_FLAG_TXE) = RESET);/等待数据发送完毕void USART2_IRQHandler(void) if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) uart2_trxuart2_rx+ = USART_ReceiveData(USART2);/把接收到数据写入到缓存中 #define LED1B() GPIOB-ODR = GPIO_Pin_7;void DMA1_Channel4_5_IRQHandler(void) LED1B(); dma_usart2_rx();/初

49、始化并使能串口2接收使能 for(unsigned char i=0;i10;i+) uart2_trxuart2_rx+ = rx2buffi; ,void dma_usart2_rx(void) DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/DMA1时钟使能 DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr

50、= 0 x40004424;/串口2接收基地址; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rx2buff;/DMA内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;/外设为数据传输源地址。 DMA_InitStructure.DMA_BufferSize = (uint16_t)10;/DMA缓存大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外设地址储存器不变 DMA_InitStruct

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号