基本作用:DMA是直接存储器存取,高速数据传输,主要是外设到存储器或者这存储器到存储器的数据传输。
配置:各芯片配置不同,需要查询手册,这里使用的是STM32F407VGT6,有两个DMA控制器,分别为DMA1和DMA2,各八个通道,总共16个通道。每一个都支持软件触发和特定硬件触发。其中硬件触发针对使用外设,主要是外设的数据有触发的时机,采用硬件触发的模式配合。
主要参数:
起始地址:决定数据来源和去向
数据宽度:指定一次转运的数据宽度,一般有8位,16位,32位
地址是否自增:指针概念,DMA搬运完一次数据,地址后是否从头开始
传输计时器:自检DMA传输次数,配合自动重装器,可以循环重复设定DMA的传输转运次数,可以视为DMA的一轮工作
M2M:0为硬件触发,1为软件触发
DMA使用条件:DMA使能、传输计数器大于0,必须要有触发信号,这里写入传输计数器时,必须要先关闭DMA,写入,再使能。
硬件触发外设使用注意:针对外设请求,各个芯片有规定好DMA外设请求的信号对应的通道,必须对应才能正常使用。如果是软件触发可以任意选择。STM32F407VGT6的DMA对应可以参考:
数据宽度对齐:DMA可以8对8 8对16 16对8等转换,把小的数据转到大,高位补零;把大的数据转到小中,高位舍去。
提供一个串口DMA,以供参考:
/*初始化*/
static void bsp_initUSART(u32 bound)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*************************************初始化串口1 用于双机通讯*************************************/
/* 使能 GPIO clock */
RCC_AHB1PeriphClockCmd(USARTx_TX_GPIO_CLK|USARTx_RX_GPIO_CLK, ENABLE);
/* 使能 USART clock */
USARTx_CLK_INIT(USARTx_CLK, ENABLE);
/* 使能 DMA clock */
RCC_AHB1PeriphClockCmd(USARTx_DMAx_CLK, ENABLE);
/* USART1 GPIO configuration -----------------------------------------------*/
/* Connect USART pins to AF7 */
GPIO_PinAFConfig(USARTx_TX_GPIO_PORT, USARTx_TX_SOURCE, USARTx_TX_AF);
GPIO_PinAFConfig(USARTx_RX_GPIO_PORT, USARTx_RX_SOURCE, USARTx_RX_AF);
/* Configure USART Tx and Rx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
/* When using Parity the word length must be configured to 9 bits */
USART_InitStructure