DMA双向传输 stm32F407

#define SEND_BUF_SIZE 80	//·¢ËÍÊý¾Ý³¤¶È,×îºÃµÈÓÚsizeof(TEXT_TO_SEND)+2µÄÕûÊý±¶.
#define Receice_BUF_SIZE 80	//·¢ËÍÊý¾Ý³¤¶È,×îºÃµÈÓÚsizeof(TEXT_TO_SEND)+2µÄÕûÊý±¶.


u8 SendBuff[SEND_BUF_SIZE];	//·¢ËÍÊý¾Ý»º³åÇø
u8 ReceiceBuff[Receice_BUF_SIZE];	//·¢ËÍÊý¾Ý»º³åÇø
const u8 TEXT_TO_SEND[]={"ALIENTEK Explorer STM32F4 DMA ´®¿ÚʵÑé"};	 

  /*wdh¸Ä³ÉDMA´«Êä¡£*/
/*
1¡¢µ÷ÊÔDMA2³ÌÐòÊÇ·ñÕýÈ·¡£ok
2¡¢¸Ä³ÉDMA2ÅäÖ㬴Ӵ洢Æ÷µ½ÍâÉè¡£ok
3¡¢¸Ä³ÉDMA2ÅäÖ㬴ÓÍâÉèµ½´æ´¢Æ÷¡£ok
3¡¢Ë«Ïòͬʱ´«Êä  ok  


×¢ÒâË«Ïò´«ÊäµÄ ʱºò£¬Òª¼ÇµÃË«ÏòÅäÖã¬ÅäÖÃÒ»¸ö·¢Ëͺ¯ÊýºÍÒ»¸ö½ÓÊÕº¯Êý£¬´«Êä·½Ïò²»Ò»Ñù¼´¿É¡£¡¢¡¢
×¢Òâ´®¿ÚµÄÊý¾ÝÁ÷ºÍͨµÀ²»Ò»Ñù£¬¶ÔÓÚ´®¿ÚÀ´Ëµ¡£Ò»¶¨Òª×¢Òâ¡£
*/
int main(void)
{ 
	u16 i;
	u8 t=0;
	u8 j,mask=0;
	float pro=0;//½ø¶È
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
	delay_init(168);     //³õʼ»¯ÑÓʱº¯Êý
	uart_init(115200);	//³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
	LED_Init();					//³õʼ»¯LED 
	KEY_Init(); 				//°´¼ü³õʼ»¯ 
 	 MYDMA_Config_Tx(DMA2_Stream7,DMA_Channel_4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH4,ÍâÉèΪ´®¿Ú1,´æ´¢Æ÷ΪSendBuff,³¤¶ÈΪ:SEND_BUF_SIZE.
 	 MYDMA_Config_Rx(DMA2_Stream5,DMA_Channel_4,(u32)&USART1->DR,(u32)ReceiceBuff,Receice_BUF_SIZE);//DMA1,STEAM7,CH5,ÍâÉèΪ´®¿Ú1,´æ´¢Æ÷ΪSendBuff,³¤¶ÈΪ:SEND_BUF_SIZE.
 //ÏÔʾÌáʾÐÅÏ¢	
	j=sizeof(TEXT_TO_SEND);	   
	for(i=0;i<SEND_BUF_SIZE;i++)//Ìî³äASCII×Ö·û¼¯Êý¾Ý
    {
		if(t>=j)//¼ÓÈë»»Ðзû
		{
			if(mask)
			{
				SendBuff[i]=0x0a;
				t=0;
			}else 
			{
				SendBuff[i]=0x0d;
				mask++;
			}	
		}else//¸´ÖÆTEXT_TO_SENDÓï¾ä
		{
			mask=0;
			SendBuff[i]=TEXT_TO_SEND[t];
			t++;
		}   	   
    }		 
 
	i=0;
	while(1)
	{
		printf("\r\nDMA DATA:\r\n"); 	          
		USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  //ʹÄÜ´®¿Ú1µÄDMA·¢ËÍ  
		USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);  //ʹÄÜ´®¿Ú1µÄDMA½ÓÊÕ 
		MYDMA_Enable(DMA2_Stream7,SEND_BUF_SIZE);     //¿ªÊ¼Ò»´ÎDMA´«Ê䣡	  
		MYDMA_Enable(DMA2_Stream5,Receice_BUF_SIZE);     //¿ªÊ¼Ò»´ÎDMA´«Ê䣡
		while(1)
		{
			//µÈ´ýDMA´«ÊäÍê³É£¬´ËʱÎÒÃÇÀ´×öÁíÍâһЩÊ£¬µãµÆ
		   //ʵ¼ÊÓ¦ÓÃÖУ¬´«ÊäÊý¾ÝÆڼ䣬¿ÉÒÔÖ´ÐÐÁíÍâµÄÈÎÎñ	 
		  if(DMA_GetFlagStatus(DMA2_Stream5,DMA_FLAG_TCIF5)!=RESET)//µÈ´ýDMA2_Steam7´«ÊäÍê³É
			{ 
				printf("ReceiceBuff[] = %s\r\n",ReceiceBuff);
				DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
				break; 
			}
			if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)//µÈ´ýDMA2_Steam7´«ÊäÍê³É
			{ 
				DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
				//break; 
			}
			pro=DMA_GetCurrDataCounter(DMA2_Stream7);//µÃµ½µ±Ç°»¹Ê£Óà¶àÉÙ¸öÊý¾Ý
			pro=1-pro/SEND_BUF_SIZE;//µÃµ½°Ù·Ö±È	  
			pro*=100;      			    //À©´ó100±¶ 
			printf("pro = %f\r\n",pro);
			LED0=!LED0;
		}				
	}    	
		        		    
}


函数配置


//DMAxµÄ¸÷ͨµÀÅäÖÃ
//ÕâÀïµÄ´«ÊäÐÎʽÊǹ̶¨µÄ,ÕâµãÒª¸ù¾Ý²»Í¬µÄÇé¿öÀ´ÐÞ¸Ä
//´Ó´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
//DMA_Streamx:DMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
//chx:DMAͨµÀÑ¡Ôñ,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:ÍâÉèµØÖ·
//mar:´æ´¢Æ÷µØÖ·
//ndtr:Êý¾Ý´«ÊäÁ¿  
void MYDMA_Config_Rx(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{ 
 
	DMA_InitTypeDef  DMA_InitStructure;
	
	if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇÊôÓÚDMA2»¹ÊÇDMA1
	{
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ 
		
	}else 
	{
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ 
	}
  DMA_DeInit(DMA_Streamx);
	
	while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//µÈ´ýDMA¿ÉÅäÖà 
	
  /* ÅäÖÃ DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //ͨµÀÑ¡Ôñ
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAÍâÉèµØÖ·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ´æ´¢Æ÷0µØÖ·
  //DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
		
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//ÍâÉèµ½´æ´¢Æ÷ģʽ
		
  DMA_InitStructure.DMA_BufferSize = ndtr;//Êý¾Ý´«ÊäÁ¿ 
  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_Normal;// ʹÓÃÆÕͨģʽ 
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//ÖеÈÓÅÏȼ¶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//³õʼ»¯DMA Stream
	

} 
void MYDMA_Config_Tx(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{ 
 
	DMA_InitTypeDef  DMA_InitStructure;
	
	if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇÊôÓÚDMA2»¹ÊÇDMA1
	{
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ 
		
	}else 
	{
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ 
	}
  DMA_DeInit(DMA_Streamx);
	
	while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//µÈ´ýDMA¿ÉÅäÖà 
	
  /* ÅäÖÃ DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //ͨµÀÑ¡Ôñ
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAÍâÉèµØÖ·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ´æ´¢Æ÷0µØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
  DMA_InitStructure.DMA_BufferSize = ndtr;//Êý¾Ý´«ÊäÁ¿ 
  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_Normal;// ʹÓÃÆÕͨģʽ 
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//ÖеÈÓÅÏȼ¶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//³õʼ»¯DMA Stream
	

} 
//¿ªÆôÒ»´ÎDMA´«Êä
//DMA_Streamx:DMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7 
//ndtr:Êý¾Ý´«ÊäÁ¿  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{
 
	DMA_Cmd(DMA_Streamx, DISABLE);                      //¹Ø±ÕDMA´«Êä 
	
	while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}	//È·±£DMA¿ÉÒÔ±»ÉèÖà  
		
	DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //Êý¾Ý´«ÊäÁ¿  
 
	DMA_Cmd(DMA_Streamx, ENABLE);                      //¿ªÆôDMA´«Êä 
}	  

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值