ADC LPC1768简单

时间:2015-06-16 09:57:12

标签: arm keil adc

这是我的代码

#include "LPC17xx.h"                    // Device header
#include "GPIO_LPC17xx.h"               // Keil::Device:GPIO
uint32_t voltag1 = 0 ;
uint32_t voltag2 = 0 ;
volatile uint32_t adstat;
int blink=1;
int main()
{
    //Config timer
    LPC_TIM1->MCR=2;                         
    LPC_TIM1->MR0=20000000;                 //Match Resgister
    LPC_TIM1->TCR=1; 
    LPC_TIM1->EMR = 0x00000030 ;

    //Config ADC
    LPC_PINCON->PINSEL1 |= (1 << 14) | (1 << 16);    // connect pin to ADC
    LPC_SC->PCONP |= ((1 << 12));                    //enable power of ADC  
    LPC_ADC->ADCR    =  0x06202001;                  //initialaze ADC
    LPC_ADC->ADINTEN =  0x00000100;                  // global interup      
    NVIC_EnableIRQ(ADC_IRQn);
    GPIO_SetDir(3,25,GPIO_DIR_OUTPUT);   
    while(1) {}
}

void ADC_IRQHandler(void) 
{
    adstat = LPC_ADC->ADSTAT;       /* Read ADC clears interrupt  */    
    blink++;
    GPIO_PinWrite(3,25,blink%2);
    voltag1 = (LPC_ADC->ADGDR >> 4) & 0xFFF; 
    //voltag2 = (LPC_ADC->ADDR1 >> 4) & 0xFFF; 
}

当我使用LPC_ADC-&gt; ADGDR它工作正常但是当我使用LPC_ADC-&gt; ADDR1它不工作时,为什么?
我使用MAT进行ADC中断 当我使用LPC_ADC-> ADGDR时,一切正常 但是当我使用LPC_ADC-&gt; ADDR1来读取它不起作用而不是用MAT边缘改变

2 个答案:

答案 0 :(得分:0)

代码中有太多幻数。请对所有这些位使用相应的定义。此代码不可读。

您的代码中有错误的评论,ADGDR的中断标记在ADSTAT读取时清除 。只有ADGDR的读取才能清除它,这就是为什么您的代码无法与ADDR1一起使用。

如果您使用该定义来设置ADINTEN,您可能会更早发现错误。该标志名为 ADGDINTEN ,仅对应于ADGDR中的标志。

答案 1 :(得分:0)

您应该通过以下方式启用ch1的IRQ:

LPC_ADC->ADINTEN =  1 << 1;  //0x0002