我们将利用 STM32F1 的 DMA 来实现串口数据传送,并在 TFTLCD 模块上显示当前的传送进度。
DMA ,全称为:Direct Memory Access,即直接存储器访问, DMA 传输将数据从一个
地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由
DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的
内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工
作。 DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接
控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备
开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。
STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有 7 个通道。DMA2 有 5 个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起
来协调各个 DMA 请求的优先权。
STM32 的 DMA 有以下一些特性:
●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
●在七个请求间的优先权可以通过软件编程设置 ( 共有四级:很高、高、中等和低 ) ,假如
在相等优先权时由硬件决定 ( 请求 0 优先于请求 1 ,依此类推 ) 。
●独立的源和目标数据区的传输宽度 ( 字节、半字、全字 ) ,模拟打包和拆包的过程。源和
目标地址必须按数据传输宽度对齐。
●支持循环的缓冲器管理
●每个通道都有 3 个事件标志 (DMA 半传输, DMA 传输完成和 DMA 传输出错 ) ,这 3 个
事件标志逻辑或成为一个单独的中断请求。
●存储器和存储器间的传输
●外设和存储器,存储器和外设的传输
●闪存、 SRAM 、外设的 SRAM 、 APB1 APB2 和 AHB 外设均可作为访问的源和目标。
●可编程的数据传输数目:最大为 65536
STM32F103ZET6 有两个 DMA 控制器, DMA1 和 DMA2 ,本章,我们仅针对 DMA1 进行
介绍。
从外设( TIMx 、 ADC 、 SPIx 、 I2Cx 和 USARTx )产生的 DMA 请求,通过逻辑或输入到
DMA 控制器,这就意味着同时只能有一个请求有效。外设的 DMA 请求,可以通过设置相应的
外设寄存器中的控制位,被独立地开启或关闭。
DMA1 各通道一览表:
里解释一下上面说的逻辑或,例如通道 1 的几个 DMA1 请求(ADC1、TIM2_CH3,TIM4_CH1), 这几个是通过逻辑或到通道 1 的,这样我们在同一时间,就只能使用其中的一个。其他通道也是类似的。
DMA1 通道 4 的配置步骤:
1. 使能 DMA 时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能 DMA 时钟
2. 初始化 DMA 通道 4 参数
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct)
3. 使能串口 DMA 发送
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
4. 使能 DMA1 通道 4,启动传输。
DMA_Cmd(DMA_CHx, ENABLE);
5. 查询 DMA 传输状态
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG) // 查询 DMA 传输通道的状态
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx) //是获取当前剩余数据量大小
硬件资源有:指示灯 DS0 KEY0 按键 串口 TFTLCD 模块 DMA
利用外部按键 KEY0 来控制 DMA 的传送,每按一次 KEY0,DMA 就传送一次数据到
USART1,然后在 TFTLCD 模块上显示进度等信息。DS0 还是用来做为程序运行的指示灯。