Added differential calibration to STM32 ADCv3.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@13359 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
7a9a0d0ad2
commit
882f416761
|
@ -69,11 +69,23 @@
|
||||||
|
|
||||||
/* Addressing header differences.*/
|
/* Addressing header differences.*/
|
||||||
#if !defined(ADC_IER_OVRIE)
|
#if !defined(ADC_IER_OVRIE)
|
||||||
#define ADC_IER_OVRIE ADC_IER_OVR
|
#define ADC_IER_OVRIE ADC_IER_OVR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(ADC_IER_AWD1IE)
|
#if !defined(ADC_IER_AWD1IE)
|
||||||
#define ADC_IER_AWD1IE ADC_IER_AWD1
|
#define ADC_IER_AWD1IE ADC_IER_AWD1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ADC_CR_ADVREGEN)
|
||||||
|
#define ADC_CR_ADVREGEN ADC_CR_ADVREGEN_0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ADC_CR_DEEPPWD)
|
||||||
|
#define ADC_CR_DEEPPWD ADC_CR_ADVREGEN_1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ADC_ISR_ADRDY)
|
||||||
|
#define ADC_ISR_ADRDY ADC_ISR_ADRD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -121,23 +133,12 @@ static uint32_t clkmask;
|
||||||
*/
|
*/
|
||||||
static void adc_lld_vreg_on(ADCDriver *adcp) {
|
static void adc_lld_vreg_on(ADCDriver *adcp) {
|
||||||
|
|
||||||
#if defined(STM32F3XX)
|
adcp->adcm->CR = 0; /* See RM.*/
|
||||||
adcp->adcm->CR = 0; /* RM 12.4.3.*/
|
|
||||||
adcp->adcm->CR = ADC_CR_ADVREGEN_0;
|
|
||||||
#if STM32_ADC_DUAL_MODE
|
|
||||||
adcp->adcs->CR = ADC_CR_ADVREGEN_0;
|
|
||||||
#endif
|
|
||||||
osalSysPolledDelayX(OSAL_US2RTC(STM32_HCLK, 10));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(STM32L4XX) || defined(STM32L4XXP) || defined(STM32G4XX)
|
|
||||||
adcp->adcm->CR = 0; /* RM 16.3.6.*/
|
|
||||||
adcp->adcm->CR = ADC_CR_ADVREGEN;
|
adcp->adcm->CR = ADC_CR_ADVREGEN;
|
||||||
#if STM32_ADC_DUAL_MODE
|
#if STM32_ADC_DUAL_MODE
|
||||||
adcp->adcs->CR = ADC_CR_ADVREGEN;
|
adcp->adcs->CR = ADC_CR_ADVREGEN;
|
||||||
#endif
|
#endif
|
||||||
osalSysPolledDelayX(OSAL_US2RTC(STM32_HCLK, 20));
|
osalSysPolledDelayX(OSAL_US2RTC(STM32_HCLK, 20));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -147,22 +148,49 @@ static void adc_lld_vreg_on(ADCDriver *adcp) {
|
||||||
*/
|
*/
|
||||||
static void adc_lld_vreg_off(ADCDriver *adcp) {
|
static void adc_lld_vreg_off(ADCDriver *adcp) {
|
||||||
|
|
||||||
#if defined(STM32F3XX)
|
adcp->adcm->CR = 0; /* See RM.*/
|
||||||
adcp->adcm->CR = 0; /* RM 12.4.3.*/
|
|
||||||
adcp->adcm->CR = ADC_CR_ADVREGEN_1;
|
|
||||||
#if STM32_ADC_DUAL_MODE
|
|
||||||
adcp->adcs->CR = 0;
|
|
||||||
adcp->adcs->CR = ADC_CR_ADVREGEN_1;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(STM32L4XX) || defined(STM32L4XXP) || defined(STM32G4XX)
|
|
||||||
adcp->adcm->CR = 0; /* RM 12.4.3.*/
|
|
||||||
adcp->adcm->CR = ADC_CR_DEEPPWD;
|
adcp->adcm->CR = ADC_CR_DEEPPWD;
|
||||||
#if STM32_ADC_DUAL_MODE
|
#if STM32_ADC_DUAL_MODE
|
||||||
adcp->adcs->CR = 0;
|
adcp->adcs->CR = 0;
|
||||||
adcp->adcs->CR = ADC_CR_DEEPPWD;
|
adcp->adcs->CR = ADC_CR_DEEPPWD;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calibrates and ADC unit.
|
||||||
|
*
|
||||||
|
* @param[in] adcp pointer to the @p ADCDriver object
|
||||||
|
*/
|
||||||
|
static void adc_lld_calibrate(ADCDriver *adcp) {
|
||||||
|
|
||||||
|
osalDbgAssert(adcp->adcm->CR == ADC_CR_ADVREGEN, "invalid register state");
|
||||||
|
|
||||||
|
/* Differential calibration for master ADC-*/
|
||||||
|
adcp->adcm->CR = ADC_CR_ADVREGEN | ADC_CR_ADCALDIF;
|
||||||
|
adcp->adcm->CR = ADC_CR_ADVREGEN | ADC_CR_ADCALDIF | ADC_CR_ADCAL;
|
||||||
|
while ((adcp->adcm->CR & ADC_CR_ADCAL) != 0)
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Single-ended calibration for master ADC-*/
|
||||||
|
adcp->adcm->CR = ADC_CR_ADVREGEN;
|
||||||
|
adcp->adcm->CR = ADC_CR_ADVREGEN | ADC_CR_ADCAL;
|
||||||
|
while ((adcp->adcm->CR & ADC_CR_ADCAL) != 0)
|
||||||
|
;
|
||||||
|
|
||||||
|
#if STM32_ADC_DUAL_MODE
|
||||||
|
osalDbgAssert(adcp->adcs->CR == ADC_CR_ADVREGEN, "invalid register state");
|
||||||
|
|
||||||
|
/* Differential calibration for slave ADC-*/
|
||||||
|
adcp->adcs->CR = ADC_CR_ADVREGEN | ADC_CR_ADCALDIF;
|
||||||
|
adcp->adcs->CR = ADC_CR_ADVREGEN | ADC_CR_ADCALDIF | ADC_CR_ADCAL;
|
||||||
|
while ((adcp->adcs->CR & ADC_CR_ADCAL) != 0)
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Single-ended calibration for slave ADC-*/
|
||||||
|
adcp->adcs->CR = ADC_CR_ADVREGEN;
|
||||||
|
adcp->adcs->CR = ADC_CR_ADVREGEN | ADC_CR_ADCAL;
|
||||||
|
while ((adcp->adcs->CR & ADC_CR_ADCAL) != 0)
|
||||||
|
;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,18 +201,6 @@ static void adc_lld_vreg_off(ADCDriver *adcp) {
|
||||||
*/
|
*/
|
||||||
static void adc_lld_analog_on(ADCDriver *adcp) {
|
static void adc_lld_analog_on(ADCDriver *adcp) {
|
||||||
|
|
||||||
#if defined(STM32F3XX)
|
|
||||||
adcp->adcm->CR |= ADC_CR_ADEN;
|
|
||||||
while ((adcp->adcm->ISR & ADC_ISR_ADRD) == 0)
|
|
||||||
;
|
|
||||||
#if STM32_ADC_DUAL_MODE
|
|
||||||
adcp->adcs->CR |= ADC_CR_ADEN;
|
|
||||||
while ((adcp->adcs->ISR & ADC_ISR_ADRD) == 0)
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(STM32L4XX) || defined(STM32L4XXP) || defined(STM32G4XX)
|
|
||||||
adcp->adcm->CR |= ADC_CR_ADEN;
|
adcp->adcm->CR |= ADC_CR_ADEN;
|
||||||
while ((adcp->adcm->ISR & ADC_ISR_ADRDY) == 0)
|
while ((adcp->adcm->ISR & ADC_ISR_ADRDY) == 0)
|
||||||
;
|
;
|
||||||
|
@ -193,7 +209,6 @@ static void adc_lld_analog_on(ADCDriver *adcp) {
|
||||||
while ((adcp->adcs->ISR & ADC_ISR_ADRDY) == 0)
|
while ((adcp->adcs->ISR & ADC_ISR_ADRDY) == 0)
|
||||||
;
|
;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -213,40 +228,6 @@ static void adc_lld_analog_off(ADCDriver *adcp) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Calibrates and ADC unit.
|
|
||||||
*
|
|
||||||
* @param[in] adcp pointer to the @p ADCDriver object
|
|
||||||
*/
|
|
||||||
static void adc_lld_calibrate(ADCDriver *adcp) {
|
|
||||||
|
|
||||||
#if defined(STM32F3XX)
|
|
||||||
osalDbgAssert(adcp->adcm->CR == ADC_CR_ADVREGEN_0, "invalid register state");
|
|
||||||
adcp->adcm->CR |= ADC_CR_ADCAL;
|
|
||||||
while ((adcp->adcm->CR & ADC_CR_ADCAL) != 0)
|
|
||||||
;
|
|
||||||
#if STM32_ADC_DUAL_MODE
|
|
||||||
osalDbgAssert(adcp->adcs->CR == ADC_CR_ADVREGEN_0, "invalid register state");
|
|
||||||
adcp->adcs->CR |= ADC_CR_ADCAL;
|
|
||||||
while ((adcp->adcs->CR & ADC_CR_ADCAL) != 0)
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(STM32L4XX) || defined(STM32L4XXP) || defined(STM32G4XX)
|
|
||||||
osalDbgAssert(adcp->adcm->CR == ADC_CR_ADVREGEN, "invalid register state");
|
|
||||||
adcp->adcm->CR |= ADC_CR_ADCAL;
|
|
||||||
while ((adcp->adcm->CR & ADC_CR_ADCAL) != 0)
|
|
||||||
;
|
|
||||||
#if STM32_ADC_DUAL_MODE
|
|
||||||
osalDbgAssert(adcp->adcs->CR == ADC_CR_ADVREGEN, "invalid register state");
|
|
||||||
adcp->adcs->CR |= ADC_CR_ADCAL;
|
|
||||||
while ((adcp->adcs->CR & ADC_CR_ADCAL) != 0)
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stops an ongoing conversion, if any.
|
* @brief Stops an ongoing conversion, if any.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue