diff --git a/targets/TARGET_STM/TARGET_STM32G4/analogin_device.c b/targets/TARGET_STM/TARGET_STM32G4/analogin_device.c index 3dde9a3eae..a79e357ea4 100644 --- a/targets/TARGET_STM/TARGET_STM32G4/analogin_device.c +++ b/targets/TARGET_STM/TARGET_STM32G4/analogin_device.c @@ -36,6 +36,7 @@ #include "mbed_error.h" #include "mbed_debug.h" #include "PeripheralPins.h" +#include "stm32g4xx_ll_bus.h" #if STATIC_PINMAP_READY #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 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.Resolution = ADC_RESOLUTION_12B; obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; @@ -82,40 +84,48 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap) obj->handle.Init.NbrOfConversion = 1; obj->handle.Init.DiscontinuousConvMode = DISABLE; 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.DMAContinuousRequests = DISABLE; 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 ((ADCName)obj->handle.Instance == ADC_1) { - __HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock? - // SYSCLK or PLL? + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); // TODO - disable clock with deinit? + __HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock? + // SYSCLK or PLL? } #endif #if defined(ADC2) if ((ADCName)obj->handle.Instance == ADC_2) { - __HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock? - // SYSCLK or PLL? + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); // TODO - disable clock with deinit? + __HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock? + // SYSCLK or PLL? } #endif #if defined(ADC3) if ((ADCName)obj->handle.Instance == ADC_3) { - __HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock? - // SYSCLK or PLL? + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit? + __HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock? + // SYSCLK or PLL? } #endif #if defined(ADC4) if ((ADCName)obj->handle.Instance == ADC_4) { - __HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock? - // SYSCLK or PLL? + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit? + __HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock? + // SYSCLK or PLL? } #endif #if defined(ADC5) - if ((ADCName)obj->handle.Instance == ADC_4) { - __HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock? - // SYSCLK or PLL? + 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? + // SYSCLK or PLL? } #endif @@ -153,11 +163,15 @@ uint16_t adc_read(analogin_t *obj) // Configure ADC channel sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5; + sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; + /** + * TODO - what about internal channels? VBAT, VREF, Temperature? + * TODO - what about internal OP AMP channels? + */ switch (obj->channel) { case 1: sConfig.Channel = ADC_CHANNEL_1; @@ -202,45 +216,16 @@ uint16_t adc_read(analogin_t *obj) sConfig.Channel = ADC_CHANNEL_14; break; 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; 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; case 17: - sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5; - 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 + sConfig.Channel = ADC_CHANNEL_17; break; case 18: - sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5; - sConfig.Channel = ADC_CHANNEL_VREFINT; + sConfig.Channel = ADC_CHANNEL_18; break; default: return 0; diff --git a/targets/targets.json b/targets/targets.json index a624b2df6f..16d7a2e6f7 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -2469,9 +2469,6 @@ "EXTRA_IDLE_STACK_REQUIRED", "MBED_TICKLESS" ], - "device_has_remove": [ - "ANALOGIN" - ], "overrides": { "lpticker_delay_ticks": 0 },