1.DMA简介
DMA (Direct Memory Access) ,直接内存存储器,使用它在做数据传输时能够大大减轻CPU的负担。(先就这么简单了解一下
2USART1用DMA方式发送数据
首先应该初始化相关外设。
//配置串口1的硬件参数
USART_DeInit(USART1); //将外设USART1寄存器重设为缺省值
USART_InitStructure.USART_BaudRate = 19200; //设置串口1波特率为19200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置一个帧中传输数据位
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_Mode_Tx; //发送接收使能USART_Init(USART1, &USART_InitStructure);
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; //时钟低电平活动
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; //设置SCLK引脚上时钟输出的极性为低电平
USART_ClockInitStructure.USART_CPHA = USART_CPHA_1Edge; //时钟第一个边沿进行数据捕获
//最后一位数据的时钟脉冲不从SCLK输出
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能USART1接收中断
USART_Cmd(USART1, ENABLE); //使能USART1外设
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟
//设置DMA源:串口1数据寄存器地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( USART1->DR ) );
//DMA内存基地址(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到DMA_InitStructure.DMA_BufferSize = SENDSIZE_MAX; //DMA通道的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_MemoryDataSize_Byte; //内存数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止DMA通道内存到内存传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure); //配置DMA1的4通道
DMA_Cmd (DMA1_Channel4,ENABLE);
先写到这里,我目前理解的不够透彻,等学会了再来完善。