diff options
Diffstat (limited to 'ports/stm32/timer.c')
| -rw-r--r-- | ports/stm32/timer.c | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/ports/stm32/timer.c b/ports/stm32/timer.c index 6c110f87e..b4fa1d6cf 100644 --- a/ports/stm32/timer.c +++ b/ports/stm32/timer.c @@ -233,6 +233,36 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // APB clock. Otherwise (APB prescaler > 1) the timer clock is twice its // respective APB clock. See DM00031020 Rev 4, page 115. uint32_t timer_get_source_freq(uint32_t tim_id) { + #if defined(STM32H5) + + uint32_t source, ppre; + if ((2 <= tim_id && tim_id <= 7) || (12 <= tim_id && tim_id <= 14)) { + // TIM{2-7,12-14} are on APB1 + source = HAL_RCC_GetPCLK1Freq(); + ppre = (RCC->CFGR2 >> RCC_CFGR2_PPRE1_Pos) & 7; + } else { + // TIM{1,8,15-17} are on APB2 + source = HAL_RCC_GetPCLK2Freq(); + ppre = (RCC->CFGR2 >> RCC_CFGR2_PPRE2_Pos) & 7; + } + if (RCC->CFGR1 & RCC_CFGR1_TIMPRE) { + if (ppre == 0 || ppre == 4 || ppre == 5) { + // PPREx divider is 1, 2 or 4. + return 2 * source; + } else { + return 4 * source; + } + } else { + if (ppre == 0 || ppre == 4) { + // PPREx divider is 1 or 2. + return HAL_RCC_GetHCLKFreq(); + } else { + return 2 * source; + } + } + + #else + uint32_t source, clk_div; if (tim_id == 1 || (8 <= tim_id && tim_id <= 11)) { // TIM{1,8,9,10,11} are on APB2 @@ -267,6 +297,8 @@ uint32_t timer_get_source_freq(uint32_t tim_id) { source *= 2; } return source; + + #endif } /******************************************************************************/ @@ -837,6 +869,8 @@ STATIC const uint32_t tim_instance_table[MICROPY_HW_MAX_TIMER] = { TIM_ENTRY(6, TIM6_IRQn), #elif defined(STM32G0) TIM_ENTRY(6, TIM6_DAC_LPTIM1_IRQn), + #elif defined(STM32H5) + TIM_ENTRY(6, TIM6_IRQn), #else TIM_ENTRY(6, TIM6_DAC_IRQn), #endif @@ -857,6 +891,7 @@ STATIC const uint32_t tim_instance_table[MICROPY_HW_MAX_TIMER] = { TIM_ENTRY(8, TIM8_UP_IRQn), #endif #endif + #if defined(TIM9) #if defined(STM32L1) TIM_ENTRY(9, TIM9_IRQn), @@ -864,6 +899,7 @@ STATIC const uint32_t tim_instance_table[MICROPY_HW_MAX_TIMER] = { TIM_ENTRY(9, TIM1_BRK_TIM9_IRQn), #endif #endif + #if defined(TIM10) #if defined(STM32L1) TIM_ENTRY(10, TIM10_IRQn), @@ -871,6 +907,7 @@ STATIC const uint32_t tim_instance_table[MICROPY_HW_MAX_TIMER] = { TIM_ENTRY(10, TIM1_UP_TIM10_IRQn), #endif #endif + #if defined(TIM11) #if defined(STM32L1) TIM_ENTRY(11, TIM11_IRQn), @@ -878,42 +915,57 @@ STATIC const uint32_t tim_instance_table[MICROPY_HW_MAX_TIMER] = { TIM_ENTRY(11, TIM1_TRG_COM_TIM11_IRQn), #endif #endif + #if defined(TIM12) + #if defined(STM32H5) + TIM_ENTRY(12, TIM12_IRQn), + #else TIM_ENTRY(12, TIM8_BRK_TIM12_IRQn), #endif + #endif + #if defined(TIM13) + #if defined(STM32H5) + TIM_ENTRY(13, TIM13_IRQn), + #else TIM_ENTRY(13, TIM8_UP_TIM13_IRQn), #endif - #if defined(STM32F0) || defined(STM32G0) + #endif + + #if defined(STM32F0) || defined(STM32G0) || defined(STM32H5) TIM_ENTRY(14, TIM14_IRQn), #elif defined(TIM14) TIM_ENTRY(14, TIM8_TRG_COM_TIM14_IRQn), #endif + #if defined(TIM15) - #if defined(STM32F0) || defined(STM32G0) || defined(STM32H7) + #if defined(STM32F0) || defined(STM32G0) || defined(STM32H5) || defined(STM32H7) TIM_ENTRY(15, TIM15_IRQn), #else TIM_ENTRY(15, TIM1_BRK_TIM15_IRQn), #endif #endif + #if defined(TIM16) #if defined(STM32G0B1xx) || defined(STM32G0C1xx) TIM_ENTRY(16, TIM16_FDCAN_IT0_IRQn), - #elif defined(STM32F0) || defined(STM32G0) || defined(STM32H7) || defined(STM32WL) + #elif defined(STM32F0) || defined(STM32G0) || defined(STM32H5) || defined(STM32H7) || defined(STM32WL) TIM_ENTRY(16, TIM16_IRQn), #else TIM_ENTRY(16, TIM1_UP_TIM16_IRQn), #endif #endif + #if defined(TIM17) #if defined(STM32G0B1xx) || defined(STM32G0C1xx) TIM_ENTRY(17, TIM17_FDCAN_IT1_IRQn), - #elif defined(STM32F0) || defined(STM32G0) || defined(STM32H7) || defined(STM32WL) + #elif defined(STM32F0) || defined(STM32G0) || defined(STM32H5) || defined(STM32H7) || defined(STM32WL) TIM_ENTRY(17, TIM17_IRQn), #else TIM_ENTRY(17, TIM1_TRG_COM_TIM17_IRQn), #endif #endif + #if defined(TIM20) TIM_ENTRY(20, TIM20_UP_IRQn), #endif |
