0

这是我的代码

#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->ADGDR 时它工作正常,但是当我使用 LPC_ADC->ADDR1 时它不工作,为什么?
我使用 MAT 进行 ADC 中断
,当我使用 LPC_ADC->ADGDR 时一切正常
,但是当我使用 LPC_ADC->ADDR1 读取它时它不起作用并且不随 MAT 边缘而改变

4

2 回答 2

0

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

您的代码中有错误的注释,读取ADGDR清除中断标志。ADSTAT只需阅读ADGDR即可清除它,这就是为什么您的代码不适用于ADDR1.

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

于 2015-06-19T17:58:15.887 回答
0

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

LPC_ADC->ADINTEN =  1 << 1;  //0x0002  
于 2015-09-03T20:05:48.840 回答