popo_new 发表于 2015-10-13 14:07:11

关于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   
}

popo_new 发表于 2015-10-14 09:12:28

这句错了
      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:46

楼主解决了吗?

popo_new 发表于 2017-9-27 20:00:01

anxiangbo 发表于 2017-9-27 11:41
楼主解决了吗?

放弃了,没有STM32好用
页: [1]
查看完整版本: 关于LPC1768 ADC的结果DMA方式传输请教,谢谢