STM32的DMA模块及Protues仿真实验

(一)DMA简介

     DMA(Direct Memory Access,直接存储器访问), 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。
     STM32F407共有两个 DMA 控制器,总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理 一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每 个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。

(二)DMA 主要特性

● 双 AHB 主总线架构,一个用于存储器访问,另一个用于外设访问
● 仅支持 32 位访问的 AHB 从编程接口
● 每个 DMA 控制器有 8 个数据流,每个数据流有多达 8 个通道(或称请求)
● 支持外设到存储器、存储器到外设和存储器到存储器之间进行数据传输
● DMA 数据流请求之间的优先级可用软件编程(4 个级别:非常高、高、中、低),在软
件优先级相同的情况下可以通过硬件决定优先级(例如,请求 0 的优先级高于请求 1)
● 要传输的数据项的数目可以由 DMA 控制器或外设管理:
— DMA 流控制器:要传输的数据项的数目是 1 到 65535,可用软件编程
— 外设流控制器:要传输的数据项的数目未知并由源或目标外设控制,这些外设通过硬件发出传输结束的信号

(三)DMA 功能说明

1. DMA 框图

STM32的DMA模块及Protues仿真实验_第1张图片

2.简要说明

DMA 控制器执行直接存储器传输:因为采用 AHB 主总线,它可以控制 AHB 总线矩阵来启
动 AHB 事务。
它可以执行下列事务:
● 外设到存储器的传输
● 存储器到外设的传输
● 存储器到存储器的传输
DMA 控制器提供两个 AHB 主端口:AHB 存储器端口(用于连接存储器)和 AHB 外设端口
(用于连接外设)。但是,要执行存储器到存储器的传输,AHB 外设端口必须也能访问存储器。
AHB 从端口用于对 DMA 控制器进行编程(它仅支持 32 位访问)。

(四)编程示例

1.要求
  • 用DMA控制串口发送数据,实现终端每收到一串数据后,LED灯就翻转一次
  • 用protues仿真原理图如下:

STM32的DMA模块及Protues仿真实验_第2张图片

2. STM32CubeMX参数配置

STM32的DMA模块及Protues仿真实验_第3张图片这里系统时钟采用8MHz,APB1和APB2总线分频系数都是2
STM32的DMA模块及Protues仿真实验_第4张图片

3. 主要代码
/*DMA中断回调函数*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);  //LED状态翻转
}
/*主函数功能*/
int main(void)
{
	 HAL_Init();
  	 SystemClock_Config();
     MX_GPIO_Init();
     MX_DMA_Init();
     MX_USART2_UART_Init();
	 #define TxBufferMaxNum 300
	 uint8_t TxBuffer[TxBufferMaxNum];
	 uint16_t TxNum;
	 for(TxNum=0;TxNum<TxBufferMaxNum;TxNum++)
     {
		  TxBuffer[TxNum] = 48 + TxNum % 10; 
	 }
	 HAL_UART_Transmit_DMA(&huart2, TxBuffer, sizeof(TxBuffer));
     while (1)
     {}
}

该程序实现的功能是让串口每发送300个数据,LED灯的状态进行一次翻转

4. 运行结果

STM32的DMA模块及Protues仿真实验_第5张图片

你可能感兴趣的:(stm32,嵌入式)