|
4#
楼主 |
发表于 2012-12-16 18:20:02
|
只看该作者
本帖最后由 676431432 于 2012-12-16 18:21 编辑
void dma_init(void)
{
SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(40);///DMA通道0对应40号DMA请求,即ADC0
DMA_TCD0_SADDR=(uint32)&(ADC_R_REG(ADC0_BASE_PTR, 0)); //设置源地址GPIO口,AD0
DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(ROW);//当前主循环次数,采集点数
DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(ROW);//起始主循环次数,采集点数
DMA_TCD0_SOFF=0; //每次传送源地址不变
DMA_TCD0_NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
DMA_TCD0_SLAST=0;//主循环结束后源地址0回写tcd
DMA_TCD0_DLASTSGA=0;//主循环结束后目的地址0回写tcd
DMA_TCD0_DADDR=(uint32)picture;//设置目的地址,picture数组第一个元素
DMA_TCD0_DOFF=1;//每次写目的地址加1
DMA_TCD0_ATTR=DMA_ATTR_SSIZE(0)|DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit
DMA_TCD0_CSR=DMA_CSR_DREQ_MASK;//DMA通道0主循环结束后停止硬件请求
DMA_TCD0_CSR|=DMA_CSR_INTMAJOR_MASK;//使能DMA0中断
DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道0使能
}
PE_ISR(isrINT_PORTC_test)//行中断{ /* Write your interrupt code here ... */
PORTC_ISFR = 1 << 4;//清除中断标志
if(linecount == 10 + LineN[line_used_count])//判断是否为采集行
{
ADC0_SE_Get(ADC0_BASE_PTR, 0);//打开AD
delay(100);
DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//开启DMA
line_used_count++;
}
linecount++;
if(line_used_count==COL)
{
linecount=0;
line_used_count=0;
deal=1;
}
}
PE_ISR(isrINT_PORTB_test)//场中断
{ /* Write your interrupt code here ... */
PORTB_ISFR = 1 << 2;//清除中断标志
dma_init(); //dma初始化
linecount=0; l
ine_used_count=0;
}
PE_ISR(isrINT_DMA0_test)//dma中断
{ /* Write your interrupt code here ... */
DMA_INT|=DMA_INT_INT0_MASK;
}
|
|