main.h文件
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "dma.h"
int main (void){//主程序
u8 i;
//RCC_Configuration(); //时钟设置
uart_init(115200); //串口初始化(参数是波特率)
printf("STM32 DMA TEST!\r\n");
printf("dataA:");
for(i=0;i<Size;i++)
{
printf("%d ",dataA[i]);
}
printf("\r\n");
printf("dataB:");
for(i=0;i<Size;i++)
{
printf("%d ",dataB[i]);
}
printf("\r\n");
DMA_config((u32) dataA,(u32) dataB,Size);
printf("dataB:");
for(i=0;i<Size;i++)
{
printf("%d ",dataB[i]);
}
printf("\r\n");
while(1){
// printf("STM32F103 hell word"); //纯字符串发送数据到串口
// printf("\r\n");
// delay_s(1); //延时1秒
}
}
dma.h文件
#ifndef __DMA_H
#define __DMA_H
#include "stm32f10x.h" //STM32头文件
#define Size 8
extern const u8 dataA[8]; //相当外设地址
extern u8 dataB[8]; //相当内存地址
void DMA_config(u32 src_addr,u32 dst_addr,u32 data_size);
#endif
dma.c文件
#include "dma.h"
#include "stm32f10x.h" //STM32头文件
const u8 dataA[8]={1,2,3,4,5,6,7,8}; //相当外设地址
u8 dataB[8]; //相当内存地址
void DMA_config(u32 src_addr,u32 dst_addr,u32 data_size)
{
DMA_InitTypeDef DMA_InitStructure;
/* Enable DMA1 clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA1 channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)src_addr;//外设站点起始的地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)dst_addr;//存储器的地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向 从外设站点搬到存储器站点
DMA_InitStructure.DMA_BufferSize = data_size;//数据量(字节数小于65535)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//外设地址需要自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//地址需要自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//宽度 字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //单次
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//优先级设置高级
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;//使能 存储器到存储器的搬运
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
}