This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
C2000Ware_5_00_00_00\driverlib\f28002x\driverlib\adc.c中的函数ADC_setOffsetTrim内容如下:
void ADC_setOffsetTrim(uint32_t base) { uint16_t *offset; uint32_t moduleShiftVal; uint16_t offsetShiftVal; uint16_t analogRefRegVal; ADC_ReferenceMode refMode; ADC_ReferenceVoltage refVoltage; // // Check the arguments. // ASSERT(ADC_isBaseValid(base)); // // Assign a shift amount corresponding to which ADC module is being // configured. // switch(base) { case ADCA_BASE: moduleShiftVal = 0U; break; case ADCC_BASE: moduleShiftVal = 1U; break; default: // // Invalid base address!! // moduleShiftVal = 0U; break; } // // Read the Analog Reference Control Register value to determine the // ADC reference mode and reference voltage value. // analogRefRegVal = HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFCTL); // // Calculate refMode and refVoltage based on input ADC base // refMode = (ADC_ReferenceMode)((analogRefRegVal >> moduleShiftVal) & 1U); refVoltage = (ADC_ReferenceVoltage)((analogRefRegVal >> (ADC_VOLTAGE_REF_REG_OFFSET + moduleShiftVal)) & 1U); // // Offset trim for internal VREF 3.3V is unique and stored in upper byte. // if((refMode == ADC_REFERENCE_INTERNAL) && (refVoltage == ADC_REFERENCE_3_3V)) { offsetShiftVal = 8U; } else { offsetShiftVal = 0U; } // // Set up pointer to offset trim in OTP. // offset = (uint16_t *)((uint32_t)ADC_OFFSET_TRIM_OTP + moduleShiftVal); // // Get offset trim from OTP and write it to the register. // EALLOW; HWREGH(base + ADC_O_OFFTRIM) = (*offset >> offsetShiftVal) & 0xFFU; EDIS; }
当该函数用于校准ADCA时,可以正常校准。
但用于校准ADCC时,参数moduleShiftVal的值是1,注意第45-47行,此时赋给refMode和refVoltage的值分别是analogRefRegVal(寄存器ANAREFCTL)值的bit1和bit9。
而寄存器ANAREFCTL的位域图如下:
实际上应该赋给refMode和refVoltage的值应该是寄存器ANAREFCTL值的bit2和bit10,而非bit1和bit9。
这是否是Driverlib Functions编写错误?
你好,
感谢您的问题。这的确是编写的错误,moduleShiftVal 的值应该是2U,已将该bug提交至相关团队,应该会在下个版本的C2000ware中更新。