/** * @file HwA_SCG.h * @author Flagchip * @brief FC7xxx SCG hardware access layer * @version 0.1.0 * @date 2023-01-12 * * @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd. * * @details */ /* ******************************************************************************** * Revision History: * * Version Date Initials CR# Descriptions * --------- ---------- ------------ ---------- --------------- * 0.1.0 2024-01-12 Flagchip085 N/A First version for FC7240 ******************************************************************************** */ #ifndef _HWA_SCG_H_ #define _HWA_SCG_H_ #include "device_header.h" /** * @addtogroup HwA_SCG * @{ * */ /********* macros ************/ #define UNKNOWN_CLOCK 0xFFFFFFFFU #define SCG_CORE_CLOCK_SYMBOL CORE #define SCG_BUS_CLOCK_SYMBOL BUS #define SCG_SLOW_CLOCK_SYMBOL SLOW #define SCG_SIRC_CLOCK_SYMBOL SIRC #define SCG_SIRC32K_CLOCK_SYMBOL SIRC32K #define SCG_FIRC_CLOCK_SYMBOL FIRC #define SCG_FOSC_CLOCK_SYMBOL FOSC #define SCG_SOSC_CLOCK_SYMBOL SOSC #define SCG_PLL0_CLOCK_SYMBOL PLL0 #define SCG_PLL1_CLOCK_SYMBOL PLL1 /* PLL related */ #define SCG_PLLCSR_LK_MASK 0x800000u #define SCG_PLLCSR_EN_MASK 0x1u #define SCG_PLLCSR_CMRE_MASK 0x20000u #define SCG_PLLCSR_CMRE_SHIFT 17u #define SCG_PLLCSR_CMRE(x) (((uint32_t)(((uint32_t)(x))<_pll_##CSR = val #define SCG_HWA_SetPllCsr(pll, val) _SCG_HWA_SetPllCsr(pll, val) #define _SCG_HWA_UnlockPllCsr(_pll_) SCG->_pll_##CSR &= ~(uint32_t)SCG_PLLCSR_LK_MASK #define SCG_HWA_UnlockPllCsr(pll) _SCG_HWA_UnlockPllCsr(pll) #define _SCG_HWA_LockPllCsr(_pll_) SCG->_pll_##CSR |= (uint32_t)SCG_PLLCSR_LK_MASK #define SCG_HWA_LockPllCsr(pll) _SCG_HWA_LockPllCsr(pll) #define _SCG_HWA_EnablePllClockMonitor(_pll_) SCG->_pll_##CSR |= (uint32_t)SCG_PLLCSR_CM_MASK #define SCG_HWA_EnablePllClockMonitor(pll) _SCG_HWA_EnablePllClockMonitor(pll) #define _SCG_HWA_EnablePllClockMonitorReset(_pll_) SCG->_pll_##CSR |= (uint32_t)SCG_PLLCSR_CMRE_MASK #define SCG_HWA_EnablePllClockMonitorReset(pll) _SCG_HWA_EnablePllClockMonitorReset(pll) #define _SCG_HWA_SetPllCfg(_pll_, val) SCG->_pll_##CFG = val #define SCG_HWA_SetPllCfg(pll, val) _SCG_HWA_SetPllCfg(pll, val) #define _SCG_HWA_SetPllDiv(_pll_, val) SCG->_pll_##DIV = val #define SCG_HWA_SetPllDiv(pll, val) _SCG_HWA_SetPllDiv(pll, val) #define _SCG_HWA_EnablePll(_pll_) SCG->_pll_##CSR |= (uint32_t)(SCG_PLLCSR_EN_MASK) #define SCG_HWA_EnablePll(pll) _SCG_HWA_EnablePll(pll) #define _SCG_HWA_GetPllMult(_pll_) (uint32_t)(((uint32_t)(SCG->_pll_##CFG) & SCG_PLLCFG_MULT_MASK) >> SCG_PLLCFG_MULT_SHIFT) #define SCG_HWA_GetPllMult(pll) _SCG_HWA_GetPllMult(pll) #define _SCG_HWA_GetPllPrediv(_pll_) (uint32_t)(((uint32_t)(SCG->_pll_##CFG) & SCG_PLLCFG_PREDIV_MASK) >> SCG_PLLCFG_PREDIV_SHIFT) #define SCG_HWA_GetPllPrediv(pll) _SCG_HWA_GetPllPrediv(pll) #define _SCG_HWA_GetPllPstdiv(_pll_) (uint32_t)(((uint32_t)(SCG->_pll_##CFG) & SCG_PLLCFG_PSTDIV_MASK) >> SCG_PLLCFG_PSTDIV_SHIFT) #define SCG_HWA_GetPllPstdiv(pll) _SCG_HWA_GetPllPstdiv(pll) #define _SCG_HWA_GetPllSrc(_pll_) (uint32_t)(((uint32_t)(SCG->_pll_##CFG) & SCG_PLLCFG_SOURCE_MASK) >> SCG_PLLCFG_SOURCE_SHIFT) #define SCG_HWA_GetPllSrc(pll) _SCG_HWA_GetPllSrc(pll) /* Clock valid and div related */ #define _SCG_HWA_GetClockVliad(_clock_) (bool)((((uint32_t)SCG->_clock_##CSR & (uint32_t)SCG_##_clock_##CSR_VLD_MASK) != 0U) ? true : false) #define SCG_HWA_GetClockVliad(_clock_) _SCG_HWA_GetClockVliad(_clock_) #define _SCG_HWA_GetClockDiv(_clock_) (uint32_t)SCG->_clock_##DIV #define SCG_HWA_GetClockDiv(_clock_) _SCG_HWA_GetClockDiv(_clock_) #define SCG_CLOCKDIV_DIVL_ACK_MASK 0x40000000u #define SCG_CLOCKDIV_DIVM_ACK_MASK 0x20000000u #define SCG_CLOCKDIV_DIVH_ACK_MASK 0x10000000u #define SCG_CLOCKDIV_DIVL_ACK_SHIFT 30u #define SCG_CLOCKDIV_DIVM_ACK_SHIFT 29u #define SCG_CLOCKDIV_DIVH_ACK_SHIFT 28u #define SCG_CLOCKDIV_DIVL_EN_MASK 0x4000000u #define SCG_CLOCKDIV_DIVM_EN_MASK 0x2000000u #define SCG_CLOCKDIV_DIVH_EN_MASK 0x1000000u #define SCG_CLOCKDIV_DIVL_EN_SHIFT 26u #define SCG_CLOCKDIV_DIVM_EN_SHIFT 25u #define SCG_CLOCKDIV_DIVH_EN_SHIFT 24u #define SCG_CLOCKDIV_EN2ACK_SHIFT 4u #define SCG_CLOCKDIV_DIVL_VAL_MASK 0x70000u #define SCG_CLOCKDIV_DIVM_VAL_MASK 0x700u #define SCG_CLOCKDIV_DIVH_VAL_MASK 0x7u #define SCG_CLOCKDIV_DIVL_VAL_SHIFT 16u #define SCG_CLOCKDIV_DIVM_VAL_SHIFT 8u #define SCG_CLOCKDIV_DIVH_VAL_SHIFT 0u #define SCG_CHECK_DIVL_ACK(reg_val) ((reg_val & SCG_CLOCKDIV_DIVL_ACK_MASK) >> SCG_CLOCKDIV_DIVL_ACK_SHIFT) #define SCG_CHECK_DIVM_ACK(reg_val) ((reg_val & SCG_CLOCKDIV_DIVM_ACK_MASK) >> SCG_CLOCKDIV_DIVM_ACK_SHIFT) #define SCG_CHECK_DIVH_ACK(reg_val) ((reg_val & SCG_CLOCKDIV_DIVH_ACK_MASK) >> SCG_CLOCKDIV_DIVH_ACK_SHIFT) #define SCG_CHECK_DIVL_EN(reg_val) ((reg_val & SCG_CLOCKDIV_DIVL_EN_MASK) >> SCG_CLOCKDIV_DIVL_EN_SHIFT) #define SCG_CHECK_DIVM_EN(reg_val) ((reg_val & SCG_CLOCKDIV_DIVM_EN_MASK) >> SCG_CLOCKDIV_DIVM_EN_SHIFT) #define SCG_CHECK_DIVH_EN(reg_val) ((reg_val & SCG_CLOCKDIV_DIVH_EN_MASK) >> SCG_CLOCKDIV_DIVH_EN_SHIFT) #define SCG_GET_DIVL_VAL(reg_val) ((0U == ((reg_val & SCG_CLOCKDIV_DIVL_VAL_MASK) >> SCG_CLOCKDIV_DIVL_VAL_SHIFT)) ? 1U : ((reg_val & SCG_CLOCKDIV_DIVL_VAL_MASK) >> SCG_CLOCKDIV_DIVL_VAL_SHIFT)) #define SCG_GET_DIVM_VAL(reg_val) ((0U == ((reg_val & SCG_CLOCKDIV_DIVM_VAL_MASK) >> SCG_CLOCKDIV_DIVM_VAL_SHIFT)) ? 1U : ((reg_val & SCG_CLOCKDIV_DIVM_VAL_MASK) >> SCG_CLOCKDIV_DIVM_VAL_SHIFT)) #define SCG_GET_DIVH_VAL(reg_val) ((0U == ((reg_val & SCG_CLOCKDIV_DIVH_VAL_MASK) >> SCG_CLOCKDIV_DIVH_VAL_SHIFT)) ? 1U : ((reg_val & SCG_CLOCKDIV_DIVH_VAL_MASK) >> SCG_CLOCKDIV_DIVH_VAL_SHIFT)) #define SCG_CALCULATE_DIVL_FREQ(clk_freq, reg_val) (((1U == SCG_CHECK_DIVL_EN(reg_val)) && (clk_freq != UNKNOWN_CLOCK)) ? (uint32_t)clk_freq >> (uint8_t)(SCG_GET_DIVL_VAL(reg_val) - 1U) : (uint32_t)UNKNOWN_CLOCK) #define SCG_CALCULATE_DIVM_FREQ(clk_freq, reg_val) (((1U == SCG_CHECK_DIVM_EN(reg_val)) && (clk_freq != UNKNOWN_CLOCK)) ? (uint32_t)clk_freq >> (uint8_t)(SCG_GET_DIVM_VAL(reg_val) - 1U) : (uint32_t)UNKNOWN_CLOCK) #define SCG_CALCULATE_DIVH_FREQ(clk_freq, reg_val) (((1U == SCG_CHECK_DIVH_EN(reg_val)) && (clk_freq != UNKNOWN_CLOCK)) ? (uint32_t)clk_freq >> (uint8_t)(SCG_GET_DIVH_VAL(reg_val) - 1U) : (uint32_t)UNKNOWN_CLOCK) typedef enum { SCG_CLOCK_DIV_H = 0x01000000U, /* DIVH clock enable bit [24] */ SCG_CLOCK_DIV_M = 0x02000000U, /* DIVM clock enable bit [25] */ SCG_CLOCK_DIV_L = 0x04000000U, /* DIVL clock enable bit [26] */ SCG_CLOCK_DIV_ALL = 0x07000000U, /* DIVH DIVM DIVL clock enable bit [26:24] */ }SCG_DivEnableType; /********* Local inline function ************/ /** * @brief Get clock out configure register CLKOUTSEL value */ LOCAL_INLINE uint8_t SCG_HWA_GetClkOutSel(void) { return (uint8_t)(((uint32_t)SCG->CLKOUTCFG & SCG_CLKOUTCFG_CLKOUTSEL_MASK) >> SCG_CLKOUTCFG_CLKOUTSEL_SHIFT); } /** * @brief Get clock out configure register value */ LOCAL_INLINE uint32_t SCG_HWA_GetClkOutCfg(void) { return SCG->CLKOUTCFG; } /** * @brief Unlock SOSC CSR register * */ LOCAL_INLINE void SCG_HWA_UnlockSoscCsrReg(void) { SCG->SOSCCSR &= ~(uint32_t)(SCG_SOSCCSR_LK_MASK); } /** * @brief Lock SOSC CSR register * */ LOCAL_INLINE void SCG_HWA_LockSoscCsrReg(void) { SCG->SOSCCSR |= (uint32_t)(SCG_SOSCCSR_LK_MASK); } /** * @brief Enable SOSC clock monitor * */ LOCAL_INLINE void SCG_HWA_EnableSoscClockMonitor(void) { SCG->SOSCCSR |= (uint32_t)(SCG_SOSCCSR_CM_MASK); } /** * @brief Enable SOSC clock monitor Reset * */ LOCAL_INLINE void SCG_HWA_EnableSoscClockMonitorReset(void) { SCG->SOSCCSR |= (uint32_t)(SCG_SOSCCSR_CMRE_MASK); } /** * @brief Set SOSC enable */ LOCAL_INLINE void SCG_HWA_EnableSosc(void) { SCG->SOSCCSR |= (uint32_t)SCG_SOSCCSR_EN_MASK; } /** * @brief Diable SOSC */ LOCAL_INLINE void SCG_HWA_DisableSosc(void) { SCG->SOSCCSR &= ~(uint32_t)SCG_SOSCCSR_EN_MASK; } /** * @brief Set recommend value to SOSCCFG register * */ LOCAL_INLINE void SCG_HWA_SetSoscRecommendCfg(void) { SCG->SOSCCFG = (uint32_t)(SCG_SOSCCFG_EOCV(64U) | SCG_SOSCCFG_GM_SEL(3U) | SCG_SOSCCFG_CURPRG_SF(3U) | SCG_SOSCCFG_CURPRG_COMP(3U)); } /** * @brief Set SOSC CSR register value * * @param u32CsrValue configured register value */ LOCAL_INLINE void SCG_HWA_SetSoscCsr(uint32_t u32CsrValue) { SCG->SOSCCSR = u32CsrValue; } /** * @brief Get SOSC CSR register value * */ LOCAL_INLINE uint32_t SCG_HWA_GetSoscCsr(void) { return (uint32_t)SCG->SOSCCSR; } /********* Fosc Register interface ************/ /** * @brief Enable FOSC */ LOCAL_INLINE void SCG_HWA_EnableFosc(void) { SCG->FOSCCSR |= (uint32_t)SCG_FOSCCSR_EN_MASK; } /** * @brief Disable FOSC */ LOCAL_INLINE void SCG_HWA_DisableFosc(void) { SCG->FOSCCSR &= ~SCG_FOSCCSR_EN_MASK; } /** * @brief Set FOSCCFG register value * * @param u32CfgValue configured register value */ LOCAL_INLINE void SCG_HWA_SetFoscCfg(uint32_t u32CfgValue) { SCG->FOSCCFG = u32CfgValue; } /** * @brief Set FOSCCSR register value * * @param u32CsrValue configured register value */ LOCAL_INLINE void SCG_HWA_SetFoscCsr(uint32_t u32CsrValue) { SCG->FOSCCSR = u32CsrValue; } /** * @brief Get FOSCCSR register value * */ LOCAL_INLINE uint32_t SCG_HWA_GetFoscCsr(void) { return (uint32_t)SCG->FOSCCSR; } /** * @brief Unlock FOSC CSR register * */ LOCAL_INLINE void SCG_HWA_UnlockFoscCsrReg(void) { SCG->FOSCCSR &= ~(uint32_t)(SCG_FOSCCSR_LK_MASK); } /** * @brief lock FOSC CSR register * */ LOCAL_INLINE void SCG_HWA_LockFoscCsrReg(void) { SCG->FOSCCSR |= (uint32_t)(SCG_FOSCCSR_LK_MASK); } /** * @brief Enable FOSC clock monitor * */ LOCAL_INLINE void SCG_HWA_EnableFoscClockMonitor(void) { SCG->FOSCCSR |= (uint32_t)(SCG_FOSCCSR_CM_MASK); } /** * @brief Enable FOSC clock monitor Reset * */ LOCAL_INLINE void SCG_HWA_EnableFoscClockMonitorReset(void) { SCG->FOSCCSR |= (uint32_t)(SCG_FOSCCSR_CMRE_MASK); } /** * @brief enable FOSCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_EnableFoscDiv(SCG_DivEnableType DivEn) { SCG->FOSCDIV |= (uint32_t)DivEn; } /** * @brief Disable FOSCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_DiableFoscDiv(SCG_DivEnableType DivEn) { SCG->FOSCDIV &= ~(uint32_t)DivEn; } /** * @brief Get the acknowledgment of DIV clocks enabled by SCG_HWA_EnableFoscDiv * @param DivEn the or value of SCG_DivEnableType * @return bool true : The enabled DIV clocks are acknowledged * false : The enabled DIV clocks are not acknowledged */ LOCAL_INLINE bool SCG_HWA_GetFoscDivAck(SCG_DivEnableType DivEn) { return (bool)((SCG->FOSCDIV & (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)) == (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)); } /** * @brief Set FOSCDIV register value * * @param u32DivValue configured register value */ LOCAL_INLINE void SCG_HWA_SetFoscDiv(uint32_t u32DivValue) { SCG->FOSCDIV = u32DivValue; } /** * @brief Set Low Power Wakeup WDOG Register * * @param u8MSBVal Most Significant value, if OSC is 40M * and FOSC not valid after 1.8ms wakeup, * the chip will reset and RGM register will * report clock error reset reason. */ LOCAL_INLINE void SCG_HWA_SetWKPWDG(uint8_t u8MSBVal) { SCG->WKPWDG = SCG_WKPWDG_MSB(u8MSBVal) | SCG_WKPWDG_EN_MASK; } /********* Sirc Register interface ************/ /** * @brief Set SIRCCSR register value * * @param u32CsrValue configured register value */ LOCAL_INLINE void SCG_HWA_SetSircCsr(uint32_t u32CsrValue) { SCG->SIRCCSR = u32CsrValue; } /** * @brief Get SIRCCSR register value * */ LOCAL_INLINE uint32_t SCG_HWA_GetSircCsr(void) { return (uint32_t)SCG->SIRCCSR; } /** * @brief Unlock SIRC CSR register * */ LOCAL_INLINE void SCG_HWA_UnlockSircCsrReg(void) { SCG->SIRCCSR &= ~(uint32_t)SCG_SIRCCSR_LK_MASK; } /** * @brief Lock SIRC CSR register * */ LOCAL_INLINE void SCG_HWA_LockSircCsrReg(void) { SCG->SIRCCSR |= (uint32_t)SCG_SIRCCSR_LK_MASK; } /** * @brief Enable SIRC clock monitor * */ LOCAL_INLINE void SCG_HWA_EnableSircClockMonitor(void) { SCG->SIRCCSR |= (uint32_t)(SCG_SIRCCSR_CM_MASK); } /** * @brief Set SIRCDIV register value * * @param u32DivValue configured register value */ LOCAL_INLINE void SCG_HWA_SetSircDiv(uint32_t u32DivValue) { SCG->SIRCDIV = u32DivValue; } /** * @brief enable SIRCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_EnableSircDiv(SCG_DivEnableType DivEn) { SCG->SIRCDIV |= (uint32_t)DivEn; } /** * @brief Disable SIRCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_DiableSircDiv(SCG_DivEnableType DivEn) { SCG->SIRCDIV &= ~(uint32_t)DivEn; } /** * @brief Get the acknowledgment of DIV clocks enabled by SCG_HWA_EnableSircDiv * @param DivEn the or value of SCG_DivEnableType * @return bool true : The enabled DIV clocks are acknowledged * false : The enabled DIV clocks are not acknowledged */ LOCAL_INLINE bool SCG_HWA_GetSircDivAck(SCG_DivEnableType DivEn) { return (bool)((SCG->SIRCDIV & (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)) == (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)); } /** * @brief Set SIRCTCFG register value for SIRC Trim configure. * * @param u32TcfgValue configured register value */ LOCAL_INLINE void SCG_HWA_SetSircTcfg(uint32_t u32TcfgValue) { SCG->SIRCTCFG = u32TcfgValue; } /********* Sirc32k Register interface ************/ /** * @brief Enable SIRC32KCSR register * */ LOCAL_INLINE void SCG_HWA_EnableSirc32kCsr(void) { SCG->SIRC32KCSR |= (uint32_t)SCG_SIRC32KCSR_EN_MASK; } /** * @brief Disable SIRC32KCSR register * */ LOCAL_INLINE void SCG_HWA_DisableSirc32kCsr(void) { SCG->SIRC32KCSR &= ~(uint32_t)SCG_SIRC32KCSR_EN_MASK; } /** * @brief Unlock SIRC32K CSR register */ LOCAL_INLINE void SCG_HWA_UnlockSirc32kCsrReg(void) { SCG->SIRC32KCSR &= ~(uint32_t)(SCG_SIRC32KCSR_LK_MASK); } /** * @brief Lock SIRC32K CSR register */ LOCAL_INLINE void SCG_HWA_LockSirc32kCsrReg(void) { SCG->SIRC32KCSR |= (uint32_t)(SCG_SIRC32KCSR_LK_MASK); } /********* Firc Register interface ************/ /** * @brief Get FIRC CSR register value. */ LOCAL_INLINE uint32_t SCG_HWA_GetFircCsr(void) { return (uint32_t)SCG->FIRCCSR; } /** * @brief Enable FIRC. */ LOCAL_INLINE void SCG_HWA_EnableFirc(void) { SCG->FIRCCSR |= (uint32_t)SCG_FIRCCSR_EN_MASK; } /** * @brief Unlock FIRC CSR register */ LOCAL_INLINE void SCG_HWA_UnlockFircCsrReg(void) { SCG->FIRCCSR &= ~(uint32_t)(SCG_FIRCCSR_LK_MASK); } /** * @brief Lock FIRC CSR register */ LOCAL_INLINE void SCG_HWA_LockFircCsrReg(void) { SCG->FIRCCSR |= (uint32_t)(SCG_FIRCCSR_LK_MASK); } /** * @brief Enable FIRC clock monitor * */ LOCAL_INLINE void SCG_HWA_EnableFircClockMonitor(void) { SCG->FIRCCSR |= (uint32_t)(SCG_FIRCCSR_CM_MASK); } /** * @brief Disable FIRC. */ LOCAL_INLINE void SCG_HWA_DisableFirc(void) { SCG->FIRCCSR &= ~(uint32_t)SCG_FIRCCSR_EN_MASK; } /** * @brief Set FIRCCSR register value * * @param u32CsrValue configured register value */ LOCAL_INLINE void SCG_HWA_SetFircCsr(uint32_t u32CsrValue) { SCG->FIRCCSR = u32CsrValue; } /** * @brief Set FIRCCFG register value * * @param u32CfgValue configured register value */ LOCAL_INLINE void SCG_HWA_SetFircCfg(uint32_t u32CfgValue) { SCG->FIRCCFG = u32CfgValue; } /** * @brief Set FOSCDIV register value * * @param u32DivValue configured register value */ LOCAL_INLINE void SCG_HWA_SetFircDiv(uint32_t u32DivValue) { SCG->FIRCDIV = u32DivValue; } /** * @brief enable FIRCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_EnableFircDiv(SCG_DivEnableType DivEn) { SCG->FIRCDIV |= (uint32_t)DivEn; } /** * @brief Disable FIRCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_DiableFircDiv(SCG_DivEnableType DivEn) { SCG->FIRCDIV &= ~(uint32_t)DivEn; } /** * @brief Get the acknowledgment of DIV clocks enabled by SCG_HWA_EnableFircDiv * @param DivEn the or value of SCG_DivEnableType * @return bool true : The enabled DIV clocks are acknowledged * false : The enabled DIV clocks are not acknowledged */ LOCAL_INLINE bool SCG_HWA_GetFircDivAck(SCG_DivEnableType DivEn) { return (bool)((SCG->FIRCDIV & (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)) == (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)); } /** * @brief Set FIRCTCFG register value for FIRC clock trim configure. * * @param u32TcfgValue configured register value. */ LOCAL_INLINE void SCG_HWA_SetFircTcfg(uint32_t u32TcfgValue) { SCG->FIRCTCFG = u32TcfgValue; } /********* PLL0 clock Register interface ************/ /** * @brief enable PLL0DIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_EnablePll0Div(SCG_DivEnableType DivEn) { SCG->PLL0DIV |= (uint32_t)DivEn; } /** * @brief Disable FOSCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_DiablePll0Div(SCG_DivEnableType DivEn) { SCG->PLL0DIV &= ~(uint32_t)DivEn; } /** * @brief Get the acknowledgment of DIV clocks enabled by SCG_HWA_EnablePll0Div * @param DivEn the or value of SCG_DivEnableType * @return bool true : The enabled DIV clocks are acknowledged * false : The enabled DIV clocks are not acknowledged */ LOCAL_INLINE bool SCG_HWA_GetPll0DivAck(SCG_DivEnableType DivEn) { return (bool)((SCG->PLL0DIV & (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)) == (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)); } /********* PLL1 clock Register interface ************/ /** * @brief enable PLL0DIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_EnablePll1Div(SCG_DivEnableType DivEn) { SCG->PLL1DIV |= (uint32_t)DivEn; } /** * @brief Disable FOSCDIV as user manual request sequence * @param DivEn the or value of SCG_DivEnableType */ LOCAL_INLINE void SCG_HWA_DiablePll1Div(SCG_DivEnableType DivEn) { SCG->PLL1DIV &= ~(uint32_t)DivEn; } /** * @brief Get the acknowledgment of DIV clocks enabled by SCG_HWA_EnablePll1Div * @param DivEn the or value of SCG_DivEnableType * @return bool true : The enabled DIV clocks are acknowledged * false : The enabled DIV clocks are not acknowledged */ LOCAL_INLINE bool SCG_HWA_GetPll1DivAck(SCG_DivEnableType DivEn) { return (bool)((SCG->PLL1DIV & (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)) == (DivEn << SCG_CLOCKDIV_EN2ACK_SHIFT)); } /********* System clock Register interface ************/ /** * @brief Get system clock CCR register value * * @return system clock CCR register value */ LOCAL_INLINE uint32_t SCG_HWA_GetCCR(void) { return SCG->CCR; } /** * @brief Set system clock CCR register value * * @param u32CcrValue configured register value */ LOCAL_INLINE void SCG_HWA_SetCCR(uint32_t u32CcrValue) { SCG->CCR = u32CcrValue; } /** * @brief Set system clock * * @param u8SystemCLock System clock value */ LOCAL_INLINE void SCG_HWA_SetSystemClock(uint8_t u8SystemCLock) { SCG->CCR = ((SCG->CCR & ~(uint32_t)SCG_CCR_SCS_MASK) | SCG_CCR_SCS(u8SystemCLock)); } /** * @brief Get system clock source. used to calculate system clock frequency at startup. * used to check if the target clock soure successfully switched. * @return uint8_t. system clock source. */ LOCAL_INLINE uint8_t SCG_HWA_GetSysClkSrc(void) { return (uint8_t)(((uint32_t)(SCG->CSR) & (uint32_t)SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT); } /** * @brief Get system clock valid status, use this status to check system clock update finished or not. * @return bool. true as updated; false as not updated. */ LOCAL_INLINE bool SCG_HWA_GetSysClkUPRD(void) { return (bool)((((uint32_t)SCG->CSR & (uint32_t)SCG_CSR_CCR_UPRD_MASK) != 0U) ? true : false); } /** * @brief Get system clock Divcore. used to calculate core clock frequency at startup. * @return uint8_t. system clock Divcore. */ LOCAL_INLINE uint8_t SCG_HWA_GetSysClkDivCore(void) { return (uint8_t)(((uint32_t)(SCG->CSR) & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT); } /** * @brief Get system clock Divbus. used to calculate bus clock frequency at startup. * @return uint8_t. system clock Divbus. */ LOCAL_INLINE uint8_t SCG_HWA_GetSysClkDivBus(void) { return (uint8_t)(((uint32_t)(SCG->CSR) & SCG_CSR_DIVBUS_MASK) >> SCG_CSR_DIVBUS_SHIFT); } /** * @brief Get system clock Divslow. used to calculate slow clock frequency at startup. * @return uint8_t. system clock Divslow. */ LOCAL_INLINE uint8_t SCG_HWA_GetSysClkDivSlow(void) { return (uint8_t)(((uint32_t)(SCG->CSR) & SCG_CSR_DIVSLOW_MASK) >> SCG_CSR_DIVSLOW_SHIFT); } /********* Clkout Register interface ************/ /** * @brief Select clock out source * * @param u8ClkOutSel Clock out select */ LOCAL_INLINE void SCG_HWA_SetClkOutSel(uint8_t u8ClkOutSel) { SCG->CLKOUTCFG = ((SCG->CLKOUTCFG & ~(uint32_t)SCG_CLKOUTCFG_CLKOUTSEL_MASK) | SCG_CLKOUTCFG_CLKOUTSEL(u8ClkOutSel)); } /** * @brief Set Nvm clock source * * @param u32NvmClkMask Nvm clock source mask */ LOCAL_INLINE void SCG_HWA_SetNvmClk(uint32_t u32NvmClkMask) { SCG->CLKOUTCFG &= ~(uint32_t)(SCG_CLKOUTCFG_NVMCLK_FIRC_MASK | SCG_CLKOUTCFG_NVMCLK_SIRC_MASK); SCG->CLKOUTCFG |= u32NvmClkMask; } /** * @brief Set CMU4 clock source * * @param u32Cmu4ClkMask CMU4 clock source mask */ LOCAL_INLINE void SCG_HWA_SetCmu4Clk(uint32_t u32Cmu4ClkMask) { SCG->CLKOUTCFG &= ~(uint32_t)(SCG_CLKOUTCFG_CMU4CLK_FOSC_MASK | SCG_CLKOUTCFG_CMU4CLK_SIRC_MASK); SCG->CLKOUTCFG |= u32Cmu4ClkMask; } /********* CRC Register interface ************/ /** * @brief Generate SCG register CRC value */ LOCAL_INLINE void SCG_HWA_GenCrcVal(void) { SCG->CRCCSR |= (uint32_t)SCG_CRCCSR_GEN_MASK; } /** * @brief Enable SCG register CRC check */ LOCAL_INLINE void SCG_HWA_EnableCrcCheck(void) { SCG->CRCCSR |= (uint32_t)SCG_CRCCSR_CHKEN_MASK; } /** * @brief Disable SCG register CRC check */ LOCAL_INLINE void SCG_HWA_DisableCrcCheck(void) { SCG->CRCCSR &= ~(uint32_t)SCG_CRCCSR_CHKEN_MASK; } /** * @brief Enable SCG register CRC error output */ LOCAL_INLINE void SCG_HWA_EnableCrcErrorOutput(void) { SCG->CRCCSR |= (uint32_t)SCG_CRCCSR_EOEN_MASK; } /** * @brief Disable SCG register CRC error output */ LOCAL_INLINE void SCG_HWA_DisableCrcErrorOutput(void) { SCG->CRCCSR &= ~(uint32_t)SCG_CRCCSR_EOEN_MASK; } /** * @brief Get CRC busy status */ LOCAL_INLINE bool SCG_HWA_GetCrcBusyStatus(void) { return (0U != (SCG->CRCCSR & (uint32_t)SCG_CRCCSR_BUSY_MASK)); } /** * @brief Get CRC error status */ LOCAL_INLINE bool SCG_HWA_GetCrcErrorStatus(void) { return (0U != (SCG->CRCCSR & (uint32_t)SCG_CRCCSR_ERR_MASK)); } /** * @brief Clear CRC error flag */ LOCAL_INLINE void SCG_HWA_ClearCrcErrorFlag(void) { SCG->CRCCSR |= (uint32_t)SCG_CRCCSR_ERR_MASK; } /** * @brief Get CRC result */ LOCAL_INLINE uint32_t SCG_HWA_GetCrcResult(void) { return SCG->CRCRES; } /** * @brief Enable SCG register CRC trigger mode */ LOCAL_INLINE void SCG_HWA_EnableCrcTriggerMode(void) { SCG->CRCCSR |= (uint32_t)SCG_CRCCSR_TRGEN_MASK; } /** * @brief Disable SCG register CRC trigger mode */ LOCAL_INLINE void SCG_HWA_DisableCrcTriggerMode(void) { SCG->CRCCSR &= ~(uint32_t)SCG_CRCCSR_TRGEN_MASK; } /** @}*/ /* HwA_SCG */ #endif /* #ifndef _HWA_SCG_H_ */