From b41c1c46cb736951965a7293d5f94ef04171e18b Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sun, 8 Dec 2024 14:03:15 +0100 Subject: [PATCH] feat: implement clocks enabling --- include/clocks.h | 10 ++++++++++ src/clocks.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/include/clocks.h b/include/clocks.h index 4e56c5c..9b8a700 100644 --- a/include/clocks.h +++ b/include/clocks.h @@ -1,4 +1,5 @@ #include +#include #ifndef CLOCKS_H #define CLOCKS_H @@ -23,6 +24,15 @@ typedef enum { PLL_SOURCE_NONE = 3, } pll_source_t; +typedef enum { + CLOCK_HSI, + CLOCK_HSE, + CLOCK_HSI48, +} clock_t; + +void clocks_enable(clock_t clock); +bool clocks_ready(clock_t clock); +void clocks_wait_ready(clock_t clock); void clocks_pll_configure(clock_pll_t pll, uint8_t divm, pll_source_t source, uint16_t divn, uint8_t divp, uint8_t divq, diff --git a/src/clocks.c b/src/clocks.c index 44fe526..6dfa576 100644 --- a/src/clocks.c +++ b/src/clocks.c @@ -2,6 +2,44 @@ #include "registers.h" #include +void clocks_enable(clock_t clock) { + uint32_t mask = 0; + switch (clock) { + case CLOCK_HSI: + mask = RCC_CR_HSION_Msk; + break; + case CLOCK_HSE: + mask = RCC_CR_HSEON_Msk; + break; + case CLOCK_HSI48: + mask = RCC_CR_HSI48ON_Msk; + break; + } + + RCC->CR |= mask; +} + +bool clocks_ready(clock_t clock) { + uint32_t mask = 0; + switch (clock) { + case CLOCK_HSI: + mask = RCC_CR_HSIRDY_Msk; + break; + case CLOCK_HSE: + mask = RCC_CR_HSERDY_Msk; + break; + case CLOCK_HSI48: + mask = RCC_CR_HSI48RDY_Msk; + break; + } + + return (RCC->CR & mask) != 0; +} + +void clocks_wait_ready(clock_t clock) { + while (!clocks_ready(clock)); +} + void clocks_pll_configure(clock_pll_t pll, uint8_t divm, pll_source_t source, uint16_t divn, uint8_t divp, uint8_t divq, uint8_t divr) { -- 2.48.1