diff --git a/cpu/efm32/Kconfig b/cpu/efm32/Kconfig index 61af39c34d..cb2aac415f 100644 --- a/cpu/efm32/Kconfig +++ b/cpu/efm32/Kconfig @@ -30,6 +30,10 @@ config CPU_EFM32_SERIES1 bool select HAS_PERIPH_WDT_CB +config CPU_EFM32_SERIES2 + bool + select HAS_PERIPH_WDT_CB + ## Definition of specific features config HAS_ARCH_EFM32 bool diff --git a/cpu/efm32/Makefile.features b/cpu/efm32/Makefile.features index 4a70709277..4431b9425f 100644 --- a/cpu/efm32/Makefile.features +++ b/cpu/efm32/Makefile.features @@ -32,7 +32,7 @@ ifeq (1,$(EFM32_TRNG)) FEATURES_PROVIDED += periph_hwrng endif -ifeq (1,$(EFM32_SERIES)) +ifneq (,$(filter $(EFM32_SERIES),1 2)) FEATURES_PROVIDED += periph_wdt_cb endif diff --git a/cpu/efm32/include/periph_cpu.h b/cpu/efm32/include/periph_cpu.h index 3664d49f01..17dea58ac1 100644 --- a/cpu/efm32/include/periph_cpu.h +++ b/cpu/efm32/include/periph_cpu.h @@ -507,7 +507,7 @@ typedef struct { #define NWDT_TIME_LOWER_LIMIT ((1U << (3U + wdogPeriod_9)) + 1U) #define NWDT_TIME_UPPER_LIMIT ((1U << (3U + wdogPeriod_256k)) + 1U) -#ifdef _SILICON_LABS_32B_SERIES_1 +#if defined(_SILICON_LABS_32B_SERIES_1) || defined(_SILICON_LABS_32B_SERIES_2) #define WDT_TIME_LOWER_LIMIT NWDT_TIME_LOWER_LIMIT #define WDT_TIME_UPPER_LIMIT NWDT_TIME_UPPER_LIMIT #endif diff --git a/cpu/efm32/periph/Makefile b/cpu/efm32/periph/Makefile index 931d03a4cd..23860d3713 100644 --- a/cpu/efm32/periph/Makefile +++ b/cpu/efm32/periph/Makefile @@ -49,8 +49,8 @@ endif ifneq (,$(filter periph_wdt,$(USEMODULE))) ifeq (0,$(EFM32_SERIES)) SRC += wdt_series0.c - else ifeq (1,$(EFM32_SERIES)) - SRC += wdt_series1.c + else ifneq (,$(filter $(EFM32_SERIES),1 2)) + SRC += wdt_series12.c endif endif diff --git a/cpu/efm32/periph/wdt_series1.c b/cpu/efm32/periph/wdt_series12.c similarity index 83% rename from cpu/efm32/periph/wdt_series1.c rename to cpu/efm32/periph/wdt_series12.c index 6be0323672..a5610abc64 100644 --- a/cpu/efm32/periph/wdt_series1.c +++ b/cpu/efm32/periph/wdt_series12.c @@ -16,6 +16,7 @@ * EFM32 Series 1 MCUs * * @author Bas Stottelaar + * @author Juergen Fitschen * @} */ @@ -41,14 +42,23 @@ static wdt_cb_t wdt_cb; static void *wdt_arg; #endif +static inline uint32_t _get_clock(void) +{ +#if defined(_SILICON_LABS_32B_SERIES_0) || defined(_SILICON_LABS_32B_SERIES_1) + return WDT_CLOCK_HZ; +#else + return CMU_ClockFreqGet(cmuClock_WDOG0); +#endif +} + static uint32_t _get_calculated_time(WDOG_PeriodSel_TypeDef period) { - return ((1 << (3 + (int)period)) + 1) / WDT_CLOCK_HZ * MS_PER_SEC; + return ((1 << (3 + (int)period)) + 1) / _get_clock() * MS_PER_SEC; } static WDOG_PeriodSel_TypeDef _get_period(uint32_t max_time) { - const uint32_t cycles = (max_time * WDT_CLOCK_HZ) / MS_PER_SEC; + const uint32_t cycles = (max_time * _get_clock()) / MS_PER_SEC; DEBUG("[wdt_series1] _get_period: cycles=%" PRIu32 "\n", cycles); @@ -92,14 +102,25 @@ static void _init(uint32_t min_time, uint32_t max_time, bool warn) } /* initialize clock */ +#if defined(_SILICON_LABS_32B_SERIES_0) || defined(_SILICON_LABS_32B_SERIES_1) CMU_ClockEnable(cmuClock_HFLE, true); +#else + CMU_ClockSelectSet(cmuClock_WDOG0CLK, cmuSelect_ULFRCO); + CMU_ClockEnable(cmuClock_WDOG0, true); +#endif /* initialize watchdog */ WDOG_Init_TypeDef init = WDOG_INIT_DEFAULT; init.enable = false; +#if defined(_WDOG_CFG_EM1RUN_MASK) + init.em1Run = true; +#endif init.em2Run = true; + init.em3Run = true; +#if defined(_SILICON_LABS_32B_SERIES_0) || defined(_SILICON_LABS_32B_SERIES_1) init.clkSel = wdogClkSelULFRCO; +#endif init.perSel = _get_period(max_time); uint32_t calculated_time = _get_calculated_time(init.perSel);