6.1DMA数据转运

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);
	}
}

接线图

演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值