这是本文档旧的修订版!
	
		| 银杏科技有限公司旗下技术文档发布平台 | 
	
		| 技术支持电话 | 0379-69926675-801 | 
	
		| 技术支持邮件 | Gingko@vip.163.com | 
	
		| 技术论坛 | http://www.eeschool.org | 
	
		| 版本 | 日期 | 作者 | 修改内容 | 
	
		| V1.0 | 2020-03-28 | gingko | 初次建立 | 
STM32CubeMX教程十四——DMA实验
1. 在主界面选择File–>New Project   或者直接点击ACCEE TO MCU SELECTOR  
 2. 出现芯片型号选择,搜索芯片的型号,双击型号,或者点击Start Project进入配置
在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等,可以帮助用户查找芯片。本实验选取的芯片型号为:STM32F407IGTx。
2. 出现芯片型号选择,搜索芯片的型号,双击型号,或者点击Start Project进入配置
在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等,可以帮助用户查找芯片。本实验选取的芯片型号为:STM32F407IGTx。
 3. 配置RCC,使用外部时钟源
3. 配置RCC,使用外部时钟源
 4. 配置调试引脚
4. 配置调试引脚
 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output
5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output
 6. 引脚模式配置
6. 引脚模式配置
 7. 配置DMA
7. 配置DMA
 8. 时钟源设置,选择外部高速时钟源,配置为最大主频
8. 时钟源设置,选择外部高速时钟源,配置为最大主频
 9.  工程文件的设置, 这里就是工程的各种配置,我们只用到有限几个,其他的默认即可  IDE我们使用的是 MDK5
9.  工程文件的设置, 这里就是工程的各种配置,我们只用到有限几个,其他的默认即可  IDE我们使用的是 MDK5
 10. 点击Code Generator,进行进一步配置
10. 点击Code Generator,进行进一步配置
 
-  Copy all used libraries into the project folder 
-  将HAL库的所有.C和.H都复制到所建工程中 
-  Copy only the necessary library files 
-  只复制所需要的.C和.H(推荐) 
-  Add necessary library files as reference in the toolchain project configuration file 
-  不复制文件,直接从软件包存放位置导入.C和.H 
-  自行选择方式即可 
11. 然后点击GENERATE CODE  创建工程
 创建成功,打开工程。
创建成功,打开工程。
 
实验十四:DMA实验——储存器到存储器的传输
一、 实验目的与意义
-  了解STM32 DMA结构。 
-  了解STM32 DMA特征。 
-  掌握DMA的使用方法。 
-  掌握STM32 HAL库中DMA属性的配置方法。 
-  掌握KEIL  MDK集成开发环境使用方法。 
 
二、 实验设备及平台
- 
- 
-  Micro USB线缆。 
-  Keil MDK 开发平台。 
-  STM32CubeMX开发平台。 
-  装有WIN XP(及更高版本)系统的计算机。 
 
三、 实验原理
-  DMA简介 
-  DMA,全称为“Direct Memory Access”,即直接存储器访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样在很大程度上减轻了CPU资源占有率,可以极大地节省系统资源。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word DMA(多字节DMA)两种。 
-  DMA工作原理 - 
-  DMA 允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把他们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。 
-  DMA 传输主要地将一个内存区从一个装置复制到另外一个。当 CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存去。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。所以,DMA传输对于高效能嵌入式系统算法和网络是很重要的。 
 
-  DMA类别 
-  按键主要有两种类型:单字节DMA、多字节DMA。 
-  本实验采用DMA2控制器的数据流0,选用通道0进行数据传输。通过LED的颜色来判断传输是否成功。 
 
四、 实验程序
1. 主函数
-  DMA外设基地址:在此定义src_buffer数组作为DMA传输数据源,const 关键字将src_buffer数组变量定义为常量类型,表示数据存储在内部FLASH中。 
-  DMA存储器地址:在此定义dst_buffer数组作为DMA传输目标存储器,存储在内部SDAM中。 
 
2. DMA相关结构体定义
-  DMA的名称定义,这个结构体中存放了DMA所有用到的功能,后面的别名 
-  hdma_memtomem_dma2_stream0就是我们所用的DMA的别名,在此采用DMA2控制器的数据流0,选用通道0进行数据传输。 
-  上述DMA_HandleTypeDef包含了指向寄存器的指针、互斥锁、一个描述状态的变量、一个保存错误代码的变量、指向DMA结构体的指针等。所有对DMA进行操作的函数都使用这个结构体的指针作为参数。 
-  DMA_Channel: DMA 请求通道选择,可选通道 0 至通道 7,每个外设对应固定的通道。 
-  DMA_PeripheralBaseAddr:外设地址,一般设置为外设的数据寄存器地址,如果是存储器到存储器模式,则设置为其中一个存储区地址。 
-  DMA_DIR:传输方向选择,可选外设到存储器、存储器到外设以及存储器到存储器。 
-  DMA_PeripheralInc:如果配置为 DMA_PeripheralInc_Enable,使能外设地址自动递增功能。 
-  DMA_MemoryInc:如果配置为 DMA_MemoryInc_Enable,使能存储器地址自动递增功能。 
-  DMA_PeripheralDataSize:外设数据宽度,可选字节(8 位)、半字(16 位)和字(32位)。 
-  DMA_MemoryDataSize:存储器数据宽度,可选字节(8 位)、半字(16 位)和字(32位)。 
-  DMA_Priority:软件设置数据流的优先级,有 4 个可选优先级分别为非常高、高、中和低。 
-  DMA_MemoryBurst:存储器突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式。 
-  DMA_PeripheralBurst:外设突发模式选择,可选单次模式、 4 节拍的增量突发模式、 8 节拍的增量突发模式或 16 节拍的增量突发模式。 
 
3. DMA相关函数
 
-  参数: - 
-  DMA_HandleTypeDef *hdma为DMA的别名,在本实验中即指DMA2的通道0 
-  uint32_t SrcAddress 		 DMA外设基地址 
-  uint32_t DstAddress  		 DMA存储器地址 
-  uint32_t DataLength		 发送的数据长度 
 
-  DMA获取传输标志位 
 
 
五、 实验步骤
-  把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连); 
-  把iCore3通过Micro USB线与计算机相连,为iCore3供电; 
-  打开Keil MDK 开发环境,并打开本实验工程; 
-  烧写程序到iCore3上; 
-  也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 
 
六、 实验现象
实验成功,iCore3 双核心板蓝色LED灯点亮;实验失败,红色LED灯闪烁。