搜索
bottom↓
回复: 3

关于LPC1768 ADC的结果DMA方式传输请教,谢谢

[复制链接]

出0入0汤圆

发表于 2015-10-13 14:07:11 | 显示全部楼层 |阅读模式

仅有一路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);                     // 在功率管理寄存器里启用GPDMA  P54
        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的转换值                                //->ADGDR  GPIO0->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[0]        I2SRX_CLK        CAP3[0]
    ulTemp = (24000000 / (13000000));
    ulTemp = (1 << 0)                                                   // 选择AD0.0为AD输入引脚  PT100 P179

           |(1 << ulTemp)                                               // 转换时钟为13MHz  P179
           |(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   
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2015-10-14 09:12:28 | 显示全部楼层
这句错了
      LPC_GPDMACH0->DMACCSrcAddr   = LPC_ADC->ADDR0  ;      // 源地址指向ADC的转换值                                //->ADGDR  GPIO0->FIOPIN0
   应改为
   LPC_GPDMACH0->DMACCSrcAddr   =  (uint32_t)&(LPC_ADC->ADDR0)  ;      // 源地址指向ADC的转换值                                //->ADGDR  GPIO0->FIOPIN0

不过,也不行,

出0入0汤圆

发表于 2017-9-27 11:41:46 | 显示全部楼层
楼主解决了吗?

出0入0汤圆

 楼主| 发表于 2017-9-27 20:00:01 | 显示全部楼层

放弃了,没有STM32好用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-12 11:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表