gpt4 book ai didi

c - 简单注册测试失败

转载 作者:太空宇宙 更新时间:2023-11-04 08:28:11 25 4
gpt4 key购买 nike

我正在尝试操作 MCU 寄存器 ADC_CON_REG。我想将其设置为 1。位逻辑1,然后通过切换LED立即检查这是否为真。

#define ADC_CON_REG (*((volatile unsigned int *) 0x13002020))

ADC_CON_REG = ADC_CON_REG | (1<<1);

if ((ADC_CON_REG & (1<<1)) == (1<<1) ){
LED_on();
}

我以前工作的 LED 在这种情况下不会打开。我是不是遗漏了什么或者我的寄存器坏了?


添加:所以为了启用 ADC 和测试寄存器,我做了 LPC3141 中的教程 user manual :

enter image description here

这就是我想出的 - ADC 将无法工作:

#define ADC_R0_REG      (*((volatile unsigned int *) 0x13002000))
#define ADC_R1_REG (*((volatile unsigned int *) 0x13002004))
#define ADC_R2_REG (*((volatile unsigned int *) 0x13002008))
#define ADC_R3_REG (*((volatile unsigned int *) 0x1300200C))
#define ADC_CON_REG (*((volatile unsigned int *) 0x13002020))
#define ADC_CSEL_REG (*((volatile unsigned int *) 0x13002024))
#define ADC_INT_ENABLE_REG (*((volatile unsigned int *) 0x13002028))
#define ADC_INT_STATUS_REG (*((volatile unsigned int *) 0x1300202C))
#define ADC_INT_CLEAR_REG (*((volatile unsigned int *) 0x13002030))


//prototypes
void adc_reset(void);
void adc_setup(void);
unsigned int adc_run_continuous(void);

//variables (each chanel)
unsigned int val_0;
unsigned int val_1;
unsigned int val_2;
unsigned int val_3;


void c_entry(void){

MODE1_SET = MODE1_SET | (0x1 << 14);

adc_reset();
adc_setup();
adc_run_continuous();

}

void adc_reset(void){

ADC_CON_REG = ADC_CON_REG & !(1<<1);
ADC_CON_REG = ADC_CON_REG & !(1<<3);
ADC_CON_REG = ADC_CON_REG & !(1<<0);
ADC_CON_REG = ADC_CON_REG & !(1<<2);
ADC_CSEL_REG = ADC_CSEL_REG & !(0xFFFF);
ADC_INT_ENABLE_REG = ADC_INT_ENABLE_REG & !(1<<0);
ADC_INT_CLEAR_REG = ADC_INT_CLEAR_REG | (1<<0);

}

void adc_setup(void){

while((ADC_INT_STATUS_REG & (1<<0)) != 0x0);
ADC_INT_ENABLE_REG = ADC_INT_ENABLE_REG | (1<<0);
while((ADC_INT_STATUS_REG & (1<<0)) != 0x0);
ADC_CON_REG = ADC_CON_REG | (1<<0);
ADC_CSEL_REG = ADC_CSEL_REG & !(0xFFFF);
ADC_CSEL_REG = ADC_CSEL_REG | 0xAAAA;
ADC_CON_REG = ADC_CON_REG | (1<<1);

}


void adc_run_continuous(void){

ADC_CON_REG = ADC_CON_REG | (1<<2);
ADC_CON_REG = ADC_CON_REG | (1<<3);
ADC_CON_REG = ADC_CON_REG & !(1<<3);

while(1){
while((ADC_INT_STATUS_REG & (1<<0)) == 0x0);

if((ADC_INT_STATUS_REG & (1<<0)) == 0x1){
ADC_INT_CLEAR_REG = ADC_INT_CLEAR_REG | (1<<0);
}

val_0 = ADC_R0_REG;
val_1 = ADC_R1_REG;
val_2 = ADC_R2_REG;
val_3 = ADC_R3_REG;

while((ADC_INT_STATUS_REG & (1<<0)) != 0x0);

}


}

最佳答案

你对寄存器是什么有误解。一些寄存器就像一个内存,你写入逻辑1然后读回,它仍然是逻辑1。但是对于一些寄存器(或寄存器的某些位)它不像内存,“写入”和“读取”不'在寄存器后面操作一个真实的总线地址。

一些LPCxxx MCU中的ADC CTRL寄存器就是一个例子。当你向ADC使能位写入逻辑1时,后面的寄存器ADC开始做使能 Action ,但需要时间,直到使能 Action 完成后,该位才会变为逻辑1。

所以你应该像这样等待这个位变为 1:

while ((ADC_CON_REG & (1<<1)) != (1<<1) );
LED_on();

关于c - 简单注册测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29476575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com