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