⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 FS7805 使用DMA的demo
💻 C
字号:
/*
*********************************************************************************************************
* File:     main.C
* Contents: dma demo code
*
* $Date:    01/12/07    Kevin    v0.1
*
* Copyright (c) 2007 Fameg, Inc. All rights reserved
*********************************************************************************************************
*/

#define ALLOCATE_EXTERN 
#include "fs7805.h"
#include "fs7805regs.h"	 
#include "dma.h"
main()
{
	int i; 
	
	McuInit();                              //initialize MCU
	DmaInit();                              //initialize DMA module 
	 
	//DMA move data between 512B-external-data memory and FIFOX  (X: A,B,C,D)
	for(i=0;i<512;i++)	                    //initialize 512B on-chip xdata
   	    ((BYTE xdata *)XDATA512B)[i]=i+0; 
	DmaTrans(FIFOA0_EC00,XDATA512B,512);    //from 512B on-chip xdata to Fifo A0
	DmaTrans(FIFOA1_EE00,XDATA512B,512);    //from 512B on-chip xdata to Fifo A1 
             
	for(i=0;i<512;i++)	                    //rewrite Fifo A0,A1	
        ((BYTE xdata *)FIFOA0_EC00)[i]=i*2+1; 
    DmaTrans(XDATA512B,FIFOA0_EC00,512);	//from Fifo A0 to 512B on-chip xdata
	DmaTrans(XDATA512B,FIFOA1_EE00,512);	//from Fifo A1 to 512B on-chip xdata	
	
	//DMA move data between 64KB Off-chip Data memory and FIFOX  (X: A,B,C,D)
	for(i=0;i<512;i++)	                    //initialize 512B off-chip xdata
		((BYTE xdata *)0x4000)[i]=i+1;
	DmaTrans(FIFOA0_EC00,0x4000,512);       //from 512B off-chip xdata to Fifo A0
	DmaTrans(FIFOA1_EE00,0x4000,512);       //from 512B off-chip xdata to Fifo A1
             
	for(i=0;i<512;i++)	                    //rewrite Fifo A0
		((BYTE xdata *)FIFOA0_EC00)[i]=i*2+1;		
	DmaTrans(0x4000,FIFOA0_EC00,512);	    //from Fifo A0 to 512B off-chip xdata
	DmaTrans(0x4000,FIFOA1_EE00,512);	    //from Fifo A1 to 512B off-chip xdata
	
	//DMA move data between 64KB Off-chip Data memory and 512B-external-data memory
	for(i=0;i<512;i++)	                    //initialize 12B off-chip xdata
		((BYTE xdata *)0x4000)[i]=i;
	DmaTrans(XDATA512B,0x4000,512);         //from 512B off-chip xdata(LSB) to 512B on-chip xdata
	
	for(i=0;i<512;i++)	                    //rewrite 512B on-chip xdata
		((BYTE xdata *)0xEC00)[i]=i+1;
	DmaTrans(0x4000,0xEC00,512);            //from 512B on-chip xdata to 512B off-chip xdata	
		
	//DMA move data between FIFOX  (X: A,B,C,D) and FIFOX  (Y: A,B,C,D)
	for(i=0;i<512;i++)	                    //rewrite Fifo A0
		((BYTE xdata *)FIFOA0_EC00)[i]=i*2+1;	
	DmaTrans(FIFOA1_EE00,FIFOA0_EC00,512);  //from Fifo A0 to Fifo A1
	DmaTrans(FIFOB0_F000,FIFOA0_EC00,512);	//from Fifo A0 to Fifo B0	
    
	//between 16k SRAM and FIFO
	for(i=0;i<512;i++)	                    //initialize SRAM_2000
		((BYTE xdata *)SRAM_2000)[i]=i*2+1; 
	DmaTrans(FIFOA0_EC00,SRAM_2000,512);	//from SRAM_2000 to Fifo A0	 
	DmaTrans(FIFOA1_EE00,SRAM_2000,512);	//from SRAM_2000 to Fifo A1
    
    for(i=0;i<512;i++)	                    //initialize SRAM_2000
		((BYTE xdata *)0x3A00)[i]=0;  

    for(i=0;i<512;i++)	                    //initialize Fifo A0
		((BYTE xdata *)FIFOD0_F800)[i]=i*2+1;		
	DmaTrans(0x3A00,FIFOD0_F800,512);	    //from Fifo A0 to SRAM_2000
	DmaTrans(SRAM_2000,FIFOA1_EE00,512);	//from Fifo A1 to SRAM_2000
	
  
	//DMA move data between 16K-program memory and 512B data memory
	for(i=0;i<512;i++)	                    //initialize XDATA512B
		((BYTE xdata *)XDATA512B)[i]=i+1;

	DmaTrans(SRAM_2000,XDATA512B,512);	    //from XDATA512B_EC00 to SRAM_2000	
	    
    for(i=0;i<512;i++)	                    //initialize SRAM_2000
		((BYTE xdata *)SRAM_2000)[i]=i*2+0;		
	DmaTrans(XDATA512B,SRAM_2000,512);	    //from SRAM_2000 to XDATA512B_EC00
}

void McuInit()
{
	SYS_CFG=SYS_CFG|bmSYS_SW_RST;           //software reset 
	SYS_CFG=0x02;                           //00:15M,01:40M,02:30M,03:60M
	SYS_CFG=SYS_CFG|bmPM_AVBLE; 
	WDTRST=0x2D;                            //stop WDT
    MEMCON=0x08;                            //8k xdata
	CKCON=0x07;
}

void DmaInit()
{
	DmaCtl.Bit.DmaRWCyc		=1;             //0:5,1:2,2:3,3:4.		 IS63LV1024 TRC = 12ns  Tpwe = 8ns
	DmaCtl.Bit.DmaLatency	=0;	            //0:0,1:1,2:2,3:3.
	DmaCtl.Bit.DmaStallCyc	=0;	            //0:0,1:32,2:64,3:128.
	DMA_CTL=DmaCtl.Val;	
	DMA_CTL2=DMA_CTL2|bmCNFLICT_EN; 
}

void DmaTrans(INT16U des,INT16U src,INT16U length)
{ 
	DMA_S_ADDRH=src>>8;
	DMA_S_ADDRL=src;
	DMA_D_ADDRH=des>>8;
	DMA_D_ADDRL=des;
	DMA_LENH=length>>8;
	DMA_LENL=length;
	
	DMA_CTL= DMA_CTL|bmDMA_START;          //start data transfer
 	while((CHIPINT&bmDMA_INT)==0);         //Wait for DMA finish
	CHIPINT=CHIPINT&~bmDMA_INT;	           //Clear the interrupt bit  
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -