Arm 模数转换器LPC1768简单

Arm 模数转换器LPC1768简单,arm,keil,adc,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_

这是我的密码

#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; 
}
#包括“LPC17xx.h”//Device头
#包括“GPIO_LPC17xx.h”//Keil::Device:GPIO
uint32_t voltag1=0;
uint32_t voltag2=0;
挥发性uint32_t adstat;
int闪烁=1;
int main()
{
//配置计时器
LPC_TIM1->MCR=2;
LPC_TIM1->MR0=20000000;//匹配重新注册
LPC_TIM1->TCR=1;
LPC_TIM1->EMR=0x00000030;
//配置模数转换器
LPC_PINCON->PINSEL1 |=(1 ADINTEN=0x00000100;//全局中断
NVIC_EnableIRQ(ADC_IRQn);
GPIO_设置目录(3,25,GPIO_目录输出);
而(1){}
}
无效ADC_IRQHandler(无效)
{
adstat=LPC_ADC->adstat;/*读取ADC清除中断*/
眨眼++;
GPIO_PinWrite(3,25,闪烁%2);
voltag1=(LPC_ADC->ADGDR>>4)和0xFFF;
//voltag2=(LPC_ADC->ADDR1>>4)和0xFFF;
}
当我使用LPC_ADC->ADGDR时,它工作正常,但当我使用LPC_ADC->ADDR1时,它不工作,为什么?
我在ADC interup中使用了MAT
当我使用LPC_ADC->ADGDR时,一切正常
但是,当我使用LPC_ADC->ADDR1读取其不工作且不随MAT edge更改时,代码中的幻数太多。请使用所有这些位的相应定义。此代码无法读取

您的代码中有错误的注释,
ADGDR
的中断标志在
ADSTAT
读取时未被清除。只有读取
ADGDR
才能将其清除,这就是您的代码不能与
ADDR1
一起工作的原因


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

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

LPC_ADC->ADINTEN =  1 << 1;  //0x0002  
LPC\u ADC->ADINTEN=1