常驻嘉宾
- 积分
- 5381
- 威望
- 2166
- 贡献
- 1705
- 兑换币
- 576
- 注册时间
- 2011-9-19
- 在线时间
- 755 小时
|
3#
楼主 |
发表于 2012-5-8 21:36:21
|
只看该作者
本帖最后由 agogos 于 2012-5-8 21:38 编辑
568581185 发表于 2012-5-8 20:16
要开启DMA读取数据,AD必须连续转换,不能单次的。
仔细看了下,我已经写了连续转换了。。。初始化代码如下。
static void CaptureInit(void){
//Init Interrupts PTE3->CS,行同步下降沿,PTE5->VS,场同步上升沿
SIM->SCGC5|=SIM_SCGC5_PORTE_MASK;//Enable Interrupt Clock
PORTE->PCR[3]|=PORT_PCR_IRQC(10)|PORT_PCR_MUX(1);//GPIO,Falling Edge Interrupt
PORTE->PCR[5]|=PORT_PCR_IRQC(9)|PORT_PCR_MUX(1);//GPIO,Rasing Edge Interrupt
PTE->PDDR&=0xFFFFFFD7;//PTE3,PTE5 Input
NVIC_EnableIRQ(PORTE_IRQn);//Enable Interrupt
//ADC ADC1->ADC1_SE5a->PTE1(ALT0)
SIM->SCGC5|=SIM_SCGC5_PORTE_MASK;
PORTE->PCR[1]|=PORT_PCR_MUX(0);//PTE1->ADC1_SE5a
PTE->PDDR&=~GPIO_PDDR_PDD(1<<1);//PTE1->Input
SIM->SCGC3|=SIM_SCGC3_ADC1_MASK;//ADC1 Clock Enable
ADC1->SC1[0]&=~ADC_SC1_AIEN_MASK;//ADC1A
ADC1->SC1[0]|=ADC_SC1_ADCH(5);//ADC1_5->Input, Single Pin, No interrupt
ADC1->SC1[1]&=~ADC_SC1_AIEN_MASK;//ADC1B
ADC1->SC1[1]|=ADC_SC1_ADCH(5);//ADC1_5b
ADC1->SC2&=0x00000000;//Clear all.
ADC1->SC2|=ADC_SC2_DMAEN_MASK;//DMA, SoftWare Triggle
ADC1->SC3&=(~ADC_SC3_AVGE_MASK&~ADC_SC3_AVGS_MASK);
ADC1->SC3|=ADC_SC3_ADCO_MASK;
ADC1->CFG1|=ADC_CFG1_ADICLK(1)|ADC_CFG1_MODE(0)|ADC_CFG1_ADIV(1);//InputClk, ShortTime, 8bits, Bus
ADC1->CFG2&=~ADC_CFG2_MUXSEL_MASK;//ADC1A
ADC1->CFG2|=ADC_CFG2_ADACKEN_MASK;//OutputClock
//DMA
SIM->SCGC6|=SIM_SCGC6_DMAMUX_MASK;//DMAMUX Clock Enable
SIM->SCGC6|=SIM_SCGC7_DMA_MASK;//DMA Clock Enable
DMAMUX->CHCFG[0]|=DMAMUX_CHCFG_SOURCE(41);//DMA0->No.41 request, ADC1
DMA->TCD[0].SADDR=(uint32_t)&(ADC1->R[0]);//Source Address 0x400B_B010h
DMA->TCD[0].SOFF=0;//Source Fixed
DMA->TCD[0].ATTR=DMA_ATTR_SSIZE(0)|DMA_ATTR_DSIZE(0);//Source 8 bits, Aim 8 bits
DMA->TCD[0].NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1);//one byte each
DMA->TCD[0].SLAST=0;
DMA->TCD[0].DADDR=(uint32_t)&SysImgBuffer[0][0];
DMA->TCD[0].DOFF=1;
DMA->TCD[0].CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(IMG_COL);
DMA->TCD[0].DLAST_SGA=0;
DMA->TCD[0].BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(IMG_COL);
DMA->TCD[0].CSR=0x00000000;//Clear
DMA->TCD[0].CSR|=DMA_CSR_DREQ_MASK;//Auto Clear
DMA->TCD[0].CSR|=DMA_CSR_INTMAJOR_MASK;//Enable Major Loop Int
DMA->INT|=DMA_INT_INT0_MASK;//Open Interrupt
DMA->ERQ&=~DMA_ERQ_ERQ0_MASK;//Clear Disable
DMAMUX->CHCFG[0]|=DMAMUX_CHCFG_ENBL_MASK;//Enable
NVIC_EnableIRQ(DMA0_IRQn);
}
|
|