/** ****************************************************************************** * @file tae32f53xx_ll_sysctrl.c * @author MCD Application Team * @brief SYSCTRL LL Module Driver. * ****************************************************************************** * @attention * *

© Copyright (c) 2020 Tai-Action. * All rights reserved.

* * This software is licensed by Tai-Action under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "tae32f53xx_ll.h" #define DBG_TAG "SYSCTRL" #define DBG_LVL DBG_ERROR #include "dbg/tae32f53xx_dbg.h" /** @addtogroup TAE32F53xx_LL_Driver * @{ */ /** @defgroup SYSCTRL_LL SYSCTRL LL * @brief SYSCTRL LL Module Driver * @{ */ /* Private define ------------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/ /** @defgroup SYSCTRL_LL_Private_Types SYSCTRL LL Private Types * @brief SYSCTRL LL Private Types * @{ */ /** * @brief SYSCTRL PLL0/1/2 Config Type Define * @note pll_out_freq is before PLL Post Div */ typedef struct __SYSCTRL_PLLCfgTypedef { uint32_t pll_in_freq; /*!< PLL Input Freq */ uint32_t pll_out_freq; /*!< PLL Output Freq */ uint8_t pll_pre_div; /*!< PLL Pre-Div */ uint16_t fpll_int; /*!< FPLL Integer */ uint16_t fpll_frac; /*!< FPLL Fraction */ uint32_t pll_vco_band; /*!< PLL VCO Band */ uint32_t pll_vco_gain; /*!< PLL VCO Gain */ } SYSCTRL_PLLCfgTypedef; /** * @} */ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /** @defgroup SYSCTRL_LL_Private_Variables SYSCTRL LL Private Variables * @brief SYSCTRL LL Private Variables * @{ */ /** * @brief SYSCLK PLL Config Const Array Definition * @note VCO band&gain config are the same to PLL0/1/2 */ static const SYSCTRL_PLLCfgTypedef sysctrl_pll_cfg[] = { {8000000, 100000000, 1, 6, 0x4000, SYSCTRL_PLL0_BAND_312M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->100M */ {8000000, 110000000, 1, 6, 0xe000, SYSCTRL_PLL0_BAND_312M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->110M */ {8000000, 120000000, 1, 7, 0x8000, SYSCTRL_PLL0_BAND_312M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->120M */ {8000000, 130000000, 1, 8, 0x2000, SYSCTRL_PLL0_BAND_312M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->130M */ {8000000, 140000000, 1, 8, 0xc000, SYSCTRL_PLL0_BAND_396M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->140M */ {8000000, 150000000, 1, 9, 0x6000, SYSCTRL_PLL0_BAND_396M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->150M */ {8000000, 160000000, 1, 10, 0, SYSCTRL_PLL0_BAND_396M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->160M */ {8000000, 170000000, 1, 10, 0xa000, SYSCTRL_PLL0_BAND_396M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->170M */ {8000000, 180000000, 1, 11, 0x4000, SYSCTRL_PLL0_BAND_466M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->180M */ {8000000, 190000000, 1, 11, 0xe000, SYSCTRL_PLL0_BAND_466M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->190M */ {8000000, 200000000, 1, 12, 0x8000, SYSCTRL_PLL0_BAND_466M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->200M */ {8000000, 210000000, 1, 13, 0x2000, SYSCTRL_PLL0_BAND_520M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->210M */ {8000000, 220000000, 1, 13, 0xc000, SYSCTRL_PLL0_BAND_520M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->220M */ {8000000, 230000000, 1, 14, 0x6000, SYSCTRL_PLL0_BAND_520M, SYSCTRL_PLL0_GVCO_2}, /*!8M,PLL0Out->230M */ }; /** * @} */ /* Private function prototypes -----------------------------------------------*/ /** @defgroup SYSCTRL_LL_Private_Functions SYSCTRL LL Private Functions * @brief SYSCTRL LL Private Functions * @{ */ static void LL_SYSCTRL_XOSCCfg(SYSCTRL_TypeDef *Instance); /** * @} */ /* Exported functions --------------------------------------------------------*/ /** @defgroup SYSCTRL_LL_Exported_Functions SYSCTRL LL Exported Functions * @brief SYSCTRL LL Exported Functions * @{ */ /** @defgroup SYSCTRL_LL_Exported_Functions_Group1 SYSCTRL Clock Config Functions * @brief SYSCTRL Clock Config Functions * @{ */ /** * @brief SYSCTRL LL SYSCLK Init * @param Instance Specifies SYSCTRL peripheral * @param sysclk_cfg SYSCLK Config Pointer * @return Status of the Initialization */ LL_StatusETypeDef LL_SYSCTRL_SysclkInit(SYSCTRL_TypeDef *Instance, SYSCTRL_SysclkUserCfgTypeDef *sysclk_cfg) { uint16_t sysclk_div, remain; SYSCTRL_PLLUserCfgTypeDef pll0_cfg; LL_StatusETypeDef ret = LL_ERROR; //Check params to be valid if (Instance == NULL || sysclk_cfg == NULL) { LOG_E("SYSCLK init params error!\n"); return LL_ERROR; } assert_param(sysclk_cfg->sysclk_freq); //Auto Freq Config if (sysclk_cfg->sysclk_src == SYSCLK_SRC_RC32K) { //SYSCLK Source RC32K sysclk_cfg->sysclk_src_freq = LSI_VALUE; } else if (sysclk_cfg->sysclk_src == SYSCLK_SRC_RC8M) { //SYSCLK Source RC8M sysclk_cfg->sysclk_src_freq = HSI_VALUE; } else if (sysclk_cfg->sysclk_src == SYSCLK_SRC_HOSC) { //SYSCLK Source HOSC if (!sysclk_cfg->sysclk_src_freq) { //Hardware can AutoSwitch sysclk_cfg->sysclk_src_freq = HSE_VALUE; } } else if (sysclk_cfg->sysclk_src == SYSCLK_SRC_PLL0DivClk) { //SYSCLK Source PLL0DivClk if (sysclk_cfg->pll0clk_src == PLLCLK_SRC_XOSC) { //PLL0 CLK Source HOSC if (!sysclk_cfg->pll0clk_src_freq) { //Hardware can AutoSwitch sysclk_cfg->pll0clk_src_freq = HSE_VALUE; } } else if (sysclk_cfg->pll0clk_src == PLLCLK_SRC_RC8M) { //PLL0 CLK Source RC8M sysclk_cfg->pll0clk_src_freq = HSI_VALUE; } } //Check APB0/APB1 Clock Div to be valid if (sysclk_cfg->apb0_clk_div == SYSCTRL_CLK_DIV_IVD) { sysclk_cfg->apb0_clk_div = SYSCTRL_CLK_DIV_1; } if (sysclk_cfg->apb1_clk_div == SYSCTRL_CLK_DIV_IVD) { sysclk_cfg->apb1_clk_div = SYSCTRL_CLK_DIV_1; } //Calculate SYSCLK division if (sysclk_cfg->sysclk_src != SYSCLK_SRC_PLL0DivClk) { sysclk_div = sysclk_cfg->sysclk_src_freq / sysclk_cfg->sysclk_freq; remain = sysclk_cfg->sysclk_src_freq % sysclk_cfg->sysclk_freq; if (!sysclk_div || remain) { LOG_E("Can't division %d SYSCLK from %d Source CLK!\n", sysclk_cfg->sysclk_freq, sysclk_cfg->sysclk_src_freq); return LL_ERROR; } } //SYSCTRL CTRL Register Unlock __LL_SYSCTRL_CTRLReg_Unlock(Instance); //Config SYSCLK switch (sysclk_cfg->sysclk_src) { case SYSCLK_SRC_RC32K: LOG_I("SYSCLK-[%d] source select RC32K.\n", sysclk_cfg->sysclk_freq); __LL_SYSCTRL_SysClkSrc_Set(Instance, SYSCTRL_SYSCLK_SRC_RC32K); __LL_SYSCTRL_SysClkDiv_Set(Instance, sysclk_div); ret = LL_OK; break; case SYSCLK_SRC_RC8M: LOG_I("SYSCLK-[%d] source select RC8M.\n", sysclk_cfg->sysclk_freq); __LL_SYSCTRL_RC8M_En(Instance); __LL_SYSCTRL_SysClkSrc_Set(Instance, SYSCTRL_SYSCLK_SRC_RC8M); __LL_SYSCTRL_SysClkDiv_Set(Instance, sysclk_div); ret = LL_OK; break; case SYSCLK_SRC_PLL0DivClk: //SYSCLK PLL0 Config pll0_cfg.pll_clk_src = sysclk_cfg->pll0clk_src; pll0_cfg.pll_in_freq = sysclk_cfg->pll0clk_src_freq; pll0_cfg.pll_user_freq = sysclk_cfg->sysclk_freq; ret = LL_SYSCTRL_Pll0Cfg(Instance, &pll0_cfg); //SYCTRL CTRL Reg Unlock because Pll0Cfg function has lock before return __LL_SYSCTRL_CTRLReg_Unlock(Instance); //SYSCLK Source Select PLL0DivClk, and SYSCLK Div set to default 1 if (ret == LL_OK) { LOG_I("SYSCLK-[%d] source select PLL0DivClk.\n", sysclk_cfg->sysclk_freq); __LL_SYSCTRL_SysClkSrc_Set(Instance, SYSCTRL_SYSCLK_SRC_PLLDivClk); __LL_SYSCTRL_SysClkDiv_Set(Instance, SYSCTRL_CLK_DIV_1); } break; case SYSCLK_SRC_HOSC: LOG_I("SYSCLK-[%d] source select HOSC-[%d].\n", sysclk_cfg->sysclk_freq, sysclk_cfg->sysclk_src_freq); LL_SYSCTRL_XOSCCfg(Instance); __LL_SYSCTRL_SysClkSrc_Set(Instance, SYSCTRL_SYSCLK_SRC_HOSC); __LL_SYSCTRL_SysClkDiv_Set(Instance, sysclk_div); ret = LL_OK; break; default: LOG_E("SYSCLK Source Select-[%d] Error!\n", sysclk_cfg->sysclk_src); ret = LL_ERROR; break; } if (ret == LL_OK) { //APB0/APB1 Clock Div Config __LL_SYSCTRL_APB0ClkDiv_Set(Instance, sysclk_cfg->apb0_clk_div); __LL_SYSCTRL_APB1ClkDiv_Set(Instance, sysclk_cfg->apb1_clk_div); //APB0/APB1/ABH0 Bus Clock Enable __LL_SYSCTRL_APB0Clk_En(Instance); __LL_SYSCTRL_APB1Clk_En(Instance); __LL_SYSCTRL_AHBClk_En(Instance); //APB0/APB1/ABH0 Soft Reset Release __LL_SYSCTRL_APB0BusSoftRst_Release(Instance); __LL_SYSCTRL_APB1BusSoftRst_Release(Instance); __LL_SYSCTRL_AHBBusSoftRst_Release(Instance); //RAM2/RAM1/RAM0 Bus Clock Enable __LL_SYSCTRL_RAM2BusClk_En(Instance); __LL_SYSCTRL_RAM1BusClk_En(Instance); __LL_SYSCTRL_RAM0BusClk_En(Instance); } //SYSCTRL Register Lock __LL_SYSCTRL_Reg_Lock(Instance); return ret; } /** * @brief SYSCTRL LL GPIOA Debounce Clock Config * @param src GPIOA Debounce Clock Source * @param div GPIOA Debounce Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_GPIOA_DbcClkCfg(SYSCTRL_GPIOADbcClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_256) { LOG_E("GPIOA Debounce CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOADbcSrc_Set(SYSCTRL, src); __LL_SYSCTRL_GPIOADbcClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL GPIOB Debounce Clock Config * @param src GPIOB Debounce Clock Source * @param div GPIOB Debounce Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_GPIOB_DbcClkCfg(SYSCTRL_GPIOBDbcClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_256) { LOG_E("GPIOB Debounce CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOBDbcSrc_Set(SYSCTRL, src); __LL_SYSCTRL_GPIOBDbcClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL GPIOC Debounce Clock Config * @param src GPIOC Debounce Clock Source * @param div GPIOC Debounce Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_GPIOC_DbcClkCfg(SYSCTRL_GPIOCDbcClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_256) { LOG_E("GPIOC Debounce CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOCDbcSrc_Set(SYSCTRL, src); __LL_SYSCTRL_GPIOCDbcClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL GPIOD Debounce Clock Config * @param src GPIOD Debounce Clock Source * @param div GPIOD Debounce Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_GPIOD_DbcClkCfg(SYSCTRL_GPIODDbcClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_256) { LOG_E("GPIOD Debounce CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIODDbcSrc_Set(SYSCTRL, src); __LL_SYSCTRL_GPIODDbcClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL DFLASH Clock Config * @param src DFLASH Clock Source * @param div DFLASH Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_DFLASH_ClkCfg(SYSCTRL_DflashClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_16) { LOG_E("DFLASH CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DFLASHMemClkSrc_Set(SYSCTRL, src); __LL_SYSCTRL_DFLASHMemClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL EFLASH Clock Config * @param src EFLASH Clock Source * @param div EFLASH Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_EFLASH_ClkCfg(SYSCTRL_EflashClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_16) { LOG_E("EFLASH CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_EFLASHMemClkSrc_Set(SYSCTRL, src); __LL_SYSCTRL_EFLASHMemClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL ADC Function Clock Config * @param src ADC Function Clock Source * @param div ADC Function Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_ADC_FuncClkCfg(SYSCTRL_ADCFuncClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_4) { LOG_E("ADC Function CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_ADCFunClkSrc_Set(SYSCTRL, src); __LL_SYSCTRL_ADCFunClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL HRPWM Function Clock Config * @param src HRPWM Function Clock Source * @param div HRPWM Function Clock Div * @return LL_StatusETypeDef */ LL_StatusETypeDef LL_SYSCTRL_HRPWM_FuncClkCfg(SYSCTRL_HRPWMFuncClkSrcETypeDef src, SYSCTRL_ClkDivETypeDef div) { if (div <= SYSCTRL_CLK_DIV_IVD || div > SYSCTRL_CLK_DIV_4) { LOG_E("HRPWM Function CLK div-[%d] config error!\n", div); return LL_ERROR; } __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_HRPWMFunClkSrc_Set(SYSCTRL, src); __LL_SYSCTRL_HRPWMFunClkDiv_Set(SYSCTRL, div); __LL_SYSCTRL_Reg_Lock(SYSCTRL); return LL_OK; } /** * @brief SYSCTRL LL SYSCLK freq get * @param None * @return SYSCLK freq */ uint32_t LL_SYSCTRL_SysclkGet(void) { return SystemCoreClock; } /** * @brief SYSCTRL LL AHB Clock freq get * @note AHB Clock is equal to SYSCLK * @param None * @return AHB Clock freq */ uint32_t LL_SYSCTRL_AHBClkGet(void) { return LL_SYSCTRL_SysclkGet(); } /** * @brief SYSCTRL LL APB0 Clock freq get * @note APB0 Clock is Div from AHB * @param None * @return APB0 Clock freq */ uint32_t LL_SYSCTRL_APB0ClkGet(void) { return LL_SYSCTRL_AHBClkGet() / __LL_SYSCTRL_APB0ClkDiv_Get(SYSCTRL); } /** * @brief SYSCTRL LL APB1 Clock freq get * @note APB1 Clock is Div from AHB * @param None * @return APB1 Clock freq */ uint32_t LL_SYSCTRL_APB1ClkGet(void) { return LL_SYSCTRL_AHBClkGet() / __LL_SYSCTRL_APB1ClkDiv_Get(SYSCTRL); } /** * @} */ /** @defgroup SYSCTRL_LL_Exported_Functions_Group2 SYSCTRL PLL Config Functions * @brief SYSCTRL PLL Config Functions * @{ */ /** * @brief SYSCTRL ll PLL0 Config * @param Instance Specifies SYSCTRL peripheral * @param pll0_cfg PLL0 Config Pointer * @return LL_StatusETypeDef Config Result */ LL_StatusETypeDef LL_SYSCTRL_Pll0Cfg(SYSCTRL_TypeDef *Instance, SYSCTRL_PLLUserCfgTypeDef *pll0_cfg) { uint8_t i, j; SYSCTRL_ClkDivETypeDef post_div = SYSCTRL_CLK_DIV_IVD; if (Instance == NULL || pll0_cfg == NULL) { LOG_E("PLL0 config params error!\n"); return LL_ERROR; } for (i = 0; i < ARRAY_SIZE(sysctrl_pll_cfg); i++) { if (sysctrl_pll_cfg[i].pll_in_freq == pll0_cfg->pll_in_freq) { for (j = 2; j <= 16; j++) { if ((sysctrl_pll_cfg[i].pll_out_freq / j) == pll0_cfg->pll_user_freq && \ !(sysctrl_pll_cfg[i].pll_out_freq % j)) { post_div = (SYSCTRL_ClkDivETypeDef)j; break; } } if (post_div != SYSCTRL_CLK_DIV_IVD) { break; } } } if (i == ARRAY_SIZE(sysctrl_pll_cfg)) { LOG_E("Don't match pll0_in_freq-[%d] to generate pll0_out_freq-[%d], please add the config to sysctrl_pll_cfg array!\n", \ pll0_cfg->pll_in_freq, pll0_cfg->pll_user_freq); return LL_ERROR; } //SYSCTRL CTRL Register Unlock __LL_SYSCTRL_CTRLReg_Unlock(Instance); switch (pll0_cfg->pll_clk_src) { case PLLCLK_SRC_XOSC: LL_SYSCTRL_XOSCCfg(Instance); LOG_I("PLL0 CLK Source Select XOSC.\n"); __LL_SYSCTRL_PLL0_RefClk_Set(Instance, SYSCTRL_PLL0_REFCLK_XOSC); break; case PLLCLK_SRC_RC8M: __LL_SYSCTRL_RC8M_En(Instance); LOG_I("PLL0 CLK Source Select RC8M.\n"); __LL_SYSCTRL_PLL0_RefClk_Set(Instance, SYSCTRL_PLL0_REFCLK_RC8M); break; case PLLCLK_SRC_DFT: LOG_I("PLL0 CLK Source Select DFT.\n"); __LL_SYSCTRL_PLL0_RefClk_Set(Instance, SYSCTRL_PLL0_REFCLK_DFT); break; default: LOG_E("PLL0 CLK Source Select-[%d] Error!\n", pll0_cfg->pll_clk_src); return LL_ERROR; } //PLL0 Pre-Div Config if (sysctrl_pll_cfg[i].pll_pre_div == SYSCTRL_CLK_DIV_1) { __LL_SYSCTRL_PLL0_PreDiv_1(Instance); } else if (sysctrl_pll_cfg[i].pll_pre_div == SYSCTRL_CLK_DIV_2) { __LL_SYSCTRL_PLL0_PreDiv_2(Instance); } else { LOG_E("PLL0 Pre-Div Config-[%d] Error!\n", sysctrl_pll_cfg[i].pll_pre_div); } //PLL0 Div Config if (post_div >= SYSCTRL_CLK_DIV_2 && post_div <= SYSCTRL_CLK_DIV_16) { __LL_SYSCTRL_PLL0_DIV_Set(Instance, post_div); } else { LOG_E("PLL0 Post Div Config-[%d] Error!\n", post_div); } //FPLL0 integer/fraction Config & Enable & Start LL_FPLL_DivStart(FPLL0, sysctrl_pll_cfg[i].fpll_int, sysctrl_pll_cfg[i].fpll_frac); //PLL0 VCO Band and Gain Config and Enable __LL_SYSCTRL_PLL0_Band_Set(Instance, sysctrl_pll_cfg[i].pll_vco_band); __LL_SYSCTRL_PLL0_GVCO_Set(Instance, sysctrl_pll_cfg[i].pll_vco_gain); __LL_SYSCTRL_PLL0_En(Instance); //Wait for PLL0 Lock LOG_D("Wait for PLL0 lock output\n"); while (!__LL_SYSCTRL_PLL0_IsLocked(Instance)) ; LOG_D("PLL0 lock Success\n"); //SYSCTRL Register Lock __LL_SYSCTRL_Reg_Lock(Instance); return LL_OK; } /** * @brief SYSCTRL ll PLL1 Config * @note PLL1 don't config post-div, which is used for ADC/HRPWM module generally * @param Instance Specifies SYSCTRL peripheral * @param pll1_cfg PLL1 Config Pointer * @return LL_StatusETypeDef Config Result */ LL_StatusETypeDef LL_SYSCTRL_Pll1Cfg(SYSCTRL_TypeDef *Instance, SYSCTRL_PLLUserCfgTypeDef *pll1_cfg) { uint8_t i; if (Instance == NULL || pll1_cfg == NULL) { LOG_E("PLL1 config params error!\n"); return LL_ERROR; } for (i = 0; i < ARRAY_SIZE(sysctrl_pll_cfg); i++) { if (sysctrl_pll_cfg[i].pll_in_freq == pll1_cfg->pll_in_freq && \ sysctrl_pll_cfg[i].pll_out_freq == pll1_cfg->pll_user_freq) { break; } } if (i == ARRAY_SIZE(sysctrl_pll_cfg)) { LOG_E("Don't match pll1_in_freq-[%d] to generate pll1_out_freq-[%d], please add the config to sysctrl_pll_cfg array!\n", \ pll1_cfg->pll_in_freq, pll1_cfg->pll_user_freq); return LL_ERROR; } //SYSCTRL CTRL Register Unlock __LL_SYSCTRL_CTRLReg_Unlock(Instance); switch (pll1_cfg->pll_clk_src) { case PLLCLK_SRC_XOSC: LL_SYSCTRL_XOSCCfg(Instance); LOG_I("PLL1 CLK Source Select XOSC.\n"); __LL_SYSCTRL_PLL1_RefClk_Set(Instance, SYSCTRL_PLL1_REFCLK_XOSC); break; case PLLCLK_SRC_RC8M: __LL_SYSCTRL_RC8M_En(Instance); LOG_I("PLL1 CLK Source Select RC8M.\n"); __LL_SYSCTRL_PLL1_RefClk_Set(Instance, SYSCTRL_PLL1_REFCLK_RC8M); break; case PLLCLK_SRC_DFT: LOG_I("PLL1 CLK Source Select DFT.\n"); __LL_SYSCTRL_PLL1_RefClk_Set(Instance, SYSCTRL_PLL1_REFCLK_DFT); break; default: LOG_E("PLL1 CLK Source Select-[%d] Error!\n", pll1_cfg->pll_clk_src); return LL_ERROR; } //PLL1 Pre-Div Config if (sysctrl_pll_cfg[i].pll_pre_div == SYSCTRL_CLK_DIV_1) { __LL_SYSCTRL_PLL1_PreDiv_1(Instance); } else if (sysctrl_pll_cfg[i].pll_pre_div == SYSCTRL_CLK_DIV_2) { __LL_SYSCTRL_PLL1_PreDiv_2(Instance); } else { LOG_E("PLL1 Pre-Div Config-[%d] Error!\n", sysctrl_pll_cfg[i].pll_pre_div); } //FPLL1 integer/fraction Config & Enable & Start LL_FPLL_DivStart(FPLL1, sysctrl_pll_cfg[i].fpll_int, sysctrl_pll_cfg[i].fpll_frac); //PLL1 VCO Band and Gain Config and Enable __LL_SYSCTRL_PLL1_Band_Set(Instance, sysctrl_pll_cfg[i].pll_vco_band); __LL_SYSCTRL_PLL1_GVCO_Set(Instance, sysctrl_pll_cfg[i].pll_vco_gain); __LL_SYSCTRL_PLL1_En(Instance); //Wait for PLL1 Lock LOG_D("Wait for PLL1 lock output\n"); while (!__LL_SYSCTRL_PLL1_IsLocked(Instance)) ; LOG_D("PLL1 lock Success\n"); //SYSCTRL Register Lock __LL_SYSCTRL_Reg_Lock(Instance); return LL_OK; } /** * @brief SYSCTRL ll PLL2 Config * @param Instance Specifies SYSCTRL peripheral * @param pll2_cfg PLL2 Config Pointer * @return LL_StatusETypeDef Config Result */ LL_StatusETypeDef LL_SYSCTRL_Pll2Cfg(SYSCTRL_TypeDef *Instance, SYSCTRL_PLLUserCfgTypeDef *pll2_cfg) { uint8_t i, j; SYSCTRL_ClkDivETypeDef post_div = SYSCTRL_CLK_DIV_IVD; if (Instance == NULL || pll2_cfg == NULL) { LOG_E("PLL2 config params error!\n"); return LL_ERROR; } for (i = 0; i < ARRAY_SIZE(sysctrl_pll_cfg); i++) { if (sysctrl_pll_cfg[i].pll_in_freq == pll2_cfg->pll_in_freq) { for (j = 2; j <= 16; j++) { if ((sysctrl_pll_cfg[i].pll_out_freq / j) == pll2_cfg->pll_user_freq && !(sysctrl_pll_cfg[i].pll_out_freq % j)) { post_div = (SYSCTRL_ClkDivETypeDef)j; break; } } if (post_div != SYSCTRL_CLK_DIV_IVD) { break; } } } if (i == ARRAY_SIZE(sysctrl_pll_cfg)) { LOG_E("Don't match pll2_in_freq-[%d] to generate pll2_out_freq-[%d], please add the config to sysctrl_pll_cfg array!\n", \ pll2_cfg->pll_in_freq, pll2_cfg->pll_user_freq); return LL_ERROR; } //SYSCTRL CTRL Register Unlock __LL_SYSCTRL_CTRLReg_Unlock(Instance); switch (pll2_cfg->pll_clk_src) { case PLLCLK_SRC_XOSC: LL_SYSCTRL_XOSCCfg(Instance); LOG_I("PLL2 CLK Source Select XOSC.\n"); __LL_SYSCTRL_PLL2_RefClk_Set(Instance, SYSCTRL_PLL2_REFCLK_XOSC); break; case PLLCLK_SRC_RC8M: __LL_SYSCTRL_RC8M_En(Instance); LOG_I("PLL2 CLK Source Select RC8M.\n"); __LL_SYSCTRL_PLL2_RefClk_Set(Instance, SYSCTRL_PLL2_REFCLK_RC8M); break; case PLLCLK_SRC_DFT: LOG_I("PLL2 CLK Source Select DFT.\n"); __LL_SYSCTRL_PLL2_RefClk_Set(Instance, SYSCTRL_PLL2_REFCLK_DFT); break; default: LOG_E("PLL2 CLK Source Select-[%d] Error!\n", pll2_cfg->pll_clk_src); return LL_ERROR; } //PLL2 Pre-Div Config if (sysctrl_pll_cfg[i].pll_pre_div == SYSCTRL_CLK_DIV_1) { __LL_SYSCTRL_PLL2_PreDiv_1(Instance); } else if (sysctrl_pll_cfg[i].pll_pre_div == SYSCTRL_CLK_DIV_2) { __LL_SYSCTRL_PLL2_PreDiv_2(Instance); } else { LOG_E("PLL2 Pre-Div Config-[%d] Error!\n", sysctrl_pll_cfg[i].pll_pre_div); } //PLL2 Div Config if (post_div >= SYSCTRL_CLK_DIV_2 && post_div <= SYSCTRL_CLK_DIV_16) { __LL_SYSCTRL_PLL2_DIV_Set(Instance, post_div); } else { LOG_E("PLL2 Post Div Config-[%d] Error!\n", post_div); } //FPLL2 integer/fraction Config & Enable & Start LL_FPLL_DivStart(FPLL2, sysctrl_pll_cfg[i].fpll_int, sysctrl_pll_cfg[i].fpll_frac); //PLL2 VCO Band and Gain Config and Enable __LL_SYSCTRL_PLL2_Band_Set(Instance, sysctrl_pll_cfg[i].pll_vco_band); __LL_SYSCTRL_PLL2_GVCO_Set(Instance, sysctrl_pll_cfg[i].pll_vco_gain); __LL_SYSCTRL_PLL2_En(Instance); //Wait for PLL2 Lock LOG_D("Wait for PLL2 lock output\n"); while (!__LL_SYSCTRL_PLL2_IsLocked(Instance)) ; LOG_D("PLL2 lock Success\n"); //SYSCTRL Register Lock __LL_SYSCTRL_Reg_Lock(Instance); return LL_OK; } /** * @} */ /** @defgroup SYSCTRL_LL_Exported_Functions_Group3 SYSCTRL Peripherals Clock and Reset control Functions * @brief SYSCTRL Peripherals Clock and Reset control Functions * @{ */ /** * @brief SYSCTRL LSTIMER Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_LSTMR_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_LSTIMERBusClk_En(SYSCTRL); __LL_SYSCTRL_LSTIMERSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL LSTIMER Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_LSTMR_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_LSTIMERBusClk_Dis(SYSCTRL); __LL_SYSCTRL_LSTIMERSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL Uart1 Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_UART1_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_UART1BusClk_En(SYSCTRL); __LL_SYSCTRL_UART1SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL Uart1 Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_UART1_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_UART1BusClk_Dis(SYSCTRL); __LL_SYSCTRL_UART1SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL Uart0 Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_UART0_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_UART0BusClk_En(SYSCTRL); __LL_SYSCTRL_UART0SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL Uart0 Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_UART0_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_UART0BusClk_Dis(SYSCTRL); __LL_SYSCTRL_UART0SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL I2C1 Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_I2C1_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_I2C1BusClk_En(SYSCTRL); __LL_SYSCTRL_I2C1SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL I2C1 Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_I2C1_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_I2C1BusClk_Dis(SYSCTRL); __LL_SYSCTRL_I2C1SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL I2C0 Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_I2C0_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_I2C0BusClk_En(SYSCTRL); __LL_SYSCTRL_I2C0SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL I2C0 Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_I2C0_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_I2C0BusClk_Dis(SYSCTRL); __LL_SYSCTRL_I2C0SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL ECU Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_ECU_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_ECUBusClk_En(SYSCTRL); __LL_SYSCTRL_ECUFunClk_En(SYSCTRL); __LL_SYSCTRL_ECUSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL ECU Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_ECU_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_ECUBusClk_Dis(SYSCTRL); __LL_SYSCTRL_ECUFunClk_Dis(SYSCTRL); __LL_SYSCTRL_ECUSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR4 Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_IIR4_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR4BusClk_En(SYSCTRL); __LL_SYSCTRL_IIR4FunClk_En(SYSCTRL); __LL_SYSCTRL_IIR4SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR4 Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_IIR4_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR4BusClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR4FunClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR4SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR3 Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_IIR3_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR3BusClk_En(SYSCTRL); __LL_SYSCTRL_IIR3FunClk_En(SYSCTRL); __LL_SYSCTRL_IIR3SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR3 Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_IIR3_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR3BusClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR3FunClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR3SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR2 Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_IIR2_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR2BusClk_En(SYSCTRL); __LL_SYSCTRL_IIR2FunClk_En(SYSCTRL); __LL_SYSCTRL_IIR2SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR2 Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_IIR2_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR2BusClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR2FunClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR2SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR1 Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_IIR1_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR1BusClk_En(SYSCTRL); __LL_SYSCTRL_IIR1FunClk_En(SYSCTRL); __LL_SYSCTRL_IIR1SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR1 Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_IIR1_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR1BusClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR1FunClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR1SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR0 Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_IIR0_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR0BusClk_En(SYSCTRL); __LL_SYSCTRL_IIR0FunClk_En(SYSCTRL); __LL_SYSCTRL_IIR0SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL IIR0 Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_IIR0_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_IIR0BusClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR0FunClk_Dis(SYSCTRL); __LL_SYSCTRL_IIR0SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DALI Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_DALI_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DALIBusClk_En(SYSCTRL); __LL_SYSCTRL_DALISoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DALI Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_DALI_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DALIBusClk_Dis(SYSCTRL); __LL_SYSCTRL_DALISoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL FPLL2 Reset Release * @param None * @return None */ void LL_SYSCTRL_FPLL2_RstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_FPLL2SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL FPLL2 Reset Assert * @param None * @return None */ void LL_SYSCTRL_FPLL2_RstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_FPLL2SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL FPLL1 Reset Release * @param None * @return None */ void LL_SYSCTRL_FPLL1_RstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_FPLL1SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL FPLL1 Reset Assert * @param None * @return None */ void LL_SYSCTRL_FPLL1_RstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_FPLL1SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL FPLL0 Reset Release * @param None * @return None */ void LL_SYSCTRL_FPLL0_RstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_FPLL0SoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL FPLL0 Reset Assert * @param None * @return None */ void LL_SYSCTRL_FPLL0_RstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_FPLL0SoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL USB Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_USB_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_USBBusClk_En(SYSCTRL); __LL_SYSCTRL_USBFunClk_En(SYSCTRL); __LL_SYSCTRL_USBSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL USB Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_USB_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_USBBusClk_Dis(SYSCTRL); __LL_SYSCTRL_USBFunClk_Dis(SYSCTRL); __LL_SYSCTRL_USBSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DFLASH Bus&Memory Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_DFLASH_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DFLASHBusClk_En(SYSCTRL); __LL_SYSCTRL_DFLASHMemClk_En(SYSCTRL); __LL_SYSCTRL_DFLASHSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DFLASH Bus&Memory Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_DFLASH_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DFLASHBusClk_Dis(SYSCTRL); __LL_SYSCTRL_DFLASHMemClk_Dis(SYSCTRL); __LL_SYSCTRL_DFLASHSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL EFLASH Bus&Memory Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_EFLASH_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_EFLASHBusClk_En(SYSCTRL); __LL_SYSCTRL_EFLASHMemClk_En(SYSCTRL); __LL_SYSCTRL_EFLASHSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL EFLASH Bus&Memory Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_EFLASH_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_EFLASHBusClk_Dis(SYSCTRL); __LL_SYSCTRL_EFLASHMemClk_Dis(SYSCTRL); __LL_SYSCTRL_EFLASHSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL HRPWM Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_HRPWM_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_HRPWMBusClk_En(SYSCTRL); __LL_SYSCTRL_HRPWMFunClk_En(SYSCTRL); __LL_SYSCTRL_HRPWMSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL HRPWM Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_HRPWM_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_HRPWMBusClk_Dis(SYSCTRL); __LL_SYSCTRL_HRPWMFunClk_Dis(SYSCTRL); __LL_SYSCTRL_HRPWMSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL ADC Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_ADC_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_ADCBusClk_En(SYSCTRL); __LL_SYSCTRL_ADCFunClk_En(SYSCTRL); __LL_SYSCTRL_ADCSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL ADC Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_ADC_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_ADCBusClk_Dis(SYSCTRL); __LL_SYSCTRL_ADCFunClk_Dis(SYSCTRL); __LL_SYSCTRL_ADCSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DAC Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_DAC_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DACBusClk_En(SYSCTRL); __LL_SYSCTRL_DACSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DAC Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_DAC_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DACBusClk_Dis(SYSCTRL); __LL_SYSCTRL_DACSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL CMP Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_CMP_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_CMPBusClk_En(SYSCTRL); __LL_SYSCTRL_CMPSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL CMP Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_CMP_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_CMPBusClk_Dis(SYSCTRL); __LL_SYSCTRL_CMPSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOD Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_GPIOD_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIODBusClk_En(SYSCTRL); __LL_SYSCTRL_GPIODSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOD Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_GPIOD_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIODBusClk_Dis(SYSCTRL); __LL_SYSCTRL_GPIODSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOC Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_GPIOC_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOCBusClk_En(SYSCTRL); __LL_SYSCTRL_GPIOCSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOC Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_GPIOC_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOCBusClk_Dis(SYSCTRL); __LL_SYSCTRL_GPIOCSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOB Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_GPIOB_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOBBusClk_En(SYSCTRL); __LL_SYSCTRL_GPIOBSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOB Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_GPIOB_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOBBusClk_Dis(SYSCTRL); __LL_SYSCTRL_GPIOBSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOA Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_GPIOA_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOABusClk_En(SYSCTRL); __LL_SYSCTRL_GPIOASoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL GPIOA Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_GPIOA_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_GPIOABusClk_Dis(SYSCTRL); __LL_SYSCTRL_GPIOASoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL HSTIMER Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_HSTMR_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_HSTIMERBusClk_En(SYSCTRL); __LL_SYSCTRL_HSTIMERSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL HSTIMER Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_HSTMR_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_HSTIMERBusClk_Dis(SYSCTRL); __LL_SYSCTRL_HSTIMERSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL CAN Bus&Function Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_CAN_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_CANBusClk_En(SYSCTRL); __LL_SYSCTRL_CANFunClk_En(SYSCTRL); __LL_SYSCTRL_CANSoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL CAN Bus&Function Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_CAN_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_CANBusClk_Dis(SYSCTRL); __LL_SYSCTRL_CANFunClk_Dis(SYSCTRL); __LL_SYSCTRL_CANSoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DMA Bus Clock Enable and Reset Release * @param None * @return None */ void LL_SYSCTRL_DMA_ClkEnRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DMABusClk_En(SYSCTRL); __LL_SYSCTRL_DMASoftRst_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL DMA Bus Clock Disable and Reset Assert * @param None * @return None */ void LL_SYSCTRL_DMA_ClkDisRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_DMABusClk_Dis(SYSCTRL); __LL_SYSCTRL_DMASoftRst_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL LL all peripheral reset assert * @note All peripheral include system bus(AHB/APB0/APB1) * @param None * @return None */ void LL_SYSCTRL_AllPeriphRstAssert(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_SysSoftRstAll_Assert(SYSCTRL); __LL_SYSCTRL_APB0SoftRstAll_Assert(SYSCTRL); __LL_SYSCTRL_APB1SoftRstAll_Assert(SYSCTRL); __LL_SYSCTRL_AHBSoftRstAll_Assert(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @brief SYSCTRL LL all peripheral reset release * @note All peripheral include system bus(AHB/APB0/APB1) * @param None * @return None */ void LL_SYSCTRL_AllPeriphRstRelease(void) { __LL_SYSCTRL_CTRLReg_Unlock(SYSCTRL); __LL_SYSCTRL_SysSoftRstAll_Release(SYSCTRL); __LL_SYSCTRL_APB0SoftRstAll_Release(SYSCTRL); __LL_SYSCTRL_APB1SoftRstAll_Release(SYSCTRL); __LL_SYSCTRL_AHBSoftRstAll_Release(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @} */ /** @defgroup SYSCTRL_LL_Exported_Functions_Group4 SYSCTRL Misc Config Functions * @brief SYSCTRL Misc Config Functions * @{ */ /** * @brief SYSCTRL LL PMU Config * @param None * @return None */ void LL_SYSCTRL_PMUCfg(void) { __LL_SYSCTRL_FLSReg_Unlock(SYSCTRL); __LL_SYSCTRL_CUR_RES_Set(SYSCTRL, 0); __LL_SYSCTRL_BGR_DRD_Dis(SYSCTRL); __LL_SYSCTRL_BGR_Filter_En(SYSCTRL); __LL_SYSCTRL_Reg_Lock(SYSCTRL); } /** * @} */ /** * @} */ /* Private functions ---------------------------------------------------------*/ /** @addtogroup SYSCTRL_LL_Private_Functions * @{ */ /** * @brief SYSCTRL LL XOSC Config * @param Instance Specifies SYSCTRL peripheral * @note Must unlock SYSCTRL CTRL Reg before call this function * @return None */ static void LL_SYSCTRL_XOSCCfg(SYSCTRL_TypeDef *Instance) { //Check SYSCTRL CTRL Reg unlock or not if (!__LL_SYSCTRL_IsCTRLRegUnlock(Instance)) { LOG_E("SYSCTRL CTRL Reg is Lock, please unlock it before call this function!\n"); return; } __LL_SYSCTRL_XOSC_En(Instance); } /** * @} */ /** * @} */ /** * @} */ /************************* (C) COPYRIGHT Tai-Action *****END OF FILE***********/