DMA配置的一般步骤:
①:使能DMA时钟
RCC_AHBPeriphClockCmd();
②:初始化DMA通道参数:
DMA_Init();
③:使能串口DMA发送,串口DMA使能函数
USART_DMACmd();
④:使能DMA1通道,启动传输。
DMA_Cmd();
⑤:查询DMA传输状态:
DMA_GetFlagStatus();
⑥:获取/设置通道当前剩余数据量:
DMA_GetCurrDataConuter();
DMA_SetCurrDataCounter();
先写.h文件
#ifndef __DMA_H
#define __DMA_H
#include "sys.h"
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr);
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);
#endif
再写.c文件
#include "dma.h"
DMA_InitTypeDef DMA_InitStructure;
u16 DMA1_MEM_LEN;
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA_CHx);
DMA1_MEM_LEN=cndtr;
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = cndtr;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA_CHx, &DMA_InitStructure);
}
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE );
DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);
DMA_Cmd(DMA_CHx, ENABLE);
}
最后写.main函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "dma.h"
#define SEND_BUF_SIZE 8200
u8 SendBuff[SEND_BUF_SIZE];
const u8 TEXT_TO_SEND[]={"ALIENTEK Elite STM32F1 DMA ´®¿ÚʵÑé"};
int main(void)
{
u16 i;
u8 t=0;
u8 j,mask=0;
float pro=0;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
LCD_Init();
KEY_Init();
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Elite STM32");
LCD_ShowString(30,70,200,16,16,"DMA TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2015/1/15");
LCD_ShowString(30,130,200,16,16,"KEY0:Start");
j=sizeof(TEXT_TO_SEND);
for(i=0;i<SEND_BUF_SIZE;i++)
{
if(t>=j)
{
if(mask)
{
SendBuff[i]=0x0a;
t=0;
}else
{
SendBuff[i]=0x0d;
mask++;
}
}else
{
mask=0;
SendBuff[i]=TEXT_TO_SEND[t];
t++;
}
}
POINT_COLOR=BLUE;
i=0;
while(1)
{
t=KEY_Scan(0);
if(t==KEY0_PRES)
{
LCD_ShowString(30,150,200,16,16,"Start Transimit....");
LCD_ShowString(30,170,200,16,16," %");
printf("\r\nDMA DATA:\r\n");
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
MYDMA_Enable(DMA1_Channel4);
while(1)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)
{
DMA_ClearFlag(DMA1_FLAG_TC4);
break;
}
pro=DMA_GetCurrDataCounter(DMA1_Channel4);
pro=1-pro/SEND_BUF_SIZE;
pro*=100;
LCD_ShowNum(30,170,pro,3,16);
}
LCD_ShowNum(30,170,100,3,16);
LCD_ShowString(30,150,200,16,16,"Transimit Finished!");
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;
i=0;
}
}
}