这是我的代码
#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边缘改变
答案 0 :(得分:0)
代码中有太多幻数。请对所有这些位使用相应的定义。此代码不可读。
您的代码中有错误的评论,ADGDR
的中断标记在ADSTAT
读取时清除 。只有ADGDR
的读取才能清除它,这就是为什么您的代码无法与ADDR1
一起使用。
如果您使用该定义来设置ADINTEN,您可能会更早发现错误。该标志名为 ADGDINTEN ,仅对应于ADGDR中的标志。
答案 1 :(得分:0)
您应该通过以下方式启用ch1的IRQ:
LPC_ADC->ADINTEN = 1 << 1; //0x0002