From f6daed6c10e745b364435e5daaf45d26274fe0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A1ssio=20Romanin=20de=20Lazaro?= Date: Wed, 5 Jun 2024 11:59:02 +0000 Subject: [PATCH] extend adc feature --- hal_st/stm32fxxx/AdcDmaStm.cpp | 45 +++++++-------- hal_st/stm32fxxx/AnalogToDigitalPinStm.cpp | 65 ++++++++++++---------- hal_st/stm32fxxx/AnalogToDigitalPinStm.hpp | 13 +++-- hal_st/stm32fxxx/CMakeLists.txt | 16 ++++-- hal_st/stm32fxxx/PeripheralTableWbaxx.xml | 29 ++++++++++ 5 files changed, 106 insertions(+), 62 deletions(-) create mode 100644 hal_st/stm32fxxx/PeripheralTableWbaxx.xml diff --git a/hal_st/stm32fxxx/AdcDmaStm.cpp b/hal_st/stm32fxxx/AdcDmaStm.cpp index 692f4418..14a57910 100644 --- a/hal_st/stm32fxxx/AdcDmaStm.cpp +++ b/hal_st/stm32fxxx/AdcDmaStm.cpp @@ -11,33 +11,32 @@ namespace hal TransferDone(); }) , analogPin(pin) -#if defined(STM32G0) - , timer(3, timing, { TimerBaseStm::CounterMode::up, infra::MakeOptional({ TimerBaseStm::Trigger::TriggerOutput::update, false }) }) -#else +#ifdef TIM2 , timer(2, timing, { TimerBaseStm::CounterMode::up, infra::MakeOptional({ TimerBaseStm::Trigger::TriggerOutput::update, false }) }) +#else + , timer(3, timing, { TimerBaseStm::CounterMode::up, infra::MakeOptional({ TimerBaseStm::Trigger::TriggerOutput::update, false }) }) #endif { - ADC_ChannelConfTypeDef channelConfig; + ADC_ChannelConfTypeDef channelConfig{}; channelConfig.Channel = adc.Channel(analogPin); -#if !defined(STM32WB) +#ifdef ADC_REGULAR_RANK_1 + channelConfig.Rank = ADC_REGULAR_RANK_1; +#else channelConfig.Rank = 1; +#endif + +#ifdef ADC_SMPR_SMP1 + channelConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; #else - channelConfig.Rank = ADC_REGULAR_RANK_1; + channelConfig.SamplingTime = hal::detail::AdcStmChannelConfig().samplingTime; #endif -#if defined(STM32F0) || defined(STM32F3) - channelConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5; -#elif defined(STM32WB) - channelConfig.SingleDiff = ADC_SINGLE_ENDED; - channelConfig.SamplingTime = ADC_SAMPLETIME_92CYCLES_5; - channelConfig.Offset = 0; +#ifdef ADC_OFFSET_NONE channelConfig.OffsetNumber = ADC_OFFSET_NONE; -#elif defined(STM32G0) - channelConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES_5; -#elif defined(STM32G4) - channelConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES_5; - channelConfig.Offset = 0; -#else - channelConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; +#endif +#ifdef ADC_SINGLE_ENDED + channelConfig.SingleDiff = ADC_SINGLE_ENDED; +#endif +#ifdef ADC_OFFSET_1 channelConfig.Offset = 0; #endif ReconfigureTrigger(); @@ -45,7 +44,9 @@ namespace hal auto result = HAL_ADC_ConfigChannel(&adc.Handle(), &channelConfig); assert(result == HAL_OK); +#ifdef ADC_SINGLE_ENDED result = HAL_ADCEx_Calibration_Start(&adc.Handle(), ADC_SINGLE_ENDED); +#endif assert(result == HAL_OK); } @@ -63,14 +64,14 @@ namespace hal { HAL_ADC_Stop(&adc.Handle()); -#if defined(STM32F4) || defined(STM32F7) +#if defined(ADC_EXTERNALTRIGCONV_T2_TRGO) LL_ADC_REG_SetTriggerSource(adc.Handle().Instance, ADC_EXTERNALTRIGCONV_T2_TRGO); -#elif defined(STM32G0) +#elif defined(ADC_EXTERNALTRIG_T3_TRGO) LL_ADC_REG_SetTriggerSource(adc.Handle().Instance, ADC_EXTERNALTRIG_T3_TRGO); #else LL_ADC_REG_SetTriggerSource(adc.Handle().Instance, ADC_EXTERNALTRIG_T2_TRGO); #endif - LL_ADC_REG_SetTriggerEdge(adc.Handle().Instance, LL_ADC_REG_TRIG_EXT_RISING); + LL_ADC_REG_SetTriggerEdge(adc.Handle().Instance, ADC_EXTERNALTRIGCONVEDGE_RISING); } void AdcTriggeredByTimerWithDma::Configure() diff --git a/hal_st/stm32fxxx/AnalogToDigitalPinStm.cpp b/hal_st/stm32fxxx/AnalogToDigitalPinStm.cpp index 592e4613..eee069d4 100644 --- a/hal_st/stm32fxxx/AnalogToDigitalPinStm.cpp +++ b/hal_st/stm32fxxx/AnalogToDigitalPinStm.cpp @@ -38,9 +38,10 @@ namespace namespace hal { - AnalogToDigitalPinImplStm::AnalogToDigitalPinImplStm(hal::GpioPinStm& pin, AdcStm& adc) + AnalogToDigitalPinImplStm::AnalogToDigitalPinImplStm(hal::GpioPinStm& pin, AdcStm& adc, const Config& config) : analogPin(pin) , adc(adc) + , config(config) { HAL_ADC_Stop(&adc.Handle()); LL_ADC_REG_SetTriggerSource(adc.Handle().Instance, ADC_SOFTWARE_START); @@ -48,24 +49,26 @@ namespace hal void AnalogToDigitalPinImplStm::Measure(std::size_t numberOfSamples, const infra::Function)>& onDone) { - ADC_ChannelConfTypeDef channelConfig; + ADC_ChannelConfTypeDef channelConfig{}; channelConfig.Channel = adc.Channel(analogPin); -#if defined(STM32WB) || defined(STM32G0) || defined(STM32G4) + +#ifdef ADC_REGULAR_RANK_1 channelConfig.Rank = ADC_REGULAR_RANK_1; #else channelConfig.Rank = 1; #endif -#if defined(STM32F0) || defined(STM32F3) - channelConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5; -#elif defined(STM32WB) || defined(STM32G4) - channelConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; - channelConfig.Offset = 0; +#ifdef ADC_SMPR_SMP1 + channelConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; +#else + channelConfig.SamplingTime = config.samplingTime; +#endif +#ifdef ADC_OFFSET_NONE channelConfig.OffsetNumber = ADC_OFFSET_NONE; +#endif +#ifdef ADC_SINGLE_ENDED channelConfig.SingleDiff = ADC_SINGLE_ENDED; -#elif defined(STM32G0) || defined(STM32WBA) - channelConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES_5; -#else - channelConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; +#endif +#ifdef ADC_OFFSET_1 channelConfig.Offset = 0; #endif HAL_StatusTypeDef result = HAL_ADC_ConfigChannel(&adc.Handle(), &channelConfig); @@ -84,8 +87,8 @@ namespace hal void AnalogToDigitalInternalTemperatureStm::Measure(std::size_t numberOfSamples, const infra::Function)>& onDone) { - ADC_ChannelConfTypeDef channelConfig; -#if defined(ADC_CHANNEL_TEMPSENSOR) + ADC_ChannelConfTypeDef channelConfig{}; +#ifdef ADC_CHANNEL_TEMPSENSOR channelConfig.Channel = ADC_CHANNEL_TEMPSENSOR; #else if (adc.index == 1) @@ -93,16 +96,18 @@ namespace hal else channelConfig.Channel = ADC_CHANNEL_TEMPSENSOR_ADC5; #endif -#if defined(STM32WB) || defined(STM32G0) || defined(STM32G4) +#ifdef ADC_REGULAR_RANK_1 channelConfig.Rank = ADC_REGULAR_RANK_1; #else channelConfig.Rank = 1; #endif -#if defined(STM32WB) || defined(STM32G4) +#ifdef ADC_OFFSET_NONE channelConfig.OffsetNumber = ADC_OFFSET_NONE; +#endif +#ifdef ADC_SINGLE_ENDED channelConfig.SingleDiff = ADC_SINGLE_ENDED; #endif -#if !defined(STM32F0) && !defined(STM32F3) && !defined(STM32G0) && !defined(STM32WBA) +#ifdef ADC_OFFSET_1 channelConfig.Offset = 0; #endif channelConfig.SamplingTime = config.samplingTime; @@ -131,37 +136,37 @@ namespace hal EnableClockAdc(index); handle.Instance = peripheralAdc[index]; -#if !defined(STM32F3) && !defined(STM32WBA) - handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; - handle.Init.Resolution = ADC_RESOLUTION_12B; -#elif defined(STM32WBA) +#ifdef ADC_CLOCK_ASYNC_DIV4 handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; - handle.Init.Resolution = ADC_RESOLUTION_12B; +#else + handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; #endif + handle.Init.Resolution = ADC_RESOLUTION_12B; handle.Init.ScanConvMode = DISABLE; handle.Init.ContinuousConvMode = DISABLE; handle.Init.DiscontinuousConvMode = DISABLE; -#if !defined(STM32G0) && !defined(STM32WBA) +#if defined(ADC_CFGR_DISCNUM) || defined(ADC_CR1_DISCNUM) handle.Init.NbrOfDiscConversion = 0; #endif -#if !defined(STM32F3) handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; handle.Init.DMAContinuousRequests = DISABLE; -#endif handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; handle.Init.NbrOfConversion = 1; -#if defined(STM32WB) || defined(STM32G0) || defined(STM32G4) handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; +#ifdef ADC_OVR_DATA_OVERWRITTEN handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; +#endif +#ifdef IS_ADC_OVERSAMPLING_RATIO handle.Init.OversamplingMode = DISABLE; -#elif !defined(STM32F3) - handle.Init.EOCSelection = DISABLE; +#endif +#ifdef ADC_SMPR_SMP1 + handle.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_79CYCLES_5; #endif HAL_StatusTypeDef result = HAL_ADC_Init(&handle); assert(result == HAL_OK); -#if defined(STM32WB) +#ifdef IS_ADC_SINGLE_DIFFERENTIAL result = HAL_ADCEx_Calibration_Start(&handle, ADC_SINGLE_ENDED); assert(result == HAL_OK); #endif @@ -193,7 +198,7 @@ namespace hal void AdcStm::MeasurementDone() { assert(onDone != nullptr); -#if defined(STM32WB) || defined(STM32G4) || defined(STM32G0) || defined(STM32WBA) +#ifdef ADC_ISR_EOC handle.Instance->ISR |= ADC_ISR_EOC | ADC_ISR_EOS; #else handle.Instance->SR &= ~ADC_SR_EOC; diff --git a/hal_st/stm32fxxx/AnalogToDigitalPinStm.hpp b/hal_st/stm32fxxx/AnalogToDigitalPinStm.hpp index 7300c10a..fed84434 100644 --- a/hal_st/stm32fxxx/AnalogToDigitalPinStm.hpp +++ b/hal_st/stm32fxxx/AnalogToDigitalPinStm.hpp @@ -13,11 +13,9 @@ namespace hal { struct AdcStmChannelConfig { -#if defined(STM32F0) || defined(STM32F3) - uint32_t samplingTime{ ADC_SAMPLETIME_7CYCLES_5 }; -#elif defined(STM32WB) || defined(STM32G4) +#if defined(ADC_SAMPLETIME_2CYCLES_5) uint32_t samplingTime{ ADC_SAMPLETIME_2CYCLES_5 }; -#elif defined(STM32G0) || defined(STM32WBA) +#elif defined(ADC_SAMPLETIME_3CYCLES_5) uint32_t samplingTime{ ADC_SAMPLETIME_3CYCLES_5 }; #else uint32_t samplingTime{ ADC_SAMPLETIME_3CYCLES }; @@ -31,13 +29,16 @@ namespace hal : public AnalogToDigitalPinImplBase { public: - explicit AnalogToDigitalPinImplStm(hal::GpioPinStm& pin, AdcStm& adc); + using Config = detail::AdcStmChannelConfig; + + AnalogToDigitalPinImplStm(hal::GpioPinStm& pin, AdcStm& adc, const Config& config = Config()); void Measure(std::size_t numberOfSamples, const infra::Function)>& onDone) override; private: AnalogPinStm analogPin; AdcStm& adc; + Config config; }; class AnalogToDigitalInternalTemperatureStm @@ -46,7 +47,7 @@ namespace hal public: using Config = detail::AdcStmChannelConfig; - AnalogToDigitalInternalTemperatureStm(AdcStm& adc, const Config& config = Config()); + explicit AnalogToDigitalInternalTemperatureStm(AdcStm& adc, const Config& config = Config()); void Measure(std::size_t numberOfSamples, const infra::Function)>& onDone) override; diff --git a/hal_st/stm32fxxx/CMakeLists.txt b/hal_st/stm32fxxx/CMakeLists.txt index 85bc4ac2..ad81a2b6 100644 --- a/hal_st/stm32fxxx/CMakeLists.txt +++ b/hal_st/stm32fxxx/CMakeLists.txt @@ -15,8 +15,8 @@ target_link_libraries(hal_st.stm32fxxx PUBLIC ) target_sources(hal_st.stm32fxxx PRIVATE - $<$:AdcDmaStm.cpp> - $<$:AdcDmaStm.hpp> + $<$,$>:AdcDmaStm.cpp> + $<$,$>:AdcDmaStm.hpp> AnalogToDigitalPinStm.cpp AnalogToDigitalPinStm.hpp BackupRamStm.cpp @@ -123,7 +123,7 @@ if (TARGET_MCU_VENDOR STREQUAL st) elseif (TARGET_MCU_VARIANT STREQUAL stm32wb55rg) set(gpio_xml "${CMAKE_CURRENT_SOURCE_DIR}/ip/GPIO-STM32WB55x_gpio_v1_0_Modes.xml") set(mcu_xml "${CMAKE_CURRENT_SOURCE_DIR}/mcu/STM32WB55RGVx.xml") - elseif (TARGET_MCU_VARIANT STREQUAL stm32wba52cg) + elseif (TARGET_MCU STREQUAL stm32wba52) set(gpio_xml "${CMAKE_CURRENT_SOURCE_DIR}/ip/GPIO-STM32WBA52x_gpio_v1_0_Modes.xml") set(mcu_xml "${CMAKE_CURRENT_SOURCE_DIR}/mcu/STM32WBA52CGUx.xml") else() @@ -135,8 +135,16 @@ if (TARGET_MCU_VENDOR STREQUAL st) generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PinoutTableDefault.cpp GeneratePinoutTableCpp.xsl "${CMAKE_CURRENT_BINARY_DIR}/generated/stm32fxxx/PinoutTableDefaultStructure.xml") generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PinoutTableDefault.hpp GeneratePinoutTableHpp.xsl "${CMAKE_CURRENT_BINARY_DIR}/generated/stm32fxxx/PinoutTableDefaultStructure.xml") - generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PeripheralTableStructure.xml GeneratePeripheralTableStructure.xsl $,$>,PeripheralTableWbxx.xml,PeripheralTableFxxx.xml> + if (TARGET_MCU_FAMILY STREQUAL stm32wbxx) + generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PeripheralTableStructure.xml GeneratePeripheralTableStructure.xsl PeripheralTableWbxx.xml --stringparam mcu-document ${mcu_xml}) + elseif (TARGET_MCU_FAMILY STREQUAL stm32wbaxx) + generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PeripheralTableStructure.xml GeneratePeripheralTableStructure.xsl PeripheralTableWbaxx.xml + --stringparam mcu-document ${mcu_xml}) + else() + generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PeripheralTableStructure.xml GeneratePeripheralTableStructure.xsl PeripheralTableFxxx.xml + --stringparam mcu-document ${mcu_xml}) + endif() generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PeripheralTable.cpp GeneratePeripheralTableCpp.xsl "${CMAKE_CURRENT_BINARY_DIR}/generated/stm32fxxx/PeripheralTableStructure.xml") generate_xslt(hal_st.stm32fxxx generated/stm32fxxx/PeripheralTable.hpp GeneratePeripheralTableHpp.xsl "${CMAKE_CURRENT_BINARY_DIR}/generated/stm32fxxx/PeripheralTableStructure.xml") diff --git a/hal_st/stm32fxxx/PeripheralTableWbaxx.xml b/hal_st/stm32fxxx/PeripheralTableWbaxx.xml new file mode 100644 index 00000000..891161b8 --- /dev/null +++ b/hal_st/stm32fxxx/PeripheralTableWbaxx.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +