MCU微課堂
CKS32K148 SCG(二)
第四十九期 2024.12.6
六、SCG時鐘工作頻率范圍
接第四十五期的SCG介紹,下文對SCG時鐘工作頻率范圍、寄存器設置等進行詳細闡述。
在不同的工作模式下,系統(tǒng)對于不同的內部時鐘存在安全工作頻率范圍的限制,以保證系統(tǒng)的正常工作。下表為SCG內部時鐘在不同工作模式下的安全工作頻率范圍匯總。
表1 SCG內部時鐘安全工作頻率
七、SCG寄存器配置
在前文中,已經對SCG時鐘進行了整體介紹,下面以RUN模式下配置SPLL為系統(tǒng)時鐘源為例,對時鐘配置的具體方法進行講解。
圖5 SYSCLK生成流程
在RUN模式下選擇SPLL作為系統(tǒng)時鐘源時,應對SPLL時鐘進行相關使能操作,同時應保證SPLL的輸出信號頻率在正常工作頻率90~160MHz范圍內。在對SPLL的配置中,有兩個較為重要的寄存器,分別是SCG_SPLLCSR和SCG_SPLLCFG。
圖6 SCG_SPLLCSR寄存器
在SCG_SPLLCSR寄存器中,我們應重點關注如下幾位:
圖7 SPLL系統(tǒng)時鐘選擇與有效位
圖8 SPLL時鐘使能位
圖9 SCG_SPLLCFG寄存器
在SCG_SPLLCFG寄存器中,我們應關注如下兩位:
圖10 SPLL倍頻系數位
圖11 SPLL分頻系數位
可知,SPLL對參考時鐘信號能夠進行16~47倍頻和最大8分頻。
由于SPLL以SOSC作為參考時鐘源,還應在寄存器SCG_SOSCCSR中對SOSC時鐘使能。
圖12 SCG_SOSCCSR寄存器
SCG_SOSCCSR寄存器中,SOSC時鐘使能的相關位如下:
圖13 SOSC時鐘有效位
圖14 SOSC時鐘使能位
在完成上述時鐘配置后,在寄存器SCG_RCCR中配置RUN模式下的系統(tǒng)時鐘源。
圖15 SCG_RCCR寄存器
圖16 系統(tǒng)時鐘源選擇位
除SPLL時鐘外,還應保證生成的內部時鐘SYS_CLK、BUS_CLK和FLASH_CLK工作在安全頻率范圍內。下圖為系統(tǒng)時鐘源信號(紫色)生成內部時鐘信號的流程圖。
圖17 內部時鐘生成流程
生成的內部時鐘信號頻率由寄存器SCG_RCCR中如下相關位調控:
圖18 內核時鐘分頻位
圖19 總線時鐘分頻位
圖20 FLASH時鐘分頻位
八、SCG結構體初始化
在標準庫中,所有時鐘的初始化均可通過CLOCK_DRV_Init()實現(xiàn):
CLOCK_DRV_Init(&clockMan1_InitConfig0);
其中使用的參數結構體指針clockMan1_InitConfig0,其結構體類型為clock_manager_user_config_t,結構體定義如下:
typedef struct
{
scg_config_t scgConfig; /*!< SCG Clock configuration. ?????*/
sim_clock_config_t simConfig; /*!< SIM Clock configuration. ?????*/
pcc_config_t pccConfig; /*!< PCC Clock configuration. ?????*/
pmc_config_t pmcConfig; /*!< PMC Clock configuration. ?????*/
} clock_manager_user_config_t;
需要注意的是,由于SCG相關時鐘的配置僅需在第一個成員結構體scgConfig中進行,對于其余的成員結構體的使用本文中將不進行介紹。
SCG的初始化結構體類型為scg_config_t,下面是相關結構體的定義:
typedef struct
{
scg_sirc_config_t sircConfig; /*!< Slow internal reference clock configuration.*/
scg_firc_config_t fircConfig; /*!< Fast internal reference clock configuration. */
scg_sosc_config_t soscConfig; /*!< System oscillator configuration. ???????*/
scg_spll_config_t spllConfig; /*!< System Phase locked loop configuration. ?*/
scg_rtc_config_t rtcConfig; /*!< Real Time Clock configuration. ????????*/
scg_clockout_config_t clockOutConfig; /*!< SCG ClockOut Configuration. ??????????*/
scg_clock_mode_config_t clockModeConfig; /*!< SCG Clock Mode Configuration. ???????*/
} scg_config_t;
在本文中,我們需要使用上述結構體中的成員結構體soscConfig、spllConfig以及clockModeConfig完成對內部時鐘輸出的配置。
對于SOSC時鐘,初始化結構體類型為scg_sosc_config_t,結構體定義如下:
typedef struct
{
uint32_t freq; /*!< System OSC frequency. ?*/
scg_sosc_monitor_mode_t monitorMode; /*!< System OSC Clock monitor mode. ?*/
scg_sosc_ext_ref_t extRef; /*!< System OSC External Reference Select.*/
scg_sosc_gain_t gain; /*!< System OSC high-gain operation. */
scg_sosc_range_t range; /*!< System OSC frequency range. ?*/
scg_async_clock_div_t div1; /*!< Asynchronous peripheral source. ?*/
scg_async_clock_div_t div2; /*!< Asynchronous peripheral source. ?*/
bool enableInStop; /*!< System OSC is enable or not in stop mode. */
bool enableInLowPower; /*!< System OSC is enable or not in low power mode.*/
bool locked; /*!< System OSC Control Register can be written. */
bool initialize; /*!< Initialize or not the System OSC module.*/
} scg_sosc_config_t;
該結構體中共有11個成員變量,我們僅需配置其中的第1、4、5和11號變量即可完成對SOSC時鐘的使能,其功能分別如下:
變量一freq:應配置為當前SOSC使用的時鐘源頻率。
變量四gain:用于控制晶振操作的功耗模式,可選高增益或低增益。
變量五range:用于為OSC選擇頻率范圍,作為SPLL的時鐘源,本文中SOSC只能選擇高頻率范圍。
變量十一initialize:用于對SOSC時鐘進行使能,決定了時鐘是否有效。
對于SPLL時鐘,初始化結構體類型為scg_spll_config_t,結構體定義如下:
typedef struct
{
scg_spll_monitor_mode_t monitorMode; /*!< Clock monitor mode selected. ?*/
uint8_t prediv; /*!< PLL reference clock divider. ?*/
uint8_t mult; /*!< System PLL multiplier. ?*/
uint8_t src; /*!< System PLL source. ?*/
scg_async_clock_div_t div1; /*!< Asynchronous peripheral source.*/
scg_async_clock_div_t div2; /*!< Asynchronous peripheral source.*/
bool enableInStop; /*!< System PLL clock is enable or not in stop mode. */
bool locked; /*!< System PLL Control Register can be written. */
bool initialize; /*!< Initialize or not the System PLL module. */
} scg_spll_config_t;
該結構體中共有9個成員變量,我們需配置其中的第2、3、4和9號變量以完成對SPLL時鐘的使能以及輸出頻率調控,其功能分別如下:
變量二prediv:用于配置SPLL參考時鐘頻率的分頻系數。
變量三mult:用于配置SPLL參考時鐘頻率的乘法因子。
變量四src:用于配置SPLL的輸入時鐘源,在本文中僅能選擇參考時鐘SOSC作為時鐘源。
變量九initialize:用于對SPLL時鐘進行使能,決定了時鐘是否有效。
對于RUN模式下的內部時鐘配置,初始化結構體類型為scg_system_clock_config_t,結構體定義如下:
typedef struct
{
scg_system_clock_div_t divSlow; /*!< Slow clock divider. */
scg_system_clock_div_t divBus; /*!< BUS clock divider.*/
scg_system_clock_div_t divCore; /*!< Core clock divider. */
scg_system_clock_src_t src; /*!< System clock source. */
} scg_system_clock_config_t;
該結構體中共有4個成員變量,其功能分別如下:
變量一divSlow:用于控制FLASH時鐘分頻比。
變量二divBus:用于控制總線時鐘分頻比。
變量三divCore:用于控制內核時鐘分頻比。
變量四src:用于在運行模式下,選擇產生系統(tǒng)時鐘的時鐘源。
九、時鐘配置代碼
依據前文中對寄存器與SCG時鐘結構體的基本介紹,即可在函數CLOCK_DRV_Init()中對系統(tǒng)時鐘進行相關配置。本文以SPLL為時鐘源,配置輸出56MHz的SYSCLK、28MHz的BUSCLK以及14MHz的FLASHCLK。相關結構體代碼如下:
clock_manager_user_config_t clockMan1_InitConfig0 =
{
.scgConfig =
{
.soscConfig =
{
.initialize = true,
.freq = 8000000U, /* System Oscillator frequency: 8MHz */
.extRef = SCG_SOSC_REF_OSC, /* Internal oscillator of OSC requested. */
.range = SCG_SOSC_RANGE_HIGH, /* High frequency range selected for the crystal oscillator of 8 MHz to 40 MHz. */
},
.spllConfig =
{
.initialize = true,
.prediv = (uint8_t)SCG_SPLL_CLOCK_PREDIV_BY_1,/* Divided by 1 */
.mult = (uint8_t)SCG_SPLL_CLOCK_MULTIPLY_BY_28,/* Multiply Factor is 28*/
.src = 0U,/*Clock Source SOSC*/
},
.clockModeConfig =
{
.initialize = true,
.rccrConfig =
{
.src = SCG_SYSTEM_CLOCK_SRC_SYS_PLL,/* System PLL */
.divCore = SCG_SYSTEM_CLOCK_DIV_BY_2,/* Core Clock Divider: divided by 2 */
.divBus = SCG_SYSTEM_CLOCK_DIV_BY_2,/* Bus Clock Divider: divided by 2 */
.divSlow = SCG_SYSTEM_CLOCK_DIV_BY_4,/* Slow Clock Divider: divided by 4 */
},
}
}
};
-
mcu
+關注
關注
146文章
17123瀏覽量
350973 -
寄存器
+關注
關注
31文章
5336瀏覽量
120224 -
時鐘
+關注
關注
10文章
1733瀏覽量
131446
原文標題:MCU微課堂|CKS32K148 SCG(二)
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論