1.一次转运
MyDMA.c
#include "stm32f10x.h" // Device header
uint16_t MyDMA_Size;
void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_IS;
DMA_IS.DMA_PeripheralBaseAddr= AddrA ;//外设起始地址
DMA_IS.DMA_PeripheralDataSize= DMA_PeripheralDataSize_Byte ; //外设数据宽度
DMA_IS.DMA_PeripheralInc= DMA_PeripheralInc_Enable ; //外设是否自增
DMA_IS.DMA_MemoryBaseAddr= AddrB ; //存储器起始地址
DMA_IS.DMA_MemoryDataSize= DMA_MemoryDataSize_Byte ; //存储器数据宽度
DMA_IS.DMA_MemoryInc= DMA_MemoryInc_Enable ; //存储器是否自增
DMA_IS.DMA_DIR=DMA_DIR_PeripheralSRC; //方向:外设到存储器,若要反向则为DMA_DIR_PeripheralDST
DMA_IS.DMA_BufferSize=Size;
DMA_IS.DMA_Mode=DMA_Mode_Normal; //正常模式,不自动重装
DMA_IS.DMA_M2M=DMA_M2M_Enable;
DMA_IS.DMA_Priority=DMA_Priority_VeryHigh ;//优先级:最高优先级
DMA_Init(DMA1_Channel1, &DMA_IS);
DMA_Cmd(DMA1_Channel1,ENABLE);//使能
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyDMA.h"
uint8_t DataA[] = {0x01, 0x02, 0x03, 0x04};
uint8_t DataB[] = {0, 0, 0, 0};
int main(void)
{
OLED_Init();
OLED_ShowHexNum(1,1,DataA[0],2);
OLED_ShowHexNum(2,1,DataA[1],2);
OLED_ShowHexNum(3,1,DataA[2],2);
OLED_ShowHexNum(4,1,DataA[3],2);
OLED_ShowHexNum(1,4,DataB[0],2);
OLED_ShowHexNum(2,4,DataB[1],2);
OLED_ShowHexNum(3,4,DataB[2],2);
OLED_ShowHexNum(4,4,DataB[3],2);
MyDMA_Init((uint32_t)DataA, (uint32_t)DataB, 4);
OLED_ShowHexNum(1,7,DataA[0],2);
OLED_ShowHexNum(2,7,DataA[1],2);
OLED_ShowHexNum(3,7,DataA[2],2);
OLED_ShowHexNum(4,7,DataA[3],2);
OLED_ShowHexNum(1,10,DataB[0],2);
OLED_ShowHexNum(2,10,DataB[1],2);
OLED_ShowHexNum(3,10,DataB[2],2);
OLED_ShowHexNum(4,10,DataB[3],2);
while (1)
{
}
}
一次转运,仅用于熟悉DMA的配置,配置中都有注释,同时谨记查阅手册
2.DMA数据转运
MyDMA.c
#include "stm32f10x.h" // Device header
uint16_t MyDMA_Size;
void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)
{
MyDMA_Size=Size;;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_IS;
DMA_IS.DMA_PeripheralBaseAddr= AddrA ;//外设起始地址
DMA_IS.DMA_PeripheralDataSize= DMA_PeripheralDataSize_Byte ; //外设数据宽度
DMA_IS.DMA_PeripheralInc= DMA_PeripheralInc_Enable ; //外设是否自增
DMA_IS.DMA_MemoryBaseAddr= AddrB ; //存储器起始地址
DMA_IS.DMA_MemoryDataSize= DMA_MemoryDataSize_Byte ; //存储器数据宽度
DMA_IS.DMA_MemoryInc= DMA_MemoryInc_Enable ; //存储器是否自增
DMA_IS.DMA_DIR=DMA_DIR_PeripheralSRC; //方向:外设到存储器,若要反向则为DMA_DIR_PeripheralDST
DMA_IS.DMA_BufferSize=Size;
DMA_IS.DMA_Mode=DMA_Mode_Normal; //正常模式,不自动重装
DMA_IS.DMA_M2M=DMA_M2M_Enable;
DMA_IS.DMA_Priority=DMA_Priority_VeryHigh ;//优先级:最高优先级
DMA_Init(DMA1_Channel1, &DMA_IS);
DMA_Cmd(DMA1_Channel1,DISABLE);//使能
}
void DMA_Tf(void){
DMA_Cmd(DMA1_Channel1,DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);
DMA_Cmd(DMA1_Channel1,ENABLE);
while (DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);//完成标志位
DMA_ClearFlag(DMA1_FLAG_TC1);//清除标志位
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyDMA.h"
uint8_t DataA[] = {0x01, 0x02, 0x03, 0x04};
uint8_t DataB[] = {0, 0, 0, 0};
int main(void)
{
OLED_Init();
OLED_ShowHexNum(1,1,DataA[0],2);
OLED_ShowHexNum(2,1,DataA[1],2);
OLED_ShowHexNum(3,1,DataA[2],2);
OLED_ShowHexNum(4,1,DataA[3],2);
OLED_ShowHexNum(1,4,DataB[0],2);
OLED_ShowHexNum(2,4,DataB[1],2);
OLED_ShowHexNum(3,4,DataB[2],2);
OLED_ShowHexNum(4,4,DataB[3],2);
MyDMA_Init((uint32_t)DataA, (uint32_t)DataB, 4);
OLED_ShowHexNum(1,7,DataA[0],2);
OLED_ShowHexNum(2,7,DataA[1],2);
OLED_ShowHexNum(3,7,DataA[2],2);
OLED_ShowHexNum(4,7,DataA[3],2);
OLED_ShowHexNum(1,10,DataB[0],2);
OLED_ShowHexNum(2,10,DataB[1],2);
OLED_ShowHexNum(3,10,DataB[2],2);
OLED_ShowHexNum(4,10,DataB[3],2);
while (1)
{
DataA[0] ++;
DataA[1] ++;
DataA[2] ++;
DataA[3] ++;
OLED_ShowHexNum(1,7,DataA[0],2);
OLED_ShowHexNum(2,7,DataA[1],2);
OLED_ShowHexNum(3,7,DataA[2],2);
OLED_ShowHexNum(4,7,DataA[3],2);
OLED_ShowHexNum(1,10,DataB[0],2);
OLED_ShowHexNum(2,10,DataB[1],2);
OLED_ShowHexNum(3,10,DataB[2],2);
OLED_ShowHexNum(4,10,DataB[3],2);
Delay_ms(2000);
DMA_Tf();
OLED_ShowHexNum(1,7,DataA[0],2);
OLED_ShowHexNum(2,7,DataA[1],2);
OLED_ShowHexNum(3,7,DataA[2],2);
OLED_ShowHexNum(4,7,DataA[3],2);
OLED_ShowHexNum(1,10,DataB[0],2);
OLED_ShowHexNum(2,10,DataB[1],2);
OLED_ShowHexNum(3,10,DataB[2],2);
OLED_ShowHexNum(4,10,DataB[3],2);
Delay_ms(2000);
}
}