我試圖操縱一個MCU寄存器ADC_CON_REG
。我想將其設置爲1.位至邏輯1然後立即檢查這是否屬實。簡單寄存器測試失敗
#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:
這是我想出了 - ADC贏得't work:
#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);
}
}
該寄存器是硬件。寫一些不必要的東西在閱讀時會實際修改它們。可能它處於某種狀態,它不能被更改。 –
它是一個**讀/寫**(R/W)寄存器。所以這不應該是我想的問題。 – 71GA
這不是寫的問題。但問題是,之後的閱讀不符合你的期望。它可以被寫入,但後來立即被硬件改回。 –