From e2b3a62a8e8208d1d02e910ed5f1fbb057d8268c Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Tue, 12 Aug 2025 19:05:50 +0200 Subject: [PATCH] STM32H7: rcc: added rcc_getPeriphClock function --- platform/mcu/STM32H7xx/drivers/rcc.h | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/platform/mcu/STM32H7xx/drivers/rcc.h b/platform/mcu/STM32H7xx/drivers/rcc.h index 7b8eed91..45a427a0 100644 --- a/platform/mcu/STM32H7xx/drivers/rcc.h +++ b/platform/mcu/STM32H7xx/drivers/rcc.h @@ -43,7 +43,8 @@ enum PeriphBus PERIPH_BUS_AHB = 0, PERIPH_BUS_APB1 = 1, PERIPH_BUS_APB2 = 2, - PERIPH_BUS_APB4 = 3, + PERIPH_BUS_APB3 = 3, + PERIPH_BUS_APB4 = 4, PERIPH_BUS_NUM }; @@ -63,6 +64,45 @@ uint32_t getBusClock(const uint8_t bus); #ifdef __cplusplus } + +/** + * Get the clock frequency of the bus a peripheral is attached to. + * + * @param periph: peripheral base address + * @return bus clock frequency in Hz or zero in case of errors. + */ +static constexpr uint32_t rcc_getPeriphClock(const void *periph) +{ + uint32_t addr = reinterpret_cast(periph); + + switch(addr & 0xFFFF0000) { + case APB1PERIPH_BASE: + return getBusClock(PERIPH_BUS_APB1); + break; + + case APB2PERIPH_BASE: + return getBusClock(PERIPH_BUS_APB2); + break; + + case D1_APB1PERIPH_BASE: + return getBusClock(PERIPH_BUS_APB3); + break; + + case D3_APB1PERIPH_BASE: + return getBusClock(PERIPH_BUS_APB4); + break; + + case AHB1PERIPH_BASE: + case AHB2PERIPH_BASE: + case D1_AHB1PERIPH_BASE: + case D3_AHB1PERIPH_BASE: + return getBusClock(PERIPH_BUS_AHB); + break; + } + + return 0; +} + #endif #endif //RCC_H