|
#include "includes.h"
#define SEND_DATA (*(volatile unsigned char *) 0x31200000)
#define SEND_ADDR ((volatile unsigned char *) 0x31200000)
/*下面程序是通过DMA方式实现内存块到串口0的输出*/
void APP_vMain(void){
volatile unsigned char *p = SEND_ADDR;
int i;
SEND_DATA = 0x41;
for (i = 0; i < 128; i++){
*p++ = 0x41 + i;
}
/*Uart设置成DMA形式*/
rUCON0 = rUCON0 & 0xff3 | 0x8;
/****** DMA0 Initialize *****/
rDISRC0 = (U32)(SEND_ADDR);
rDISRCC0 = (0<<1)|(0<<0); //Src=AHB,Increment
rDIDST0 = (U32)UTXH0; // Tx FIFO address
rDIDSTC0 = (1<<1)|(1<<0); //Dst=APB,Fixed;
rDCON0 = (0<<31)|(0<<30)|(1<<29)|(0<<28)|(0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (0 << 20) | (50);
//handshake,Sync=APB,IntEn, unit, single, dst=UART0, HwReqMode, NoAutoReload,Halfword,
rDMASKTRIG0 = (1<<1); //DMA0En
while(1) {CONSOL_Printf("*");DelayLoop(10000);};
}
此程序的功能是通过DMA给串口发送数据 同时主程序中也在一个死循环里给串口发送数据.最后的DelayLoop(10000)延时长了无任何问题.若是延时时间比较短,DMA未传送完数据,势必会出现总线竞争 同时 串口也设置为了DMA传输方式.想请教各位大侠 延时时间比较短时,程序应该是如何执行的?多谢赐教 |
|