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

📄 main.c

📁 ADI DSP blackfin DMA demo
💻 C
字号:

#include <defBF537.h>
#include <stdio.h>

//#define _2D_DMA	// or _1D-DMA
#define USE_INTERRUPT

#define SDRAM_START_ADDRESS 	0x6
#define FLASH_ROM_START_ADDRESS 0x20000000        // switch SW12, LED pattern 1 (PF3)
#define DATA_ASRAM_START		0xFF800000

#define DMA_DATA_COUNT	0x20

#ifdef _2D_DMA
#define X 5
#define Y 6

unsigned short section("L1_data_a") aSource[X*Y] = {
	1,  7, 13, 19, 25,
	2,  8, 14, 20, 26,
	3,  9, 15, 21, 27,
	4, 10, 16, 22, 28,
	5, 11, 17, 23, 29,
	6, 12, 18, 24, 30};
	
unsigned short section("L1_data_b") aDestination[X*Y];
#endif	// _2D_DMA	

extern void init_SDRAM(void);

#ifdef USE_INTERRUPT
void dmaD1_isr_setup(void);
void isr_dmaD1(void);
unsigned short count;
#endif

void DMA_Setup(void)
{
	unsigned short *smmrPtr;	// 16 bits
	unsigned int *mmrPtr;		// 32 bits

#ifndef _2D_DMA	// _1D_DMA
	mmrPtr = (unsigned int*) MDMA_S1_START_ADDR; // Set Source Base Address
	*mmrPtr = DATA_ASRAM_START;	
	smmrPtr = (unsigned short*)MDMA_S1_X_COUNT;	 // Set Source Count
	*smmrPtr = DMA_DATA_COUNT;
	smmrPtr = (unsigned short*) MDMA_S1_CONFIG;
	*smmrPtr = WDSIZE_8 | DMAEN;
																									
	mmrPtr = (unsigned int*) MDMA_D1_START_ADDR; // Set Source Base Address
	*mmrPtr = SDRAM_START_ADDRESS;	
	smmrPtr = (unsigned short*)MDMA_D1_X_COUNT;	 // Set Source Count
	*smmrPtr = DMA_DATA_COUNT;
	smmrPtr = (unsigned short*) MDMA_D1_CONFIG;
#ifndef USE_INTERRUPT	// Use polling
	*smmrPtr = WDSIZE_8 | WNR | DMAEN;
#else 
	*smmrPtr = DI_EN | WDSIZE_8 | WNR | DMAEN;
#endif
	
	//	asm("IDLE");							 // Wait for DMA to Complete	
#else	// _2D_DMA
	mmrPtr = (unsigned int*) MDMA_S1_START_ADDR; // Set Source Base Address
	*mmrPtr = &aSource;	
	smmrPtr = (unsigned short*)MDMA_S1_X_MODIFY;		// Set Source Count
	*smmrPtr = 2;
	smmrPtr = (unsigned short*) MDMA_S1_X_COUNT;
	*smmrPtr = X * Y;
	smmrPtr = (unsigned short*) MDMA_S1_CONFIG;
	*smmrPtr = WDSIZE_16 | DMAEN;

	mmrPtr = (unsigned int*) MDMA_D1_START_ADDR; // Set Source Base Address
	*mmrPtr = &aDestination;	
	smmrPtr = (unsigned short*)MDMA_D1_X_MODIFY; // Set Source Count
	*smmrPtr = 2 * Y;
	smmrPtr = (unsigned short*) MDMA_D1_Y_COUNT;
	*smmrPtr = Y;
	smmrPtr = (unsigned short*) MDMA_D1_X_COUNT;
	*smmrPtr = X;
	smmrPtr = (unsigned short*) MDMA_D1_Y_MODIFY;
	*smmrPtr =  -2 * (Y * (X-1) -1);
	smmrPtr = (unsigned short*) MDMA_D1_CONFIG;
	*smmrPtr = DMA2D | DI_EN | WDSIZE_16 | WNR | DMAEN;
#endif
	
}

// DMA_RUN : DMA channel running
// DMA_DONE : DMA completion interrupt status
void DMA_Wait(void)
{
	unsigned short *smmrPtr,temp;	// 16 bits
	unsigned int *mmrPtr;			// 32 bits
#ifndef _2D_DMA		// _1D_DMA
#ifndef USE_INTERRUPT	// Use polling 

	while(1)
	{
		smmrPtr = (unsigned short*) MDMA_D1_IRQ_STATUS;
		temp = *smmrPtr;
		if ((temp & 0x0008) == 0x0000)	break;	// DMA_RUN : bit 3
	}
	
#endif
#else

	while(1)
	{
		smmrPtr = (unsigned short*) MDMA_D1_IRQ_STATUS; 
		temp = *smmrPtr;
		if ((temp & 0x0001) == 0x0001)	break;	// DMA_DONE : bit 0
	}
	*smmrPtr = temp & 0xFFFE;	// DMA_DONE = 0
	
#endif
}

void main(void)
{	
	init_SDRAM();
	
#ifdef USE_INTERRUPT
	dmaD1_isr_setup();
#endif
	DMA_Setup();	
	DMA_Wait();		// polling DMA status
	while(1);
}

#ifdef USE_INTERRUPT
void dmaD1_isr_setup()
{
	unsigned int *mmrPtr;		// 32 bits
	
	mmrPtr = (unsigned int*)EVT7;
	*mmrPtr = (unsigned int) isr_dmaD1;	/* register interrupt service routine */

	mmrPtr = (unsigned int*)IMASK;
	*mmrPtr = *mmrPtr | (EVT_IVG7);
	
	mmrPtr = (unsigned int*)SIC_IAR0;
	*mmrPtr = 0xFFFFFFFF;
	
	mmrPtr = (unsigned int*)SIC_IAR1;
	*mmrPtr = 0xFFFFFFFF;

	mmrPtr = (unsigned int*)SIC_IAR2;
	*mmrPtr = 0xFFFFFFFF;
	
	/* assign DMA D1 IRQ = IRQ30 to IVG7 */
	mmrPtr = (unsigned int*)SIC_IAR3;
	*mmrPtr = (unsigned int) P30_IVG(7);
	
	mmrPtr = (unsigned int*)SIC_IMASK;
	/* enable MDMA D1 IRQ */
	*mmrPtr = *mmrPtr | 0x40000000;	// set bit 30
}

#pragma interrupt saveall
void isr_dmaD1(void)
{
	
	unsigned short *smmrPtr,temp;	// 16 bits
	unsigned int *mmrPtr;			// 32 bits

	smmrPtr = (unsigned short*) MDMA_D1_CONFIG;
	temp = *smmrPtr;
	*smmrPtr = temp & 0xFFFE;	// DMAEN = 0
	
	count++;
	printf(" count = %d \n",count);	
	
}
#endif

⌨️ 快捷键说明

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