关于LPC1768 ADC的结果DMA方式传输请教,谢谢
仅有一路ADC0,用中断与查询方式均得到一致结果。但DMA方式传输值却不正确,这里特请教几个问题。
1. LPC_GPDMACH0->DMACCControl 的bit 1,是指传输大小,单位是什么?字节,双字,四字节?
2. LPC_GPDMACH0->DMACCControl 的bit 12~14,是指Source burst size,可以这样理解吗?1路ADC就取1,2路ADC就取2.......
3.LPC_GPDMACH0->DMACCControl 的bit 12~14,是指Source burst size,好象只有8个取值,为1,4,8,16,32,64,128,256,
4.选择DMA方式时,对应ADC的中断是否必须enable? 在ADC中断程序中是否还要写代码?
谢谢
void ADC_DMA_Init (void)
{
LPC_SC->PCONP |= (1<<29); // 在功率管理寄存器里启用GPDMAP54
LPC_GPDMA->DMACIntTCClear |= 0x03; // DMA Interrupt Terminal Count Request Clear Register 清除终端计数中断的标志 P595
LPC_GPDMA->DMACIntErrClr|= 0x01; /* 清除错误中断标志 */
LPC_GPDMACH0->DMACCLLI = 0; // DMA Channel 0 Linked List Item Register 下一个链表项无效,本次DMA传输流使用连续存储空间 P601 <<UM-176x.pdf>>
LPC_GPDMACH0->DMACCConfig|= (0x04 << 1) // 指定DMA传输的源是ADC P605 & P592
|(0x00 << 6) /* 指定DMA传输的目标是存储器 */
|(0x02 << 11);// 初始化流的方向是为从外设到存储器,以及流控制器为DMA控制器MM:0 MP:1 PM:10 PP:11 P605
LPC_GPDMACH0->DMACCControl |= (0x01 << 1) // transfer 大小 P603
|(0x1 << 12) // 指定源突发传输大小为32 P603 三位000~111对应1,4,8,16,32,64,128,256
|(0x1 << 15) // 指定目的突发传输大小为32 P603 三位000~111对应1,4,8,16,32,64,128,256
|(0x1 << 18) // 指定源传输数据宽度为32 P603 0:8位,1:16位,2:32位,4~7保留
|(0x1 << 21) // 指定目标传输数据宽度为32 P603 0:8位,1:16位,2:32位,4~7保留
|(0 << 26) // 指定源地址不自动增加 P604
|(1 << 27) // 指定目标地址自动增加 P604
| (1 << 31) ; // 配置传输流的中断,使能通道1的终端计数中断 P604
LPC_GPDMACH0->DMACCSrcAddr = LPC_ADC->ADDR0; // 源地址指向ADC的转换值 //->ADGDRGPIO0->FIOPIN0
LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&Adc_va ; // 目的地址指向ADC_Val数组
LPC_GPDMA->DMACConfig = 0x01; // 使能DMA,使能小端模式
LPC_GPDMACH0->DMACCConfig |= 0x01; // 使能通道0 P599
}
/*********************************************************************************************************
* Function name: adcInit
* Descriptions: ADC初始化,转换时钟为13MHz,突发模式
* input parameters: 无
* output parameters: 无
* Returned value: 无
*********************************************************************************************************/
void AdcInit (void)
{
uint32_t ulTemp;
LPC_SC->PCONP |= 1 << 12; // 打开ADC的功率控制位 P43
LPC_PINCON->PINSEL1 |= (0x1 << 14); //P0.23 PinSeL1 15:14 9 AD0 I2SRX_CLK CAP3
ulTemp = (24000000 / (13000000));
ulTemp = (1 << 0) // 选择AD0.0为AD输入引脚PT100 P179
|(1 << ulTemp) // 转换时钟为13MHzP179
|(1 << 16) // BURST=1,使用Burst模式,让硬件不断地进行转换 P179
|(0 << 17) // CLKS=0, 使用11clock转换P180
|(1 << 21) // PDN = 1,正常工作模式 P180
|(0 << 24); // START=0,在Burst模式下 P180
LPC_ADC->ADCR = ulTemp;
NVIC_EnableIRQ(ADC_IRQn); // 启用ADC中断
NVIC_SetPriority(TIMER0_IRQn, 6);
LPC_ADC-> ADINTEN = (1 << 0); // 启动ADC中断 P182
}
这句错了
LPC_GPDMACH0->DMACCSrcAddr = LPC_ADC->ADDR0; // 源地址指向ADC的转换值 //->ADGDRGPIO0->FIOPIN0
应改为
LPC_GPDMACH0->DMACCSrcAddr =(uint32_t)&(LPC_ADC->ADDR0); // 源地址指向ADC的转换值 //->ADGDRGPIO0->FIOPIN0
不过,也不行, 楼主解决了吗? anxiangbo 发表于 2017-9-27 11:41
楼主解决了吗?
放弃了,没有STM32好用
页:
[1]