最近在使用MSP430FR2422 的ADC, 参考了TI提供的例子程序。发现如下代码:
“
// Configure ADC10
ADCCTL0 &= ~ADCENC; // Disable ADC
ADCCTL0 = ADCSHT_2 | ADCON; // ADCON, S&H=16 ADC clks
ADCCTL1 = ADCSHP; // ADCCLK = MODOSC; sampling timer
ADCCTL2 = ADCRES; // 10-bit conversion results
ADCIE = ADCIE0; // Enable ADC conv complete interrupt
ADCMCTL0 = ADCINCH_13 | ADCSREF_0; // A13 ADC input select = 1.5V Ref
// Vref = DVCC
// Configure reference module located in the PMM
PMMCTL0_H = PMMPW_H; // Unlock the PMM registers
PMMCTL2 |= INTREFEN; // Enable internal reference
while(!(PMMCTL2 & REFGENRDY)); // Poll till internal reference settles
”
发现有时候寄存器使用了标准的|= ,而有时候却直接用了=。 开始以为是例子程序写的时候忘记加| ,因此就都给补上了|, 但程序运行中发现ADC没有工作起来,采样值为0x000. 研究了很长时间发现,将程序复原为上述例子程序中的那样则ADC能正常工作。很是费解。请帮忙解释一下。非常感谢。
Brian
灰小子:
用=号的时候,非置1的位都会被置0
Ling Zhu2:
|= 是位操作。 = 是整个寄存器一起赋值。
user464287:
回复 Ling Zhu2:
好的,这个知道的,我问题的本意实际是在问是否有些寄存器因为特殊结构或者原因而不可以做位操作,只能一起赋值。因为我改成位操作后居然ADC不工作(ADC结果是0x000, 这个通过板子上的LED指示灯亮/灭验证多次)。
灰小子:
回复 user464287:
msp430frxx系列官网有提供库,建议使用库
习惯了用库,就再也不想去纠结寄存器了
user464287:
回复 灰小子:
你是说象类似I2C,ADC,WDT等等的操作都已经类似API那样了吗?如果是能麻烦给发个相关库链接吗?我没找到(有点笨^V^).
Susan Yang:
回复 user464287:
software-dl.ti.com/…/index_FDS.html
user464287:
回复 Susan Yang:
好的非常感谢。