还是靠俺自己。。
static void __irq Dma0Done(void)
{
ClearPending(BIT_DMA0);
dmaDone=1;
}
void Test_DMA(char *p_src,char *p_dst,int num)
{
int i,time;
float a,b;
pISR_DMA0=(int)Dma0Done;
rINTMSK&=~(BIT_DMA0);
Uart0_Init();
Delay(3);
rDISRC0 = (int)p_src;
rDISRCC0 = 0;
rDIDST0 = (int)p_dst;
rDIDSTC0 = 3;
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(0<<28)|(1<<27)|\
(1<<24)|(1<<23)|(1<<22)|(0<<20)|(num);
Delay(3);
dmaDone = 0;
rDMASKTRIG0=(1<<1)|0;
Timer_Start(3);//128us resolution
while(dmaDone==0);
time=Timer_Stop();
Delay(20);
Uart_Init( 0,115200 );
a=time/(float)ONESEC3;
b=num/(time/(float)ONESEC3)/1000000;
Uart_Printf("DMA transfer done.");// time=%f, %fMB/S\n",a,b); //这儿用原来的打印会有data abort错误
}
void Uart0_Init()
{
int i,pclk;
/// if(pclk == 0)
pclk = PCLK;
rUFCON0 = 0x0|1; //UART channel 0 FIFO control register, FIFO ENable
rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable
rUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable
rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable
rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable
//UART0
rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits
// [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0]
// Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode
// 0 1 0 , 0 1 0 0 , 10 01
// PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling
rUCON0 = 0x249; // Control register,DMA ,INT
rUBRDIV0=( (int)(pclk/16./115200+0.5) -1 ); //Baud rate divisior register 0
//UART1
rULCON1 = 0x3;
rUCON1 = 0x245;
rUBRDIV1=( (int)(pclk/16./115200+0.5) -1 );
//UART2
rULCON2 = 0x3;
rUCON2 = 0x245;
rUBRDIV2=( (int)(pclk/16./115200+0.5) -1 );
for(i=0;i<100;i++);
}
用char [300]="";初始化的数组做为src时有时有点问题,我想大概是MMU导致的。
现在用的char buff0[300]="0000111122223333";
[ 此帖被_fengchen_在2010-08-08 18:23重新编辑 ]