5 年后 - NXP ADC 无法正常工作
5 years later - NXP ADCs aren't working
前段时间我试图在 NXP 的 LPC3143 上对 ADC 进行编程,但没有成功。 5 年后的现在,我给自己买了一个 LPC4088 Quick start board 并用 LPC4088 试用。 ADC 再次出现同样的问题!当 I/O 配置、GPIO、定时器和 PWM 工作得很好时,我似乎无法让它工作...
我总是通过阅读 user manual 来对 MCU 进行编程。所以在阅读手册后,这就是我想出的:
LPC4088-ioconfig.h
//register definitions for IOCONFIG peripheral
//this one is "type A"
#define IOCON_P1_31 (*((volatile unsigned int *) 0x4002C0FC))
LPC4088-system.h
//register definitions for system & clock peripheral
//used to turn on peripherals
#define PCONP (*((volatile unsigned int *) 0x400FC0C4))
LPC4088-gpio.h
//register definitions for GPIO peripheral
//only port 1
#define DIR1 (*((volatile unsigned int *) 0x20098020))
#define MASK1 (*((volatile unsigned int *) 0x20098030))
#define PIN1 (*((volatile unsigned int *) 0x20098034))
#define SET1 (*((volatile unsigned int *) 0x20098038))
#define CLR1 (*((volatile unsigned int *) 0x2009803C))
LPC4088-adc.h
//register definitions for ADC peripheral
#define CR (*((volatile unsigned int *) 0x40034000))
#define GDR (*((volatile unsigned int *) 0x40034004))
#define INTEN (*((volatile unsigned int *) 0x4003400C))
#define DR0 (*((volatile unsigned int *) 0x40034010))
#define DR1 (*((volatile unsigned int *) 0x40034014))
#define DR2 (*((volatile unsigned int *) 0x40034018))
#define DR3 (*((volatile unsigned int *) 0x4003401C))
#define DR4 (*((volatile unsigned int *) 0x40034020))
#define DR5 (*((volatile unsigned int *) 0x40034024))
#define DR6 (*((volatile unsigned int *) 0x40034028))
#define DR7 (*((volatile unsigned int *) 0x4003402C))
#define STAT (*((volatile unsigned int *) 0x40034030))
#define TRM (*((volatile unsigned int *) 0x40034034))
main.c
#include "LPC4088-ioconfig.h"
#include "LPC4088-system.h"
#include "LPC4088-gpio.h"
#include "LPC4088-adc.h"
int main(){
//***********************************************************
//we set P1.13 (port 1, pin 13) as GPIO, no pull-up, no hysteresis, not inverted, standard, push-pull
IOCON_P1_13 &= !(0x67F);
//we turn on GPIO peripheral
PCONP |= (1<<15);
//set P1.13 as an output GPIO
DIR1 |= (1<<13);
//setting a mask for pin P1.13
MASK1 &= !(1<<13);
//***********************************************************
//configure pin P1.31 as an input ADC0_IN5 (channel 5)
IOCON_P1_31 |= 0b011;
//we disable pullup or pulldown resistors on pin P1.31
IOCON_P1_31 &= !(0x3<<4);
//we configure pin P1.31 for ADMODE
IOCON_P1_31 &= !(1<<7);
//we turn on the ADC peripheral
PCONP |= (1<<12);
//we divide PCLK delimo with 99+1=100 (only for precaution)
CR |= (99<<8);
//we start the ADC
CR |= (1<<21);
//we disable ADC interrupts
INTEN &= !(0x1FF);
//we choose chanel 5 which is the only one that we choose
CR &= !(0xFF);
CR |= (1<<5);
//before choosing "burst mode" we need to turn off the conversion
CR &= !(0x7<<24);
//we choose "burst mode" - conversion starts and is continuous
CR |= (1<<16);
//***********************************************************
while(1){
//we wait for the conversion to finish and we save the result
//we right-shift because value is stored in DR5 bits 15:4!
while( (DR5 & (1<<31) ) != (1<<31) );
int result = ( (DR5 & 0xFF0) >> 4);
//12-bit has a max value of 0xFFF - we compare result to the half of this value - 0x7FF.
if (result >= 0x7FF){
//turn on an LED on pin P1.13
SET1 |= (1<<13);
}
else{
//turn off an LED on pin P1.13
CLR1 |= (1<<13);
}
}
}
这里还有一个更详细的LPC4088快速启动板的接口描述-我的外部电位器输出连接到P1.31,而LED已经嵌入到板上:
好的,所以我为了这件事拼命工作 10 个小时 ,然后在早上 4:30 上床睡觉...这是 - LPC4088 ADC 的工作示例(头文件与问题中的相同):
#include "LPC4088-ioconfig.h"
#include "LPC4088-system.h"
#include "LPC4088-gpio.h"
#include "LPC4088-adc.h"
int main(){
IOCON_P1_13 &= !(0x67F);
IOCON_P1_31 |= 0b011;
IOCON_P1_31 &= !(0b11<<4);
IOCON_P1_31 &= !(1<<7);
IOCON_P0_23 |= 0b011;
IOCON_P0_23 &= !(0b11<<4);
IOCON_P0_23 &= !(1<<7);
PCONP |= (1<<15);
DIR1 |= (1<<13);
MASK1 &= !(1<<13);
PCONP |= (1<<12);
INTEN &= !(0x1FF);
CR &= !(0x7<<24);
CR &= !(1<<16);
while(1){
CR |= (1<<21);
CR |= (0x1<<24);
while( (STAT & (1<<0) ) == 0x0 );
CR &= !(0x1<<24);
unsigned int result = 0;
result = ( (DR0 & 0xFFF0) >> 4);
CR &= (1<<21);
if (result > 0x7FF){
SET1 |= (1<<13);
}
else{
CLR1 |= (1<<13);
}
}
}
比 LPC-Open 中的示例简单得多。 我敢打赌这会对你们中的一些人有所帮助...我打算打开我的 GIT这些示例适用于所有外围设备。但是现在我只会操作ioconfig,gpio,timer,pwm和adc
前段时间我试图在 NXP 的 LPC3143 上对 ADC 进行编程,但没有成功。 5 年后的现在,我给自己买了一个 LPC4088 Quick start board 并用 LPC4088 试用。 ADC 再次出现同样的问题!当 I/O 配置、GPIO、定时器和 PWM 工作得很好时,我似乎无法让它工作...
我总是通过阅读 user manual 来对 MCU 进行编程。所以在阅读手册后,这就是我想出的:
LPC4088-ioconfig.h
//register definitions for IOCONFIG peripheral
//this one is "type A"
#define IOCON_P1_31 (*((volatile unsigned int *) 0x4002C0FC))
LPC4088-system.h
//register definitions for system & clock peripheral
//used to turn on peripherals
#define PCONP (*((volatile unsigned int *) 0x400FC0C4))
LPC4088-gpio.h
//register definitions for GPIO peripheral
//only port 1
#define DIR1 (*((volatile unsigned int *) 0x20098020))
#define MASK1 (*((volatile unsigned int *) 0x20098030))
#define PIN1 (*((volatile unsigned int *) 0x20098034))
#define SET1 (*((volatile unsigned int *) 0x20098038))
#define CLR1 (*((volatile unsigned int *) 0x2009803C))
LPC4088-adc.h
//register definitions for ADC peripheral
#define CR (*((volatile unsigned int *) 0x40034000))
#define GDR (*((volatile unsigned int *) 0x40034004))
#define INTEN (*((volatile unsigned int *) 0x4003400C))
#define DR0 (*((volatile unsigned int *) 0x40034010))
#define DR1 (*((volatile unsigned int *) 0x40034014))
#define DR2 (*((volatile unsigned int *) 0x40034018))
#define DR3 (*((volatile unsigned int *) 0x4003401C))
#define DR4 (*((volatile unsigned int *) 0x40034020))
#define DR5 (*((volatile unsigned int *) 0x40034024))
#define DR6 (*((volatile unsigned int *) 0x40034028))
#define DR7 (*((volatile unsigned int *) 0x4003402C))
#define STAT (*((volatile unsigned int *) 0x40034030))
#define TRM (*((volatile unsigned int *) 0x40034034))
main.c
#include "LPC4088-ioconfig.h"
#include "LPC4088-system.h"
#include "LPC4088-gpio.h"
#include "LPC4088-adc.h"
int main(){
//***********************************************************
//we set P1.13 (port 1, pin 13) as GPIO, no pull-up, no hysteresis, not inverted, standard, push-pull
IOCON_P1_13 &= !(0x67F);
//we turn on GPIO peripheral
PCONP |= (1<<15);
//set P1.13 as an output GPIO
DIR1 |= (1<<13);
//setting a mask for pin P1.13
MASK1 &= !(1<<13);
//***********************************************************
//configure pin P1.31 as an input ADC0_IN5 (channel 5)
IOCON_P1_31 |= 0b011;
//we disable pullup or pulldown resistors on pin P1.31
IOCON_P1_31 &= !(0x3<<4);
//we configure pin P1.31 for ADMODE
IOCON_P1_31 &= !(1<<7);
//we turn on the ADC peripheral
PCONP |= (1<<12);
//we divide PCLK delimo with 99+1=100 (only for precaution)
CR |= (99<<8);
//we start the ADC
CR |= (1<<21);
//we disable ADC interrupts
INTEN &= !(0x1FF);
//we choose chanel 5 which is the only one that we choose
CR &= !(0xFF);
CR |= (1<<5);
//before choosing "burst mode" we need to turn off the conversion
CR &= !(0x7<<24);
//we choose "burst mode" - conversion starts and is continuous
CR |= (1<<16);
//***********************************************************
while(1){
//we wait for the conversion to finish and we save the result
//we right-shift because value is stored in DR5 bits 15:4!
while( (DR5 & (1<<31) ) != (1<<31) );
int result = ( (DR5 & 0xFF0) >> 4);
//12-bit has a max value of 0xFFF - we compare result to the half of this value - 0x7FF.
if (result >= 0x7FF){
//turn on an LED on pin P1.13
SET1 |= (1<<13);
}
else{
//turn off an LED on pin P1.13
CLR1 |= (1<<13);
}
}
}
这里还有一个更详细的LPC4088快速启动板的接口描述-我的外部电位器输出连接到P1.31,而LED已经嵌入到板上:
好的,所以我为了这件事拼命工作 10 个小时 ,然后在早上 4:30 上床睡觉...这是 - LPC4088 ADC 的工作示例(头文件与问题中的相同):
#include "LPC4088-ioconfig.h"
#include "LPC4088-system.h"
#include "LPC4088-gpio.h"
#include "LPC4088-adc.h"
int main(){
IOCON_P1_13 &= !(0x67F);
IOCON_P1_31 |= 0b011;
IOCON_P1_31 &= !(0b11<<4);
IOCON_P1_31 &= !(1<<7);
IOCON_P0_23 |= 0b011;
IOCON_P0_23 &= !(0b11<<4);
IOCON_P0_23 &= !(1<<7);
PCONP |= (1<<15);
DIR1 |= (1<<13);
MASK1 &= !(1<<13);
PCONP |= (1<<12);
INTEN &= !(0x1FF);
CR &= !(0x7<<24);
CR &= !(1<<16);
while(1){
CR |= (1<<21);
CR |= (0x1<<24);
while( (STAT & (1<<0) ) == 0x0 );
CR &= !(0x1<<24);
unsigned int result = 0;
result = ( (DR0 & 0xFFF0) >> 4);
CR &= (1<<21);
if (result > 0x7FF){
SET1 |= (1<<13);
}
else{
CLR1 |= (1<<13);
}
}
}
比 LPC-Open 中的示例简单得多。 我敢打赌这会对你们中的一些人有所帮助...我打算打开我的 GIT这些示例适用于所有外围设备。但是现在我只会操作ioconfig,gpio,timer,pwm和adc