PER Firmware
Loading...
Searching...
No Matches
rcc_priv.h
Go to the documentation of this file.
1
7#ifndef __PHAL_G4_RCC_PRIV_H__
8#define __PHAL_G4_RCC_PRIV_H__
9
10#include <stdint.h>
11
12#include "stm32g474xx.h"
14
15
16// This board's external oscillator input
17// HSI16 (High Speed Internal, 16 MHz) is fixed by hardware
18// HSE (High Speed External) depends on PCB/what is connected wired to the OSC_IN pin
19// and PER only uses 16 MHZ HSE fed bypass style
20static constexpr uint32_t RCC_PRIV_HSI_CLOCK_RATE_HZ = 16'000'000U;
21static constexpr uint32_t RCC_PRIV_HSE_CLOCK_RATE_HZ = 16'000'000U;
22
23// 170 MHz PLL
24// VCO input = HSI16 or HSE / PLLM (must be 2.66-16 MHz)
25// VCO output = VCO input * PLLN (must be 96-344 MHz)
26// PLL output = VCO output / PLLR (-> SYSCLK)
27static constexpr uint32_t RCC_PRIV_PLL_M = 4U;
28static constexpr uint32_t RCC_PRIV_PLL_N = 85U;
29static constexpr uint32_t RCC_PRIV_PLL_R = 2U;
30
34
35// Compile time check that chosen M/N/R choice is legal and results in a perfect 170 MHZ
36static_assert(RCC_PRIV_HSI_CLOCK_RATE_HZ == RCC_PRIV_HSE_CLOCK_RATE_HZ, "PLL config assumes HSI and HSE");
37static_assert(RCC_PRIV_PLL_VCO_INPUT_HZ >= 2'660'000U && RCC_PRIV_PLL_VCO_INPUT_HZ <= 16'000'000U, "PLL VCO input out of valid range");
38static_assert(RCC_PRIV_PLL_VCO_OUTPUT_HZ >= 96'000'000U && RCC_PRIV_PLL_VCO_OUTPUT_HZ <= 344'000'000U, "PLL VCO output out of valid range");
39static_assert(RCC_PRIV_PLL_OUTPUT_HZ == 170'000'000U, "PLL output must be exactly 170 MHz");
40
42typedef enum : uint32_t {
43 RCC_PRIV_PLL_SRC_HSI = RCC_PLLCFGR_PLLSRC_HSI,
44 RCC_PRIV_PLL_SRC_HSE = RCC_PLLCFGR_PLLSRC_HSE,
46
49
52
56
60void PHAL_RCC_priv_setFlashLatency(uint32_t latency_ws);
61
65
69
72
75
78
81
82#endif // __PHAL_G4_RCC_PRIV_H__
G4 RCC public API implementation.
RCC_PRIV_PLLSource_t
Oscillator source for RCC->PLLCFGR. Either HSI or HSE.
Definition rcc_priv.h:42
@ RCC_PRIV_PLL_SRC_HSI
Definition rcc_priv.h:43
@ RCC_PRIV_PLL_SRC_HSE
Definition rcc_priv.h:44
void PHAL_RCC_priv_switchSysclkToHSE(void)
Switch SYSCLK to HSE and block until the switch is confirmed.
Definition rcc_priv.c:159
void PHAL_RCC_priv_enableHSI(void)
Enable HSI16 and block until it's ready.
Definition rcc_priv.c:9
void PHAL_RCC_priv_enableHSE(void)
Definition rcc_priv.c:37
void PHAL_RCC_priv_configurePLL(RCC_PRIV_PLLSource_t src)
Definition rcc_priv.c:71
void PHAL_RCC_priv_setFlashLatency(uint32_t latency_ws)
Definition rcc_priv.c:52
static constexpr uint32_t RCC_PRIV_HSI_CLOCK_RATE_HZ
Definition rcc_priv.h:20
static constexpr uint32_t RCC_PRIV_PLL_N
Definition rcc_priv.h:28
static constexpr uint32_t RCC_PRIV_PLL_R
Definition rcc_priv.h:29
void PHAL_RCC_priv_switchSysclkToPLL(void)
Switch SYSCLK to the PLL and block until the switch is confirmed.
Definition rcc_priv.c:170
void PHAL_RCC_priv_switchSysclkToHSI(void)
Switch SYSCLK to HSI16 and block until the switch is confirmed.
Definition rcc_priv.c:146
static constexpr uint32_t RCC_PRIV_PLL_M
Definition rcc_priv.h:27
static constexpr uint32_t RCC_PRIV_PLL_VCO_OUTPUT_HZ
Definition rcc_priv.h:32
static constexpr uint32_t RCC_PRIV_HSE_CLOCK_RATE_HZ
Definition rcc_priv.h:21
void PHAL_RCC_priv_setBusPrescalersToDiv1(void)
Set the AHB, APB1, and APB2 prescalers to divide-by-1 (undivided)
Definition rcc_priv.c:181
static constexpr uint32_t RCC_PRIV_PLL_VCO_INPUT_HZ
Definition rcc_priv.h:31
void PHAL_RCC_priv_enableBoostMode(void)
Definition rcc_priv.c:119
static constexpr uint32_t RCC_PRIV_PLL_OUTPUT_HZ
Definition rcc_priv.h:33
void PHAL_RCC_priv_disableHSI(void)
Disable HSI16 and block until it's off.
Definition rcc_priv.c:23