📄 main.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 + -