216 lines
7.1 KiB
C
216 lines
7.1 KiB
C
#include "Clock.h"
|
||
|
||
|
||
/* ################################################################################## */
|
||
/* ################################### Type define ################################## */
|
||
|
||
/* PCBA external oscillator value, these macro is user defined. */
|
||
/* FOSC/SOSC clock need to manually configuration according to PCBA XTAL value
|
||
* in SOSC/FOSc configuration.
|
||
* Current default value is the XTAL value on EVB board. */
|
||
|
||
|
||
/* ################################################################################## */
|
||
/* ########################### Local Prototype Functions ############################ */
|
||
static void Bsp_SCG_Init(void);
|
||
|
||
static void Bsp_PCC_Init(void);
|
||
|
||
/* ################################################################################## */
|
||
/* ################################ Local Functions ################################# */
|
||
|
||
|
||
/**
|
||
* @brief Local SCG initial
|
||
*
|
||
*/
|
||
|
||
// Ядро процессора: 240 МГц
|
||
// Системная шина: 120 МГц
|
||
// Медленная периферия: 120 МГц
|
||
// PLL0/PLL1: 240 МГц
|
||
// FOSC: 24 МГц
|
||
// SIRC: 12 МГц
|
||
|
||
static void Bsp_SCG_Init(void) {
|
||
|
||
SCG_Deinit();
|
||
|
||
/* Enable FOSC, frequency is 24M, DIVH=DIV1(24M), DIVM=DIV1(24M), DIVL=DIV2(12M)*/
|
||
// FOSC - Внешний кварцевый генератор (Базовый источник 24 МГц)
|
||
SCG_FoscType tFoscStruct =
|
||
{
|
||
.bLock = false,
|
||
.bCm = false,
|
||
.bCmre = false,
|
||
.bSten = false,
|
||
.bBypass = false,
|
||
.eDivH = SCG_ASYNCCLOCKDIV_BY1,
|
||
.eDivM = SCG_ASYNCCLOCKDIV_BY1,
|
||
.eDivL = SCG_ASYNCCLOCKDIV_BY2,
|
||
};
|
||
SCG_EnableFOSC(&tFoscStruct);
|
||
|
||
/* Enable PLL0, frequency is 240M, DIVH=DIV2(120M), DIVM=DIV2(120M), DIVL=DIV4(60M), src=FOSC*/
|
||
/* The value of multiplier factor(FOSC/u8Prediv) between 2 ~ 4 is better*/
|
||
|
||
// FOSC = 24 МГц
|
||
// После предделителя: 24 МГц / (11 + 1) = 24 МГц / 12 = 2 МГц
|
||
// После умножения: 2 МГц × (239 + 1) = 2 МГц × 240 = 480 МГц
|
||
// После постделителя: 480 МГц / 2 = 240 МГц
|
||
|
||
SCG_PllType tPll0Struct =
|
||
{
|
||
.bLock = false,
|
||
.bCm = false,
|
||
.bCmre = false,
|
||
.bSten = false,
|
||
.eDivH = SCG_ASYNCCLOCKDIV_BY2,
|
||
.eDivM = SCG_ASYNCCLOCKDIV_BY2,
|
||
.eDivL = SCG_ASYNCCLOCKDIV_BY4,
|
||
.u8Prediv = 11U,
|
||
.ePstDiv = SCG_PLLPSTDIV_BY2,
|
||
.u16Mult = 239U,
|
||
.eSrc = SCG_PLLSOURCE_FOSC
|
||
};
|
||
SCG_EnablePLL(SCG_PLL0, &tPll0Struct);
|
||
|
||
/* Enable PLL1, frequency is 240M, DIVH=DIV2(120M), DIVM=DIV2(120M), DIVL=DIV4(60M), src=FOSC*/
|
||
/* The value of multiplier factor(FOSC/u8Prediv) between 2 ~ 4 is better*/
|
||
|
||
// Аналогична PLL0, также 240 МГц
|
||
// Обычно используется для периферии
|
||
|
||
SCG_PllType tPll1Struct =
|
||
{
|
||
.bLock = false,
|
||
.bCm = false,
|
||
.bCmre = false,
|
||
.bSten = false,
|
||
.eDivH = SCG_ASYNCCLOCKDIV_BY2,
|
||
.eDivM = SCG_ASYNCCLOCKDIV_BY2,
|
||
.eDivL = SCG_ASYNCCLOCKDIV_BY4,
|
||
.u8Prediv = 11U,
|
||
.ePstDiv = SCG_PLLPSTDIV_BY2,
|
||
.u16Mult = 239U,
|
||
.eSrc = SCG_PLLSOURCE_FOSC
|
||
};
|
||
SCG_EnablePLL(SCG_PLL1, &tPll1Struct);
|
||
|
||
/* Enable SIRC DIV, DIVH=DIV1(12M), DIVM=DIV1(12M), DIVL=DIV2(6M) */
|
||
// Резервный источник тактирования
|
||
// Меньшая точность, но быстрый запуск
|
||
|
||
SCG_SircType tSircStruct =
|
||
{
|
||
.bLock = false,
|
||
.bCm = false,
|
||
.bTrEn = false,
|
||
.bLpen = false,
|
||
.bSten = false,
|
||
.eDivH = SCG_ASYNCCLOCKDIV_BY1,
|
||
.eDivM = SCG_ASYNCCLOCKDIV_BY1,
|
||
.eDivL = SCG_ASYNCCLOCKDIV_BY2,
|
||
.u8TrimSrc = 0U
|
||
};
|
||
SCG_SetSIRC(&tSircStruct);
|
||
|
||
/* Set core clock source from PLL0, DIV_CORE=DIV1(240M), DIV_BUS=DIV2(120M), DIV_SLOW=DIV4(60M)*/
|
||
// Системное тактирование
|
||
|
||
//.eSrc = PLL0, // Источник - PLL0 (240 МГц)
|
||
//.eDivCore = DIV1, // Ядро: 240 МГц
|
||
//.eDivBus = DIV2, // Шина: 120 МГц
|
||
//.eDivSlow = DIV2 // Медленная периферия: 120 МГц
|
||
|
||
SCG_ClockCtrlType tClockStruct =
|
||
{
|
||
.bSysClkMonitor = false,
|
||
.eSrc = SCG_CLOCK_SRC_PLL0,
|
||
.eDivSlow = SCG_CLOCK_DIV_BY2,
|
||
.eDivBus = SCG_CLOCK_DIV_BY2,
|
||
.eDivCore = SCG_CLOCK_DIV_BY1
|
||
};
|
||
SCG_SetClkCtrl(&tClockStruct);
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief Local PCC Initial
|
||
*
|
||
*/
|
||
static void Bsp_PCC_Init(void) {
|
||
PCC_CtrlType bSP_PCC_Config;
|
||
|
||
// UART 2
|
||
bSP_PCC_Config.eClockName = PCC_CLK_FCUART2;
|
||
bSP_PCC_Config.bEn = true;
|
||
bSP_PCC_Config.eClkSrc = PCC_CLKGATE_SRC_FOSCDIV;
|
||
bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED;
|
||
|
||
PCC_SetPcc(&bSP_PCC_Config);
|
||
|
||
// DMA 0
|
||
bSP_PCC_Config.eClockName = PCC_CLK_DMA0;
|
||
bSP_PCC_Config.bEn = true;
|
||
bSP_PCC_Config.eClkSrc = PCC_CLKGATE_SRC_FOSCDIV;
|
||
bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED;
|
||
|
||
PCC_SetPcc(&bSP_PCC_Config);
|
||
|
||
// DMAMUX 0
|
||
bSP_PCC_Config.eClockName = PCC_CLK_DMAMUX0;
|
||
bSP_PCC_Config.bEn = true;
|
||
bSP_PCC_Config.eClkSrc = PCC_CLKGATE_SRC_FOSCDIV;
|
||
bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED;
|
||
|
||
PCC_SetPcc(&bSP_PCC_Config);
|
||
|
||
bSP_PCC_Config.eClockName = PCC_CLK_WKU0;
|
||
bSP_PCC_Config.bEn = true;
|
||
bSP_PCC_Config.eClkSrc = PCC_CLKGATE_UNINVOLVED;
|
||
bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED;
|
||
PCC_SetPcc(&bSP_PCC_Config);
|
||
}
|
||
|
||
void Bsp_Systick_Init(void)
|
||
{
|
||
uint32_t u32ReloadVal;
|
||
uint32_t SystemCoreClock;
|
||
|
||
SystemCoreClock = SCG_GetScgClockFreq(SCG_CORE_CLK);
|
||
while(SystemCoreClock == 0){};
|
||
u32ReloadVal = SystemCoreClock / 1000;
|
||
Core_SysTick_Config(u32ReloadVal);
|
||
NVIC_SetPriority(SysTick_IRQn, 0);
|
||
Core_SysTick_Enable();
|
||
}
|
||
|
||
|
||
/* ################################################################################## */
|
||
/* ################################# Global Functions ############################### */
|
||
|
||
|
||
/**
|
||
* @brief General Clock Initial
|
||
*
|
||
*/
|
||
void Bsp_CLOCK_Init(void) {
|
||
CSC0_ClkoutType tCSCClkOutCfg = {0};
|
||
|
||
/* Configure CSC(clock out configuration) */
|
||
tCSCClkOutCfg.bEnable = true;
|
||
tCSCClkOutCfg.eClkOutSrc = CSC0_CLKOUT_BUS_CLK;
|
||
tCSCClkOutCfg.eDivider = CSC0_CLKOUT_DIV_BY4;
|
||
|
||
SCG_Deinit();
|
||
Bsp_SCG_Init();
|
||
Bsp_PCC_Init();
|
||
|
||
/* Set clock out */
|
||
SCG_SetClkOut(SCG_CLOCKOUT_SRC_FOSC);
|
||
CSC0_SetClockOut(&tCSCClkOutCfg, false);
|
||
|
||
Bsp_Systick_Init();
|
||
}
|