void Init_OV7620_DMA() { MCF_GPIO_PTEPAR = 0; MCF_GPIO_DDRTE = 0; SCCB_Init(); SCCB_Bytewrite(0x42,0x14,0x24); SCCB_Bytewrite(0x42,0x11,0x04); MCF_DMA_DSR(0) |= MCF_DMA_DSR_DONE;//清空传输完成标志位 MCF_SCM_MPR = MCF_SCM_MPR_MPR(0x05); MCF_SCM_DMAREQC = MCF_SCM_DMAREQC_DMAC0(0x04);//设定DMA0为DTIM0触发 MCF_DMA_SAR(0)=(uint32)0x40100030;//源地址为PTE MCF_DMA_DAR(0)=(uint32)Image_Data[0];//目的地址为图像数组 MCF_DMA_BCR(0)=320;//传输长度为每行的长度,这里是320个像素 MCF_DMA_DCR(0)=MCF_DMA_DCR_INT//开启DMA中断 |MCF_DMA_DCR_SSIZE(1) |MCF_DMA_DCR_DSIZE(1)//每次传输源地址和目的地址都为一字节 |MCF_DMA_DCR_DINC//每次传输之后源地址保持不变,目的地址加1 |MCF_DMA_DCR_D_REQ//每次传输结束之后关闭DMA外部请求 //|MCF_DMA_DCR_EEXT |MCF_DMA_DCR_CS;//一次DMA请求传输一次 MCF_GPIO_PTCPAR|=MCF_GPIO_PTCPAR_DTIN0_DTIN0;//设定DTIN0端口的功能 MCF_DTIM0_DTMR=0;//重置STMR寄存器 MCF_DTIM0_DTMR=MCF_DTIM_DTMR_CE_RISE//捕捉上升沿 |MCF_DTIM_DTMR_CLK_DTIN;//时钟输入为DTIN MCF_DTIM0_DTER|=MCF_DTIM_DTER_CAP;//边沿捕捉触发 MCF_DTIM0_DTXMR|=MCF_DTIM_DTXMR_DMAEN;//DMA请求使能 MCF_DTIM_DTMR(0) |= MCF_DTIM_DTMR_RST;//开启DTIM MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL; MCF_INTC0_IMRL&=~MCF_INTC_IMRL_INT_MASK9; MCF_INTC0_ICR09=MCF_INTC_ICR_IP(6)+MCF_INTC_ICR_IL(6); EPORT_init(); }
/* DMA Timer Initialization */ int8 dtim_init(/*DTIM_Info info, */uint8 u8DTimModule) { /*MCF_SCM_PPMRL &= ~MCF_SCM_PPMRL_CDDTIM0; MCF_SCM_PPMRC |= MCF_SCM_PPMRC_ENABLE_DTIM0;*/ gpio_set_func(PTTC, u8DTimModule, PRIMARY); MCF_DTIM_DTMR(u8DTimModule)|= 0 | MCF_DTIM_DTMR_PS(0) | MCF_DTIM_DTMR_CE_NONE | MCF_DTIM_DTMR_CLK_DTIN | MCF_DTIM_DTMR_FRR; MCF_DTIM_DTRR(u8DTimModule)=~0; MCF_DTIM_DTCN(u8DTimModule)=0; /*MCF_GPIO_PTCPAR|=MCF_GPIO_PTCPAR_DTIN0_DTIN0|MCF_GPIO_PTCPAR_DTIN1_DTIN1; //timer mode reg // MCF_DTIM_DTMR(u8DTimModule) = MCF_DTIM_DTMR_CE(info.u8CapEdge | MCF_DTIM_DTMR_CLK(info.u8ClkSrc); MCF_DTIM_DTMR(u8DTimModule) |= MCF_DTIM_DTMR_CE_NONE | MCF_DTIM_DTMR_CLK_DTIN | MCF_DTIM_DTMR_FRR; MCF_DTIM_DTRR(u8DTimModule) = 0xFFFFFFFF; MCF_DTIM_DTCN(u8DTimModule) = 0x0;*/ /*if(info.u8OutputMode) //toggle output MCF_DTIM_DTMR(u8DTimModule) |= MCF_DTIM_DTMR_OM; else*/ // MCF_DTIM_DTMR(u8DTimModule) &= ~MCF_DTIM_DTMR_OM; // if(info.u8Restart) //restart // MCF_DTIM_DTMR(u8DTimModule) |= MCF_DTIM_DTMR_FRR; // else // MCF_DTIM_DTMR(u8DTimModule) &= ~MCF_DTIM_DTMR_FRR; //Timer extended register // if(info.u8DMAEn) //DMA request enable // MCF_DTIM_DTXMR(u8DTimModule) |= MCF_DTIM_DTXMR_DMAEN; // else // MCF_DTIM_DTXMR(u8DTimModule) &= ~MCF_DTIM_DTXMR_DMAEN; // if(info.u8Halt) //timer stop in halt // MCF_DTIM_DTXMR(u8DTimModule) |= MCF_DTIM_DTXMR_HALTED; // else // MCF_DTIM_DTXMR(u8DTimModule) &= ~MCF_DTIM_DTXMR_HALTED; /*if(info.u8Mode16) MCF_DTIM_DTXMR(u8DTimModule) |= MCF_DTIM_DTXMR_MODE16; else*/ // MCF_DTIM_DTXMR(u8DTimModule) &= ~MCF_DTIM_DTXMR_MODE16; // DTimEnableInts(u8DTimModule, dtim0_isr); return 0; }
void DTimDisableInts(uint8 u8DTimModule) { MCF_DTIM_DTMR(u8DTimModule) &= ~MCF_DTIM_DTMR_ORRI; }
void DTimEnableInts(uint8 u8DTimModule, dtim_isr isr) { MCF_DTIM_DTMR(u8DTimModule) |= MCF_DTIM_DTMR_ORRI; __VECTOR_RAM[64+19] = (uint32) isr; // dtim_example_isr[u8DTimModule] = isr; }
void dtim_start(uint8 u8DTimModule) { MCF_DTIM_DTMR(u8DTimModule) |= MCF_DTIM_DTMR_RST; }