@ -27,46 +27,38 @@ LGPL License Terms @ref lgpl_license
# ifndef LIBOPENCM3_RCC_H
# define LIBOPENCM3_RCC_H
# include <libopencm3/cm3/common.h>
# include <libopencm3/stm32/h7/pwr.h>
/**@{*/
/* --- RCC registers ------------------------------------------------------- */
/** @defgroup rcc_regisers RCC Registers
* @ ingroup rcc_defines
@ { */
# define RCC_CR MMIO32(RCC_BASE + 0x000)
# define RCC_ICSCR MMIO32(RCC_BASE + 0x004) /* Y-devices only */
# define RCC_HSICFGR MMIO32(RCC_BASE + 0x004) /* V-devices only */
# define RCC_CRRCR MMIO32(RCC_BASE + 0x008)
# define RCC_CSICFGR MMIO32(RCC_BASE + 0x00C) /* V-devices only */
# define RCC_CFGR MMIO32(RCC_BASE + 0x010)
/** @addtogroup rcc_cr_values RCC_CR_VALUES
* @ ingroup rcc_registers
@ { */
# define RCC_CR_PLL3AIRDY (1 << 29)
# define RCC_CR_PLL3AION (1 << 28)
# define RCC_CR_PLL2RDY (1 << 27)
# define RCC_CR_PLL2ON (1 << 26)
# define RCC_CR_PLL1RDY (1 << 25)
# define RCC_CR_PLL1ON (1 << 24)
# define RCC_CR_HSECSSON (1 << 19)
# define RCC_CR_HSEBYP (1 << 18)
# define RCC_CR_HSERDY (1 << 17)
# define RCC_CR_HSEON (1 << 16)
# define RCC_CR_D2CKRDY (1 << 15)
# define RCC_CR_D1CKRDY (1 << 14)
# define RCC_CR_HSI48RDY (1 << 13)
# define RCC_CR_HSI48ON (1 << 12)
# define RCC_CR_CSIKERON (1 << 9)
# define RCC_CR_CSIRDY (1 << 8)
# define RCC_CR_CSION (1 << 7)
# define RCC_CR_HSIDIVF (1 << 5)
# define RCC_CR_HSIDIV_MASK (0x03)
# define RCC_CR_HSIDIV_SHIFT 3
# define RCC_CR_HSIDIV(n) (((n) & RCC_CR_HSIDIV_MASK) << RCC_CR_HSIDIV_MASK)
# define RCC_CR_HSIRDY (1 << 2)
# define RCC_CR_HSIKERON (1 << 1)
# define RCC_CR_HSION (1 << 0)
/**@}*/
/** @addtogroup rcc_rstr_values RCC_RSTR_VALUES
* @ ingroup rcc_registers
@ { */
# define RCC_D1CFGR MMIO32(RCC_BASE + 0x018)
# define RCC_D2CFGR MMIO32(RCC_BASE + 0x01C)
# define RCC_D3CFGR MMIO32(RCC_BASE + 0x020)
# define RCC_PLLCKSELR MMIO32(RCC_BASE + 0x028)
# define RCC_PLLCFGR MMIO32(RCC_BASE + 0x02C)
/* PLLs are 1-based, so reference macros to 1..3, using index 0 will give undefined behavior. */
# define RCC_PLLDIVR(n) MMIO32(RCC_BASE + 0x030 + (0x08 * ((n) - 1)))
# define RCC_PLLFRACR(n) MMIO32(RCC_BASE + 0x030 + (0x08 * ((n) - 1)))
# define RCC_PLL1DIVR RCC_PLLDIVR(1)
# define RCC_PLL1FRACR RCC_PLLFRACR(1)
# define RCC_PLL2DIVR RCC_PLLDIVR(2)
# define RCC_PLL2FRACR RCC_PLLFRACR(2)
# define RCC_PLL3DIVR RCC_PLLDIVR(3)
# define RCC_PLL3FRACR RCC_PLLFRACR(3)
# define RCC_D1CCIPR MMIO32(RCC_BASE + 0x04C)
# define RCC_D2CCIP1R MMIO32(RCC_BASE + 0x050)
# define RCC_D2CCIP2R MMIO32(RCC_BASE + 0x054)
# define RCC_D3CCIPR MMIO32(RCC_BASE + 0x058)
# define RCC_AHB1RSTR MMIO32(RCC_BASE + 0x080)
# define RCC_AHB2RSTR MMIO32(RCC_BASE + 0x084)
# define RCC_AHB3RSTR MMIO32(RCC_BASE + 0x07C)
@ -102,7 +94,37 @@ LGPL License Terms @ref lgpl_license
# define RCC_DCKCFGR2 MMIO32(RCC_BASE + 0x90)
/**@}*/
/** @addtogroup rcc_cfgr_values RCC_CFGR_VALUES
/** @defgroup rcc_cr_values RCC_CR Values
* @ ingroup rcc_registers
@ { */
# define RCC_CR_PLL3RDY BIT29
# define RCC_CR_PLL3ON BIT28
# define RCC_CR_PLL2RDY BIT27
# define RCC_CR_PLL2ON BIT26
# define RCC_CR_PLL1RDY BIT25
# define RCC_CR_PLL1ON BIT24
# define RCC_CR_HSECSSON BIT19
# define RCC_CR_HSEBYP BIT18
# define RCC_CR_HSERDY BIT17
# define RCC_CR_HSEON BIT16
# define RCC_CR_D2CKRDY BIT15
# define RCC_CR_D1CKRDY BIT14
# define RCC_CR_HSI48RDY BIT13
# define RCC_CR_HSI48ON BIT12
# define RCC_CR_CSIKERON BIT9
# define RCC_CR_CSIRDY BIT8
# define RCC_CR_CSION BIT7
# define RCC_CR_HSIDIVF BIT5
# define RCC_CR_HSIDIV_MASK (0x03)
# define RCC_CR_HSIDIV_SHIFT 3
# define RCC_CR_HSIDIV(n) (((n) & RCC_CR_HSIDIV_MASK) << RCC_CR_HSIDIV_MASK)
# define RCC_CR_HSIRDY BIT2
# define RCC_CR_HSIKERON BIT1
# define RCC_CR_HSION BIT0
/**@}*/
/** @defgroup rcc_cfgr_values RCC_CFGR Values
* @ ingroup rcc_registers
@ { */
/* MCO2: Microcontroller clock output 2 */
@ -158,8 +180,134 @@ LGPL License Terms @ref lgpl_license
# define RCC_CFGR_SW_PLL1 0x3
/**@}*/
/** @defgroup rcc_d1cfgr_values RCC_D1CFGR Values
* @ ingroup rcc_registers
* @ { */
# define RCC_D1CFGR_D1CPRE_BYP 0x0
# define RCC_D1CFGR_D1CPRE_DIV2 0x8
# define RCC_D1CFGR_D1CPRE_DIV4 0x9
# define RCC_D1CFGR_D1CPRE_DIV8 0xA
# define RCC_D1CFGR_D1CPRE_DIV16 0xB
# define RCC_D1CFGR_D1CPRE_DIV64 0xC
# define RCC_D1CFGR_D1CPRE_DIV128 0xD
# define RCC_D1CFGR_D1CPRE_DIV256 0xE
# define RCC_D1CFGR_D1CPRE_DIV512 0xF
# define RCC_D1CFGR_D1PPRE_BYP 0x0
# define RCC_D1CFGR_D1PPRE_DIV2 0x4
# define RCC_D1CFGR_D1PPRE_DIV4 0x5
# define RCC_D1CFGR_D1PPRE_DIV8 0x6
# define RCC_D1CFGR_D1PPRE_DIV16 0x7
# define RCC_D1CFGR_D1HPRE_BYP 0x0
# define RCC_D1CFGR_D1HPRE_DIV2 0x8
# define RCC_D1CFGR_D1HPRE_DIV4 0x9
# define RCC_D1CFGR_D1HPRE_DIV8 0xA
# define RCC_D1CFGR_D1HPRE_DIV16 0xB
# define RCC_D1CFGR_D1HPRE_DIV64 0xC
# define RCC_D1CFGR_D1HPRE_DIV128 0xD
# define RCC_D1CFGR_D1HPRE_DIV256 0xE
# define RCC_D1CFGR_D1HPRE_DIV512 0xF
# define RCC_D1CFGR_D1CPRE_SHIFT 8
# define RCC_D1CFGR_D1PPRE_SHIFT 4
# define RCC_D1CFGR_D1CPRE(cpre) (cpre << RCC_D1CFGR_D1CPRE_SHIFT)
# define RCC_D1CFGR_D1PPRE(ppre) (ppre << RCC_D1CFGR_D1PPRE_SHIFT)
# define RCC_D1CFGR_D1HPRE(hpre) (hpre)
/**@}*/
/** @defgroup rcc_d2cfgr_values RCC_D2CFGR Values
* @ ingroup rcc_registers
* @ { */
# define RCC_D2CFGR_D2PPRE_BYP 0x0
# define RCC_D2CFGR_D2PPRE_DIV2 0x4
# define RCC_D2CFGR_D2PPRE_DIV4 0x5
# define RCC_D2CFGR_D2PPRE_DIV8 0x6
# define RCC_D2CFGR_D2PPRE_DIV16 0x7
# define RCC_D2CFGR_D2PPRE2_SHIFT 8
# define RCC_D2CFGR_D2PPRE1_SHIFT 4
# define RCC_D2CFGR_D2PPRE2(ppre) (ppre << RCC_D2CFGR_D2PPRE2_SHIFT)
# define RCC_D2CFGR_D2PPRE1(ppre) (ppre << RCC_D2CFGR_D2PPRE1_SHIFT)
/**@}*/
/** @defgroup rcc_d3cfgr_values RCC_D3CFGR Values
* @ ingroup rcc_registers
* @ { */
# define RCC_D3CFGR_D3PPRE_BYP 0x0
# define RCC_D3CFGR_D3PPRE_DIV2 0x4
# define RCC_D3CFGR_D3PPRE_DIV4 0x5
# define RCC_D3CFGR_D3PPRE_DIV8 0x6
# define RCC_D3CFGR_D3PPRE_DIV16 0x7
# define RCC_D3CFGR_D3PPRE_SHIFT 4
# define RCC_D3CFGR_D3PPRE(ppre) (ppre << RCC_D3CFGR_D3PPRE_SHIFT)
/**@}*/
/** @defgroup rcc_pllckselr_values RCC_PLLCKSELR Values
* @ ingroup rcc_registers
* @ { */
# define RCC_PLLCKSELR_PLLSRC_HSI 0x0
# define RCC_PLLCKSELR_PLLSRC_CSI 0x1
# define RCC_PLLCKSELR_PLLSRC_HSE 0x2
# define RCC_PLLCKSELR_PLLSRC_NONE 0x3
# define RCC_PLLCKSELR_DIVM_DIS 0
# define RCC_PLLCKSELR_DIVM_BYP 1
# define RCC_PLLCKSELR_DIVM_MASK 0x3f
# define RCC_PLLCKSELR_DIVM3_SHIFT 20
# define RCC_PLLCKSELR_DIVM2_SHIFT 12
# define RCC_PLLCKSELR_DIVM1_SHIFT 4
# define RCC_PLLCKSELR_DIVM3(n) ((n) << RCC_PLLCKSELR_DIVM3_SHIFT)
# define RCC_PLLCKSELR_DIVM2(n) ((n) << RCC_PLLCKSELR_DIVM2_SHIFT)
# define RCC_PLLCKSELR_DIVM1(n) ((n) << RCC_PLLCKSELR_DIVM1_SHIFT)
/**@}*/
/** @defgroup rcc_pllcfgr_values RCC_PLLCFGR Values
* @ ingroup rcc_registers
* @ { */
# define RCC_PLLCFGR_PLLRGE_1_2MHZ 0
# define RCC_PLLCFGR_PLLRGE_2_4MHZ 1
# define RCC_PLLCFGR_PLLRGE_4_8MHZ 2
# define RCC_PLLCFGR_PLLRGE_8_16MHZ 3
# define RCC_PLLCFGR_DIVR3EN BIT24
# define RCC_PLLCFGR_DIVQ3EN BIT23
# define RCC_PLLCFGR_DIVP3EN BIT22
# define RCC_PLLCFGR_DIVR2EN BIT21
# define RCC_PLLCFGR_DIVQ2EN BIT20
# define RCC_PLLCFGR_DIVP2EN BIT19
# define RCC_PLLCFGR_DIVR1EN BIT18
# define RCC_PLLCFGR_DIVQ1EN BIT17
# define RCC_PLLCFGR_DIVP1EN BIT16
# define RCC_PLLCFGR_PLL3RGE_SHIFT 10
# define RCC_PLLCFGR_PLL3VCO_WIDE 0 /* 192 - 836MHz base output. */
# define RCC_PLLCFGR_PLL3VCO_MED BIT9 /* 150 - 420MHz base output. */
# define RCC_PLLCFGR_PLL3FRACEN BIT8
# define RCC_PLLCFGR_PLL2RGE_SHIFT 6
# define RCC_PLLCFGR_PLL2VCO_WIDE 0 /* 192 - 836MHz base output. */
# define RCC_PLLCFGR_PLL2VCO_MED BIT5 /* 150 - 420MHz base output. */
# define RCC_PLLCFGR_PLL2FRACEN BIT4
# define RCC_PLLCFGR_PLL1RGE_SHIFT 2
# define RCC_PLLCFGR_PLL1VCO_WIDE 0 /* 192 - 836MHz base output. */
# define RCC_PLLCFGR_PLL1VCO_MED BIT1 /* 150 - 420MHz base output. */
# define RCC_PLLCFGR_PLL1FRACEN BIT0
/**@}*/
/** @defgroup rcc_plldivr_values RCC_PLLnDIVR Values
* @ ingroup rcc_registers
* @ { */
# define RCC_PLLNDIVR_DIVR_SHIFT 24
# define RCC_PLLNDIVR_DIVQ_SHIFT 16
# define RCC_PLLNDIVR_DIVP_SHIFT 9
# define RCC_PLLNDIVR_DIVN_SHIFT 0
/* Need to preserve reserved bits, so give easy mask shortcut. */
# define RCC_PLLNDIVR_DIVR(n) (((n) - 1) << RCC_PLLNDIVR_DIVR_SHIFT)
# define RCC_PLLNDIVR_DIVQ(n) (((n) - 1) << RCC_PLLNDIVR_DIVQ_SHIFT)
# define RCC_PLLNDIVR_DIVP(n) (((n) - 1) << RCC_PLLNDIVR_DIVP_SHIFT)
# define RCC_PLLNDIVR_DIVN(n) (((n) - 1) << RCC_PLLNDIVR_DIVN_SHIFT)
/**@}*/
/** @addtogroup rcc_bdcr_values RCC_BDCR_VALUES
/** @defgroup rcc_bdcr_values RCC_BDCR Values
* @ ingroup rcc_registers
@ { */
# define RCC_BDCR_BDRST (1 << 16)
@ -181,16 +329,107 @@ LGPL License Terms @ref lgpl_license
# define RCC_BDCR_LSEON (1 << 0)
/**@}*/
/** @addtogroup rcc_bdcr_values RCC_CSR_VALUES
/** @defgroup rcc_bdcr_values RCC_CSR Values.
* @ ingroup rcc_registers
@ { */
# define RCC_CSR_LSIRDY (1 << 1)
# define RCC_CSR_LSION (1 << 0)
/**@}*/
extern uint32_t rcc_ahb_frequency ;
extern uint32_t rcc_apb1_frequency ;
extern uint32_t rcc_apb2_frequency ;
/** @defgroup rcc_d1ccipr_values RCC_D1CCIP1R Values
* @ ingroup rcc_registers
* @ { */
# define RCC_D1CCIPR_CKPERSEL_SHIFT 28
# define RCC_D1CCIPR_CKPERSEL_HSI 0
# define RCC_D1CCIPR_CKPERSEL_CSI 1
# define RCC_D1CCIPR_CKPERSEL_HSE 2
# define RCC_D1CCIPR_CKPERSEL_DISABLE 3
# define RCC_D1CCIPR_CKPERSEL_MASK 3
/**@}*/
/** @defgroup rcc_d2ccip1r_values RCC_D2CCIP1R Values
* @ ingroup rcc_registers
* @ { */
# define RCC_D2CCIP1R_SWPSEL_SHIFT 31
# define RCC_D2CCIP1R_FDCANSEL_SHIFT 28
# define RCC_D2CCIP1R_DFSDM1SEL_SHIFT 24
# define RCC_D2CCIP1R_SPDIFSEL_SHIFT 20
# define RCC_D2CCIP1R_SPI45SEL_SHIFT 16
# define RCC_D2CCIP1R_SPI123SEL_SHIFT 12
# define RCC_D2CCIP1R_SAI23SEL_SHIFT 6
# define RCC_D2CCIP1R_SWPSEL_PCLK 0x0
# define RCC_D2CCIP1R_SWPSEL_HSI 0x1
# define RCC_D2CCIP1R_FDCANSEL_HSE 0x0
# define RCC_D2CCIP1R_FDCANSEL_PLL1Q 0x1
# define RCC_D2CCIP1R_FDCANSEL_PLL2Q 0x2
# define RCC_D2CCIP1R_FDCANSEL_MASK 0x3
# define RCC_D2CCIP1R_DFSDM1SEL_PCLK2 0x0
# define RCC_D2CCIP1R_DFSDM1SEL_SYSCLK 0x1
# define RCC_D2CCIP1R_SPDIFSEL_PLL1Q 0x0
# define RCC_D2CCIP1R_SPDIFSEL_PLL2R 0x1
# define RCC_D2CCIP1R_SPDIFSEL_PLL3R 0x2
# define RCC_D2CCIP1R_SPDIFSEL_HSI 0x3
# define RCC_D2CCIP1R_SPI45SEL_APB4 0x0
# define RCC_D2CCIP1R_SPI45SEL_PLL2Q 0x1
# define RCC_D2CCIP1R_SPI45SEL_PLL3Q 0x2
# define RCC_D2CCIP1R_SPI45SEL_HSI 0x3
# define RCC_D2CCIP1R_SPI45SEL_CSI 0x4
# define RCC_D2CCIP1R_SPI45SEL_HSE 0x5
# define RCC_D2CCIP1R_SPI45SEL_MASK 0x7
# define RCC_D2CCIP1R_SPI123SEL_PLL1Q 0x0
# define RCC_D2CCIP1R_SPI123SEL_PLL2P 0x1
# define RCC_D2CCIP1R_SPI123SEL_PLL3P 0x2
# define RCC_D2CCIP1R_SPI123SEL_I2SCKIN 0x3
# define RCC_D2CCIP1R_SPI123SEL_PERCK 0x4
# define RCC_D2CCIP1R_SPI123SEL_MASK 0x7
# define RCC_D2CCIP1R_SAISEL_PLL1Q 0x0
# define RCC_D2CCIP1R_SAISEL_PLL2P 0x1
# define RCC_D2CCIP1R_SAISEL_PLL3P 0x2
# define RCC_D2CCIP1R_SAISEL_I2SCKIN 0x3
# define RCC_D2CCIP1R_SAISEL_PERCK 0x4
# define RCC_D2CCIP1R_SAISEL_MASK 0x7
/**@}*/
/** @defgroup rcc_d2ccip2r_values RCC_D2CCIP2R Values
* @ ingroup rcc_registers
* @ { */
# define RCC_D2CCIP2R_LPTIM1SEL_SHIFT 28
# define RCC_D2CCIP2R_CECSEL_SHIFT 22
# define RCC_D2CCIP2R_USBSEL_SHIFT 20
# define RCC_D2CCIP2R_I2C123SEL_SHIFT 12
# define RCC_D2CCIP2R_RNGSEL_SHIFT 8
# define RCC_D2CCIP2R_USART16SEL_SHIFT 3
# define RCC_D2CCIP2R_USART234578SEL_SHIFT 0
# define RCC_D2CCIP2R_USART16SEL_PCLK2 0
# define RCC_D2CCIP2R_USART234578SEL_PCLK1 0
# define RCC_D2CCIP2R_USARTSEL_PLL2Q 1
# define RCC_D2CCIP2R_USARTSEL_PLL3Q 2
# define RCC_D2CCIP2R_USARTSEL_HSI 3
# define RCC_D2CCIP2R_USARTSEL_CSI 4
# define RCC_D2CCIP2R_USARTSEL_LSE 5
# define RCC_D2CCIP2R_USARTSEL_MASK 7
/**@}*/
# define RCC_HSI_BASE_FREQUENCY 64000000UL
/** Enumerations for clocks in the clock tree to allow user to get the current configuration of the
* clocks from the RCC module . These clock sources will each be tracked through the settings .
*/
enum rcc_clock_source {
RCC_CPUCLK ,
RCC_SYSCLK ,
RCC_PERCLK ,
RCC_SYSTICKCLK ,
RCC_HCLK3 ,
RCC_AHBCLK , /* AHB1,2,4 all share base HCLK. */
RCC_APB1CLK , /* Note: APB1 and PCLK1 in manual */
RCC_APB2CLK , /* Note: APB2 and PCLK2 in manual */
RCC_APB3CLK , /* Note: APB3 and PCLK3 in manual */
RCC_APB4CLK , /* Note: APB4 and PCLK4 in manual */
} ;
enum rcc_osc {
RCC_PLL ,
@ -200,6 +439,37 @@ enum rcc_osc {
RCC_LSI
} ;
enum rcc_sysclk_mux {
RCC_SYSCLK_PLL ,
RCC_SYSCLK_HSE ,
RCC_SYSCLK_HSI ,
} ;
enum rcc_pll_mux {
RCC_PLL_HSI = RCC_PLLCKSELR_PLLSRC_HSI ,
RCC_PLL_HSE = RCC_PLLCKSELR_PLLSRC_HSE
} ;
/** PLL Configuration structure. */
struct rcc_pll_config {
uint32_t hse_frequency ; /**< User configured external crystal frequency. */
enum rcc_sysclk_mux sysclk_mux ; /**< SYSCLK source input selection. */
enum rcc_pll_mux pll_mux ; /**< PLL source input selection. */
struct pll_config {
uint8_t divm ; /**< Pre-divider value for each PLL. 0-64 integers. */
uint16_t divn ; /**< Multiplier, 0-512 integer. */
uint8_t divp ; /**< Post divider for PLLP clock. */
uint8_t divq ; /**< Post divider for PLLQ clock. */
uint8_t divr ; /**< Post divider for PLLR clock. */
} pll1 , pll2 , pll3 ; /**< PLL1-PLL3 configurations. */
uint32_t d1cfg_core_prescale ; /**< Core prescaler for domain 1. */
uint32_t d1cfg_hclk3_prescale ; /**< HCLK3 prescaler for domain 1. */
uint32_t d1cfg_pclk3_prescale ; /**< APB3 Peripheral prescaler for domain 1. */
uint32_t d2cfg_pclk1_prescale ; /**< APB1 Peripheral prescaler for domain 2. */
uint32_t d2cfg_pclk2_prescale ; /**< APB2 Peripheral prescaler for domain 2. */
uint32_t d3cfg_pclk4_prescale ; /**< APB4 Peripheral prescaler for domain 3. */
} ;
# define _REG_BIT(base, bit) (((base) << 5) + (bit))
enum rcc_periph_clken {
@ -429,9 +699,82 @@ enum rcc_periph_rst {
} ;
# undef _REG_BIT
/**@}*/
/** @defgroup rcc_file RCC peripheral API
*
* @ ingroup peripheral_apis
*/
# include <libopencm3/stm32/common/rcc_common_all.h>
BEGIN_DECLS
/**
* Setup the base PLLs and clock domains for the STM32H7 . This function will
* utilize the users input parameters to configure all 3 PLLs , as well as the
* core clock domains ( namely SYSCLK , CPU , HCLK , AHB , PCLK1 - 4 ) with the
* specified dividers . Given the dividers , the RCC module will track the
* the configured frequency for each of these clock domains .
*
* Note : If clock sources , configs , divider , etc . are modified outside of
* this module , the frequency tracking may be undefined .
* Note : Clock tree is fairly complex , see RM0433 Section 7
* for details .
* @ param [ in ] config Input config structure defining desired setup .
*/
void rcc_clock_setup_pll ( const struct rcc_pll_config * config ) ;
/**
* Get the clock rate ( in hz ) of the specified clock source . There are
* numerous clock sources and configurations on the H7 , so rates for each
* configured peripheral clock are aimed to be discoverd / calculated by this
* module such that the user does not need to know how the MCU is configured
* in order to utilize a peripheral clock .
* @ param [ in ] source Clock source desired to be fetched .
* @ return Clock rate in Hz for the specified clock . 0 if undefined or error .
*/
uint32_t rcc_get_bus_clk_freq ( enum rcc_clock_source source ) ;
/**
* Get the clock rate ( in hz ) of the specified peripheral . This will pull the
* proper sources out of the clock tree and calculate the clock for the
* peripheral for return to the user , based on current settings .
* @ param [ in ] periph Peripheral base address to get the clock rate for .
* @ return Clock rate in Hz for the specified peripheral . 0 if undefined or error .
*/
uint32_t rcc_get_peripheral_clk_freq ( uint32_t periph ) ;
/**
* Set the clksel value for the specified peripheral . This code will determine
* the appropriate register , shift and mask values to apply to the selection to
* and set the values appropriately .
* @ param [ in ] periph Base address of the peripheral to set the clock sel for .
* @ param [ in ] Raw , unshifted selection value for the clock .
*/
void rcc_set_peripheral_clk_sel ( uint32_t periph , uint32_t sel ) ;
/**
* Set the clock select for the FDCAN devices .
* @ param [ in ] source Clock source to configure FDCAN kernel clock for .
* RCC_D2CCIP1R_FDCANSEL_XXX selections above .
*/
void rcc_set_fdcan_clksel ( uint8_t fdcansel ) ;
/**
* Set the clock select for the SPI 1 / 2 / 3 devices .
* @ param [ in ] source Clock source desired to be fetched . Choose from
* RCC_D2CCIP1R_SPI123_XXX selections above .
*/
void rcc_set_spi123_clksel ( uint8_t clksel ) ;
/**
* Set the clock select for the SPI 4 / 5 devices .
* @ param [ in ] source Clock source desired to be fetched . Choose from
* RCC_D2CCIP1R_SPI45_XXX selections above .
*/
void rcc_set_spi45_clksel ( uint8_t clksel ) ;
END_DECLS
/**@}*/
# endif