《第8章直接存储器存取ppt课件.ppt》由会员分享,可在线阅读,更多相关《第8章直接存储器存取ppt课件.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式单片机原理及应用电气工程学院仪器科学与工程系电气工程学院仪器科学与工程系 1 ARM嵌入式系统概述2 STM32单片机结构和最小系统 3 基于标准外设库的C语言程序设计基础 4 STM32通用输入输出GPIO5 STM32外部中断6 STM32通用定时器7 STM32通用同步/异步收发器USART8 直接存储器存取DMA9 STM32的模数转换器ADC10 STM32的集成电路总线I2C11 STM32的串行外设接口SPI第第8章章 直接存储器存取直接存储器存取DMA8.1 DMA简介简介DMA用来提供用来提供外设与外设外设与外设之间、之间、外设与存储器之间外设与存储器之间、存储器存储器
2、与存储器之间与存储器之间的高速数据传输,无需的高速数据传输,无需CPU干预,数据可以通干预,数据可以通过过DMA快速传输,节省快速传输,节省CPU的资源。的资源。在实现在实现DMA传输时,由传输时,由DMA控制器直接掌管总线,因此,控制器直接掌管总线,因此,存在着一个存在着一个总线控制权转移总线控制权转移问题,即问题,即DMA传输前,传输前,CPU把总把总线控制权交给线控制权交给DMA控制器,在结束控制器,在结束DMA传输后,传输后,DMA控制控制器立即把总线控制权交回器立即把总线控制权交回CPU。8.2 STM32的的DMA结构结构STM32最多拥有两个最多拥有两个DMA控制器,控制器,DM
3、A1控制器拥有控制器拥有7个独个独立的可配置通道,立的可配置通道,DMA2有有5个独立的可配置通道,每个通道个独立的可配置通道,每个通道用来管理来自于一个或多个外设对存储器访问的请求。用来管理来自于一个或多个外设对存储器访问的请求。STM32F103RBT6只有只有DMA1控制器。控制器。8.2 STM32的的DMA结构结构每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1 ,依此类推) 。 独立数据源和目标数据区
4、的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。STM32的DMA主要特性如下:8.2 STM32的的DMA结构结构支持循环的缓冲器管理 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。存储器和存储器间的传输 、外设和存储器、存储器和外设之间的传输闪存、SRAM 、外设的SRAM 、APB1、APB2和AHB外设均可作为访问的源和目标。可编程的数据传输数目:最大为65535STM32的DMA主要特性如下(续):8.2 STM32的的DMA结构结构DMA1模块的通道和外设的对照表使用D
5、MA的通道的时候,每一个通道对应的外设是不一样的,需要根据相应的外设来选择DMA的通道 DMA DMA是是AHBAHB总线上的设备,它有总线上的设备,它有2 2个个AHBAHB端口端口: :一个是一个是从从端口端口,用于,用于配置配置DMADMA,一个是,一个是主端口主端口,用于,用于设备间数据设备间数据传输传输。两个。两个AHB/APBAHB/APB桥在桥在AHBAHB和两个和两个APBAPB总线间提供同步总线间提供同步连接。连接。APB1APB1操作速度限于操作速度限于36MHz36MHz,APB2APB2操作速度限于操作速度限于72MHz72MHz。 8.2 STM32的的DMA结构结构
6、循环优先调度 NVIC和Cortex-M3处理器实现了高性能低延时中断调度。所有的Cortex-M3指令既可以在单周期内执行,也可以在总线周期上被中断。循环优先级调度能够确保CPU在必要的时候每两个总线周期就去访问其它总线。多层结构和总线挪用 多层结构允许两个主要设备并行执行数据传输。使用总线挪用存取机制,CPU访问和DMA通过APB总线存取外设可以并行工作。DMA总线挪用机制使得总线利用效率更高,减少软件执行时间。在Cortex-M3哈佛架构下提高数据的并行性,减少执行时间,优化DMA效率。总线矩阵有两个主要特征: 循环优先调度、多层结构和总线挪用。8.3 DMA相关寄存器相关寄存器DMA的
7、功能是通过操作两类寄存器实现的:一类是具有DMA功能的相关外设寄存器,主要用来设置外设开主要用来设置外设开启启DMA功能功能,例如在通用,例如在通用定时器定时器中的中的DMA/中断使能寄存器中断使能寄存器(TIMx_DIER)、DMA控制寄存器控制寄存器(TIMx_DCR)和连续模式的和连续模式的DMA地址寄存器地址寄存器(TIMx_DMAR);通用异步;通用异步/同步收发器同步收发器USART中的控制寄存器中的控制寄存器3(USART_CR3)。)。另一类是DMA相关寄存器,用来设置用来设置DMA的具体工作方式。的具体工作方式。 DMA中断状态寄存器中断状态寄存器(DMA_ISR) DMA中
8、断标志清除寄存器中断标志清除寄存器(DMA_IFCR) DMA通道通道x配置寄存器配置寄存器(DMA_CCRx)(x = 17) DMA通道通道x传输数量寄存器传输数量寄存器(DMA_CNDTRx)(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相关寄存器相关寄
9、存器1. DMA中断状态寄存器中断状态寄存器(DMA_ ISR)该寄存器保存着DMA中断的状态,偏移地址00H,复位值为00000000H,其格式如下:8.3 DMA相关寄存器相关寄存器2. DMA中断标志清除寄存器中断标志清除寄存器(DMA_ IFCR)该寄存器用来清除DMA中断标志,偏移地址04H,复位值为000000H,其格式如下:8.3 DMA相关寄存器相关寄存器2. DMA中断标志清除寄存器中断标志清除寄存器(DMA_ IFCR)该寄存器用来清除DMA中断标志,偏移地址04H,复位值为000000H,其格式如下:8.3 DMA相关寄存器相关寄存器3. DMA通道通道x配置寄存器配置寄
10、存器(DMA_ CCRx)(x=1.7) 该寄存器用来配置DMA工作模式31:15: 保留,始终读为保留,始终读为00MEM2MEM:1:存储器到存储器模式存储器到存储器模式,0:非存储器到存储器模式非存储器到存储器模式PL1:0:通道优先级通道优先级(Channel priority level)这些位由软件设置和清除这些位由软件设置和清除:00:低低, 01:中中, 10:高高,11:最高最高MSIZE1:0:存储器数据宽度存储器数据宽度(Memory size)这些位由软件设置和清除。这些位由软件设置和清除。00:8位位, 01:16位位, 10:32位位,11:保留保留MINC:存储器
11、地址增量模式存储器地址增量模式(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)
12、 该寄存器用来配置DMA工作模式1118.3 DMA相关寄存器相关寄存器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通道
13、通道4错误管理错误管理5DMA请求映射请求映射8.4 DMA的工作过程的工作过程1DMA传送传送DMA传输三要素:传输三要素:传输源:传输源:DMA控制器从传输源读出数据;控制器从传输源读出数据;传输目标:数据传输的目标地址;传输目标:数据传输的目标地址;触发信号:用于触发一次数据传输的动作,执行触发信号:用于触发一次数据传输的动作,执行一个单位的传输源至传输目标的数据传输;用于一个单位的传输源至传输目标的数据传输;用于控制数据传输的时机。控制数据传输的时机。8.4 DMA的工作过程的工作过程1DMA传送传送(过程)(1)IO设备准备好后,向设备准备好后,向DMAC发出发出DMA请求请求;(2
14、)DMAC向向CPU发出总线请求发出总线请求;(3)CPU向向DMAC发出总线响应,总线控制权由发出总线响应,总线控制权由DMAC接管接管(图中阴影所示图中阴影所示)。(4)DMAC向向IO设备发出设备发出DMA响应,按事先设置的初响应,按事先设置的初始地址和传送字节数,依次发送地址和寄存器始地址和传送字节数,依次发送地址和寄存器(或或I/O)读写命令,实现读写命令,实现RAM和和IO设备直接交换数据,直至设备直接交换数据,直至传送完毕。传送完毕。(5)DMA传送结束,撤销向传送结束,撤销向CPU的总线请求,总线响的总线请求,总线响应和应和DMA响应随即失效,响应随即失效,CPU重新控制总线。
15、重新控制总线。8.4 DMA的工作过程的工作过程2仲裁器仲裁器 仲裁器根据通道请求的优先级来启动外设仲裁器根据通道请求的优先级来启动外设/存储器存储器的访问。的访问。 优先权管理分优先权管理分2个阶段:个阶段:l 软件软件:每个通道的优先权可以在:每个通道的优先权可以在DMA_CCRx寄存寄存器器中中设置设置,有,有4个等级:个等级: 最高优先级最高优先级 高优先级高优先级 中等优先级中等优先级 低优先级低优先级 l 硬件硬件:如果:如果2个请求有相同的软件优先级,则较低个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。如编号的通道比较高编号的通道有较高的优先权。如,通
16、道,通道2优先于通道优先于通道4。l 注意:注意: 在大容量产品和互联型产品中,在大容量产品和互联型产品中,DMA1控制控制器拥有高于器拥有高于DMA2控制器的优先级控制器的优先级8.4 DMA的工作过程的工作过程3DMA通道通道每个通道都可以在有每个通道都可以在有固定地址的外设寄存器和存储器固定地址的外设寄存器和存储器地址之间执行地址之间执行DMA传输传输。DMA传输的数据量最大传输的数据量最大65535。包含要传输的数据项数量的寄存器,在每次。包含要传输的数据项数量的寄存器,在每次传输后递减。传输后递减。 可编程的数据宽度:可编程的数据宽度:外设和存储器的传输数据宽度可外设和存储器的传输数
17、据宽度可以通过以通过DMA_CCRx寄存器中的寄存器中的PSIZE和和MSIZE位编程位编程。指针增量:指针增量:设置设置DMA_CCRx寄存器中的寄存器中的PINC和和MINC标志位,外设和存储器的指针在每次传输后自动增量标志位,外设和存储器的指针在每次传输后自动增量修改。增量值取决于所选的数据宽度。第一个传输的修改。增量值取决于所选的数据宽度。第一个传输的地址是存放在地址是存放在DMA_CPARx /DMA_CMARx寄存器中寄存器中地址。在传输过程中,这些寄存器保持不变,软件不地址。在传输过程中,这些寄存器保持不变,软件不能改变和读出当前正在传输的地址。能改变和读出当前正在传输的地址。
18、8.4 DMA的工作过程的工作过程当通道配置为当通道配置为非循环模式非循环模式时,传输结束后时,传输结束后(即传输即传输计数变为计数变为0)将不再产生将不再产生DMA操作。要开始新的操作。要开始新的DMA传输,需要在传输,需要在关闭关闭DMA通道通道的情况下,在的情况下,在DMA_CNDTRx寄存器寄存器中中重新写入传输数目重新写入传输数目。 在在 循 环 模 式循 环 模 式 下 , 最 后 一 次 传 输 结 束 时 ,下 , 最 后 一 次 传 输 结 束 时 ,DMA_CNDTRx寄存器的内容会自动地被重新加载寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设为其初始数值,内部
19、的当前外设/存储器地址寄存存储器地址寄存器也被重新加载为器也被重新加载为DMA_CPARx /DMA_CMARx寄寄存器设定的初始基地址。存器设定的初始基地址。8.4 DMA的工作过程的工作过程4错误管理错误管理 在在DMA读写操作中一旦读写操作中一旦发生总线错误发生总线错误,硬件会自动,硬件会自动的的清除清除发生错误的通道所对应的通道配置寄存器发生错误的通道所对应的通道配置寄存器(DMA_ CCRx)的的EN位,该通道操作被停止,此时位,该通道操作被停止,此时DMA_ ISR寄寄存器中对应该通道的传输错误中断标志位存器中对应该通道的传输错误中断标志位(TEIF)被置位被置位,如果设置了传输错
20、误中断,则产生中断。如果设置了传输错误中断,则产生中断。8.4 DMA的工作过程的工作过程5DMA请求映射请求映射 从外设从外设(TIMx, ADC, SPIx, I2Cx和和USARTx)产生的产生的7个请求,个请求,通过逻辑或输入到通过逻辑或输入到DMA控制器。每个通道对应不同的外设。外设控制器。每个通道对应不同的外设。外设DMA请求可以通过软件设置相应外设寄存器中的控制位,独立的请求可以通过软件设置相应外设寄存器中的控制位,独立的开启或关闭。开启或关闭。8.5 DMA应用设计应用设计8.5.1 DMA常用库函数常用库函数8.5.2 DMA使用流程使用流程8.5.3 DMA数据传输应用实例
21、数据传输应用实例8.5 DMA应用设计应用设计8.5.1 DMA常用库函数常用库函数库函数:库函数:DMA_DeInit函数函数DMA_Init函数函数DMA_StructInit函数函数DMA_Cmd函数函数DMA_ITConfig函数函数DMA_GetCurrDataCounter函数函数DMA_GetFlagStatus函数函数DMA_ClearFlag函数函数DMA_GetITStatus函数函数DMA_ClearITPendingBit函数函数 8.5 DMA应用设计应用设计DMA_InitTypeDef DMA_InitStructure;8.5 DMA应用设计应用设计 DMA_P
22、eripheralBaseAddr 该参数用以定义该参数用以定义DMA外设基地址。外设基地址。 DMA_MemoryBaseAddr 该参数用以定义该参数用以定义DMA内存基地址。内存基地址。 DMA_DIR 参数规定了参数规定了外设外设是是作为作为数据传输的数据传输的目的地目的地,还是,还是数据来源数据来源。 DMA_BufferSize参数用来设置一次传输数据量的大小。参数用来设置一次传输数据量的大小。 DMA_PeripheralInc用来设定外设地址寄存器是否递增。用来设定外设地址寄存器是否递增。8.5 DMA应用设计应用设计 DMA_MemoryInc 用来设定内存地址寄存器递增与否
23、。用来设定内存地址寄存器递增与否。DMA_PeripheralDataSize 设定了外设数据宽度。设定了外设数据宽度。DMA_MemoryDataSize 设定了内存数据宽度。设定了内存数据宽度。8.5 DMA应用设计应用设计DMA_Mode 设置了设置了DMA的工作模式的工作模式(循环、正常循环、正常)。DMA_Priority 设定设定DMA通道通道x的软件优先级,它一共有的软件优先级,它一共有4个优先级个优先级DMA_M2M设置是否是内存到内存的模式传输。设置是否是内存到内存的模式传输。8.5 DMA应用设计应用设计 DMA_Init(DMA1_Channel6, &DMA_InitS
24、tructure);8.5 DMA应用设计应用设计DMA_ ITConfig(DMA1_ Channel6, DMA_ IT_ TC, ENABLE);8.5 DMA应用设计应用设计CurrDataCounterBegin = DMA_ GetCurrDataCounter(DMA1_ Channel6);8.5 DMA应用设计应用设计DMA_ Cmd(DMA1_ Channel6, ENABLE);/开启开启DMA8.5 DMA应用设计应用设计8.5.2 DMA使用流程使用流程 DMA应用广泛,可完成内存到内存、外设到内存、内存到外设的传输。以使用为例,其基本使用流程由三部分构成,即NVIC
25、设置、DMA模式及中断配置、中断服务程序。8.5 DMA应用设计应用设计1. NVIC设置设置 完成中断完成中断分组分组、中断、中断通道选择通道选择、中断、中断优先级设置优先级设置及及使能中断使能中断的功能,流程图如图的功能,流程图如图8-2所示。其中值得注所示。其中值得注意的是通道的选择,对于不同意的是通道的选择,对于不同DMA请求,根据表请求,根据表8-7选择相应的选择相应的DMA通道,中断通道的选择参考第通道,中断通道的选择参考第6章。章。8.5 DMA应用设计应用设计2. DMA模式及中断配置模式及中断配置l 用来配置DMA工作模式及开启DMA中断。l D M A 使 用 的 是使 用
26、 的 是 A H B 总 线 , 使 用 函 数总 线 , 使 用 函 数RCC_AHBPeriphClockCmd()开启开启DMA时钟。某时钟。某外设的外设的DMA通道外设基地址通道外设基地址是由该是由该设备的外设基设备的外设基地址加上相应数据寄存器的偏移地址得到地址加上相应数据寄存器的偏移地址得到的。的。l 例如,例如,ADC1外设基地址外设基地址(0 x4001 2400)加上加上ADC数据寄存器数据寄存器(ADC_DR)的偏移地址的偏移地址(Ox4C)得到得到0 x4001 244C,即为,即为ADC1的的DMA通道外设基地通道外设基地址。址。8.5 DMA应用设计应用设计2. DM
27、A模式及中断配置模式及中断配置内存基地址为内存基地址为内存内存数组地址数组地址。传输方向传输方向是针对外设说的,是针对外设说的,即即外设为源或目标外设为源或目标。缓冲区大小缓冲区大小可以为可以为0-65535之间。之间。对于对于外设外设而言,而言,地址自增应禁止地址自增应禁止,对于,对于存储器存储器则需要则需要使用使用地址自增地址自增。数据宽度数据宽度有三种选择,即有三种选择,即字节、半字和字字节、半字和字,应根据外设特,应根据外设特点选择相应的宽度。点选择相应的宽度。传输模式传输模式可选为可选为普通普通模式模式(传输一次传输一次)或者或者循环循环模式,在内模式,在内存到内存传输时,只能选择普
28、通模式。存到内存传输时,只能选择普通模式。8.5 DMA应用设计应用设计3.中断服务中断服务进入进入DMA中断后需根据设计中断后需根据设计完成响应操作,完成响应操作,DMA中断服中断服务流程图如图务流程图如图8-4所示。所示。在启动文件中定义了在启动文件中定义了DMA中中断的入口,对于断的入口,对于不同的中断不同的中断请求要采用相应的中断函数请求要采用相应的中断函数名名。进入中断后。进入中断后首先要检测首先要检测中断请求是否为所需中断中断请求是否为所需中断,以防误操作。如果确实是所以防误操作。如果确实是所需中断,则进行中断处理,需中断,则进行中断处理,中断处理完成后清除中断标中断处理完成后清除
29、中断标志位志位,避免重复处于中断。,避免重复处于中断。8.5 DMA应用设计应用设计8.5.3 DMA数据传输应用实例数据传输应用实例 利用DMA通道6将处理器片内Flash中的32位数据缓冲区的内容传送到RAM中所定义的缓冲区内。在传输完成后产生传输完成中断,最后将源缓冲区中数据与目的缓冲区中数据对比来检测所有数据是否传输正确。 由于进行片内存储器到存储器之间的数据传输,因此无需由于进行片内存储器到存储器之间的数据传输,因此无需硬件连接。根据设计要求,程序完成以下工作硬件连接。根据设计要求,程序完成以下工作: (1)设置设置DMA通道通道6,实现,实现Flash到到RAM的的DMA传输传输;
30、 (2)通过通过串口串口将传输的状态及内容输出将传输的状态及内容输出; (3)启动启动DMA,传输结束后,传输结束后比较比较源数据与目的数据,检测传源数据与目的数据,检测传输结果。输结果。 DMA数据传输程序流程图如图数据传输程序流程图如图8-5所示所示:8.5 DMA应用设计应用设计8.5.3 DMA数据传输应用实例数据传输应用实例8.5 DMA应用设计应用设计8.5.3 DMA数据传输应用实例数据传输应用实例int main(void) uint32_t count; TestStatus TransferStatus = FAILED; NVIC_Config(); USART_Conf
31、ig(); DMA_Config(); delay(); printf(nThis is a DMA test!n); printf(Boot success!n); /等待传送结束,在传输完成中断中读取当前数据量的值等待传送结束,在传输完成中断中读取当前数据量的值 while (CurrDataCounterEnd!=0);/DMA传送过程传送过程8.5 DMA应用设计应用设计8.5.3 DMA数据传输应用实例数据传输应用实例 printf(Complete transfer!n); /输出源数据内容输出源数据内容 printf(nThe contents of the SRC_Const_
32、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(count=0; countODR |= GPIO_Pin_7;#define LED1OFF() GPIOB-ODR &= GPIO_Pin
33、_7;#define LED1B() GPIOB-ODR = GPIO_Pin_7;/ 定义定义LED2的亮灭和跳变的亮灭和跳变#define LED2ON() GPIOB-ODR |= GPIO_Pin_6;#define LED2OFF() GPIOB-ODR &= GPIO_Pin_6;#define LED2B() GPIOB-ODR = GPIO_Pin_6;/ 定义按键对应定义按键对应IO口口#define KEY1 GPIO_Pin_0;#define KEY2 GPIO_Pin_1;extern unsigned char key_bit;DMA应用实例应用实例2DMA中断接收
34、数据中断接收数据例:利用串口调试助手给串口2发送数据,当发送10个数据时,跳变LED1,并将数据回传上位机。unsigned char uart2_trx256,uart2_tx,uart2_rx;unsigned char rx2buff30 ;void usart2_conf(void) USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIO
35、A, ENABLE); / 使能PA外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);/ 使能串口2外设时钟 GPIO_PinAFConfig(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_S
36、peed = GPIO_Speed_Level_3; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; /串口速率为115200 USART_InitStructure.USART_Wor
37、dLength = 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_InitStructure.USART_Mode = USART_Mode_Rx | USART
38、_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; /串口2中断向量 NVIC_InitStructure.NVIC_IRQChannelPriority = 0; /中断优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /中断使能 NVIC_Init(&NVIC_InitStructure);
39、USART_Cmd(USART2, ENABLE); /使能串口2void 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_RXNE) != RESET) uart2_trxuart2_rx+ = USART_ReceiveData(USART2);
40、/把接收到数据写入到缓存中 #define LED1B() GPIOB-ODR = GPIO_Pin_7;void DMA1_Channel4_5_IRQHandler(void) LED1B(); dma_usart2_rx();/初始化并使能串口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_AHBPeri
41、phClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/DMA1时钟使能 DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = 0 x40004424;/串口2接收基地址; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rx2buff;/DMA内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;/外设为数据传输源地址。 DMA_InitStructure.DMA_BufferS
42、ize = (uint16_t)10;/DMA缓存大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外设地址储存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;/8位外设数据宽度 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDat
43、aSize_Byte;/8位内存外设数据宽度 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;/正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;/没有设置内存到内存传输 DMA_Init(DMA1_Channel5, &DMA_InitStructure); USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); /串口2接收DMA使能 DMA_ITConfi
44、g(DMA1_Channel5, DMA_IT_TC, ENABLE); /DMA1通道5接收完成中断使能 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn; /DMA4_5中断向量 NVIC_InitStructure.NVIC_IRQChannelPriority = 2; /中断优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /中断使能 NVIC_Init(&NVIC_InitStructure); DMA_Cmd(DMA1_Channel5, ENABLE);/
45、DMA1通道4使能int main(void) if (SysTick_Config(SystemCoreClock / 100) /定义节拍定时器每10ms中断一次 while (1); SystemInit (); /定义系统定时器 usart2_conf(); /初始化串口 gpio_conf(); /初始化IO口 dma_usart2_rx(); /初始化串口2接收DMA中断 while (1) key_work(); /调用键盘扫描 if(uart2_rx != uart2_tx) Uart2_PutChar(uart2_trxuart2_tx+) ; /USART_SendData(USART2, uart2_trxuart2_tx+ ); 调试结果:打开串口调试助手,通过其发送数据。发送10个数据以内时系统无反应,当发送到10个数据时,LED1跳变1次,开发板上串口2把前面收到的10个数据回传上位机。