mirror of https://github.com/ARMmbed/mbed-os.git
Fix AnalogIn implementation on STM32G4 series
parent
2ab7b44f10
commit
e9d6c9c0b1
|
@ -36,6 +36,7 @@
|
||||||
#include "mbed_error.h"
|
#include "mbed_error.h"
|
||||||
#include "mbed_debug.h"
|
#include "mbed_debug.h"
|
||||||
#include "PeripheralPins.h"
|
#include "PeripheralPins.h"
|
||||||
|
#include "stm32g4xx_ll_bus.h"
|
||||||
|
|
||||||
#if STATIC_PINMAP_READY
|
#if STATIC_PINMAP_READY
|
||||||
#define ANALOGIN_INIT_DIRECT analogin_init_direct
|
#define ANALOGIN_INIT_DIRECT analogin_init_direct
|
||||||
|
@ -72,6 +73,7 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
|
||||||
|
|
||||||
// Configure ADC object structures
|
// Configure ADC object structures
|
||||||
obj->handle.State = HAL_ADC_STATE_RESET;
|
obj->handle.State = HAL_ADC_STATE_RESET;
|
||||||
|
memset(&obj->handle.Init, 0, sizeof(obj->handle.Init));
|
||||||
obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
|
obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
|
||||||
obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
|
obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
|
||||||
obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||||
|
@ -82,38 +84,46 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
|
||||||
obj->handle.Init.NbrOfConversion = 1;
|
obj->handle.Init.NbrOfConversion = 1;
|
||||||
obj->handle.Init.DiscontinuousConvMode = DISABLE;
|
obj->handle.Init.DiscontinuousConvMode = DISABLE;
|
||||||
obj->handle.Init.NbrOfDiscConversion = 0;
|
obj->handle.Init.NbrOfDiscConversion = 0;
|
||||||
obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1;
|
obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||||
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
||||||
obj->handle.Init.DMAContinuousRequests = DISABLE;
|
obj->handle.Init.DMAContinuousRequests = DISABLE;
|
||||||
obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
|
obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
|
||||||
|
obj->handle.Init.GainCompensation = 0;
|
||||||
|
obj->handle.Init.OversamplingMode = DISABLE;
|
||||||
|
obj->handle.Init.SamplingMode = ADC_SAMPLING_MODE_NORMAL;
|
||||||
|
|
||||||
#if defined(ADC1)
|
#if defined(ADC1)
|
||||||
if ((ADCName)obj->handle.Instance == ADC_1) {
|
if ((ADCName)obj->handle.Instance == ADC_1) {
|
||||||
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); // TODO - disable clock with deinit?
|
||||||
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
|
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
|
||||||
// SYSCLK or PLL?
|
// SYSCLK or PLL?
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(ADC2)
|
#if defined(ADC2)
|
||||||
if ((ADCName)obj->handle.Instance == ADC_2) {
|
if ((ADCName)obj->handle.Instance == ADC_2) {
|
||||||
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); // TODO - disable clock with deinit?
|
||||||
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
|
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
|
||||||
// SYSCLK or PLL?
|
// SYSCLK or PLL?
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(ADC3)
|
#if defined(ADC3)
|
||||||
if ((ADCName)obj->handle.Instance == ADC_3) {
|
if ((ADCName)obj->handle.Instance == ADC_3) {
|
||||||
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit?
|
||||||
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
|
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
|
||||||
// SYSCLK or PLL?
|
// SYSCLK or PLL?
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(ADC4)
|
#if defined(ADC4)
|
||||||
if ((ADCName)obj->handle.Instance == ADC_4) {
|
if ((ADCName)obj->handle.Instance == ADC_4) {
|
||||||
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit?
|
||||||
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
|
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
|
||||||
// SYSCLK or PLL?
|
// SYSCLK or PLL?
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ADC5)
|
#if defined(ADC5)
|
||||||
if ((ADCName)obj->handle.Instance == ADC_4) {
|
if ((ADCName)obj->handle.Instance == ADC_5) {
|
||||||
|
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit?
|
||||||
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
|
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
|
||||||
// SYSCLK or PLL?
|
// SYSCLK or PLL?
|
||||||
}
|
}
|
||||||
|
@ -153,11 +163,15 @@ uint16_t adc_read(analogin_t *obj)
|
||||||
|
|
||||||
// Configure ADC channel
|
// Configure ADC channel
|
||||||
sConfig.Rank = ADC_REGULAR_RANK_1;
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||||
sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5;
|
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
|
||||||
sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
||||||
sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
||||||
sConfig.Offset = 0;
|
sConfig.Offset = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO - what about internal channels? VBAT, VREF, Temperature?
|
||||||
|
* TODO - what about internal OP AMP channels?
|
||||||
|
*/
|
||||||
switch (obj->channel) {
|
switch (obj->channel) {
|
||||||
case 1:
|
case 1:
|
||||||
sConfig.Channel = ADC_CHANNEL_1;
|
sConfig.Channel = ADC_CHANNEL_1;
|
||||||
|
@ -202,45 +216,16 @@ uint16_t adc_read(analogin_t *obj)
|
||||||
sConfig.Channel = ADC_CHANNEL_14;
|
sConfig.Channel = ADC_CHANNEL_14;
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
if ((ADCName)obj->handle.Instance == ADC_1) {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_VOPAMP1;
|
|
||||||
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
|
|
||||||
} else {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_15;
|
sConfig.Channel = ADC_CHANNEL_15;
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
if ((ADCName)obj->handle.Instance == ADC_1) {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR_ADC1;
|
|
||||||
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
|
|
||||||
} else {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_16;
|
sConfig.Channel = ADC_CHANNEL_16;
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 17:
|
case 17:
|
||||||
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
|
sConfig.Channel = ADC_CHANNEL_17;
|
||||||
if ((ADCName)obj->handle.Instance == ADC_1) {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_VBAT;
|
|
||||||
}
|
|
||||||
#if defined(ADC2)
|
|
||||||
if ((ADCName)obj->handle.Instance == ADC_2) {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_VOPAMP2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(ADC3)
|
|
||||||
if ((ADCName)obj->handle.Instance == ADC_3) {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_VOPAMP3_ADC3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(ADC4)
|
|
||||||
if ((ADCName)obj->handle.Instance == ADC_4) {
|
|
||||||
sConfig.Channel = ADC_CHANNEL_VOPAMP4;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case 18:
|
case 18:
|
||||||
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
|
sConfig.Channel = ADC_CHANNEL_18;
|
||||||
sConfig.Channel = ADC_CHANNEL_VREFINT;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2469,9 +2469,6 @@
|
||||||
"EXTRA_IDLE_STACK_REQUIRED",
|
"EXTRA_IDLE_STACK_REQUIRED",
|
||||||
"MBED_TICKLESS"
|
"MBED_TICKLESS"
|
||||||
],
|
],
|
||||||
"device_has_remove": [
|
|
||||||
"ANALOGIN"
|
|
||||||
],
|
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"lpticker_delay_ticks": 0
|
"lpticker_delay_ticks": 0
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue