MCU微課堂
CKS32K148 SCG(二)
第四十九期 2024.12.6
六、SCG時(shí)鐘工作頻率范圍
接第四十五期的SCG介紹,下文對(duì)SCG時(shí)鐘工作頻率范圍、寄存器設(shè)置等進(jìn)行詳細(xì)闡述。
在不同的工作模式下,系統(tǒng)對(duì)于不同的內(nèi)部時(shí)鐘存在安全工作頻率范圍的限制,以保證系統(tǒng)的正常工作。下表為SCG內(nèi)部時(shí)鐘在不同工作模式下的安全工作頻率范圍匯總。
表1 SCG內(nèi)部時(shí)鐘安全工作頻率
七、SCG寄存器配置
在前文中,已經(jīng)對(duì)SCG時(shí)鐘進(jìn)行了整體介紹,下面以RUN模式下配置SPLL為系統(tǒng)時(shí)鐘源為例,對(duì)時(shí)鐘配置的具體方法進(jìn)行講解。
圖5 SYSCLK生成流程
在RUN模式下選擇SPLL作為系統(tǒng)時(shí)鐘源時(shí),應(yīng)對(duì)SPLL時(shí)鐘進(jìn)行相關(guān)使能操作,同時(shí)應(yīng)保證SPLL的輸出信號(hào)頻率在正常工作頻率90~160MHz范圍內(nèi)。在對(duì)SPLL的配置中,有兩個(gè)較為重要的寄存器,分別是SCG_SPLLCSR和SCG_SPLLCFG。
圖6 SCG_SPLLCSR寄存器
在SCG_SPLLCSR寄存器中,我們應(yīng)重點(diǎn)關(guān)注如下幾位:
圖7 SPLL系統(tǒng)時(shí)鐘選擇與有效位
圖8 SPLL時(shí)鐘使能位
圖9 SCG_SPLLCFG寄存器
在SCG_SPLLCFG寄存器中,我們應(yīng)關(guān)注如下兩位:
圖10 SPLL倍頻系數(shù)位
圖11 SPLL分頻系數(shù)位
可知,SPLL對(duì)參考時(shí)鐘信號(hào)能夠進(jìn)行16~47倍頻和最大8分頻。
由于SPLL以SOSC作為參考時(shí)鐘源,還應(yīng)在寄存器SCG_SOSCCSR中對(duì)SOSC時(shí)鐘使能。
圖12 SCG_SOSCCSR寄存器
SCG_SOSCCSR寄存器中,SOSC時(shí)鐘使能的相關(guān)位如下:
圖13 SOSC時(shí)鐘有效位
圖14 SOSC時(shí)鐘使能位
在完成上述時(shí)鐘配置后,在寄存器SCG_RCCR中配置RUN模式下的系統(tǒng)時(shí)鐘源。
圖15 SCG_RCCR寄存器
圖16 系統(tǒng)時(shí)鐘源選擇位
除SPLL時(shí)鐘外,還應(yīng)保證生成的內(nèi)部時(shí)鐘SYS_CLK、BUS_CLK和FLASH_CLK工作在安全頻率范圍內(nèi)。下圖為系統(tǒng)時(shí)鐘源信號(hào)(紫色)生成內(nèi)部時(shí)鐘信號(hào)的流程圖。
圖17 內(nèi)部時(shí)鐘生成流程
生成的內(nèi)部時(shí)鐘信號(hào)頻率由寄存器SCG_RCCR中如下相關(guān)位調(diào)控:
圖18 內(nèi)核時(shí)鐘分頻位
圖19 總線時(shí)鐘分頻位
圖20 FLASH時(shí)鐘分頻位
八、SCG結(jié)構(gòu)體初始化
在標(biāo)準(zhǔn)庫中,所有時(shí)鐘的初始化均可通過CLOCK_DRV_Init()實(shí)現(xiàn):
CLOCK_DRV_Init(&clockMan1_InitConfig0);
其中使用的參數(shù)結(jié)構(gòu)體指針clockMan1_InitConfig0,其結(jié)構(gòu)體類型為clock_manager_user_config_t,結(jié)構(gòu)體定義如下:
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相關(guān)時(shí)鐘的配置僅需在第一個(gè)成員結(jié)構(gòu)體scgConfig中進(jìn)行,對(duì)于其余的成員結(jié)構(gòu)體的使用本文中將不進(jìn)行介紹。
SCG的初始化結(jié)構(gòu)體類型為scg_config_t,下面是相關(guān)結(jié)構(gòu)體的定義:
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;
在本文中,我們需要使用上述結(jié)構(gòu)體中的成員結(jié)構(gòu)體soscConfig、spllConfig以及clockModeConfig完成對(duì)內(nèi)部時(shí)鐘輸出的配置。
對(duì)于SOSC時(shí)鐘,初始化結(jié)構(gòu)體類型為scg_sosc_config_t,結(jié)構(gòu)體定義如下:
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;
該結(jié)構(gòu)體中共有11個(gè)成員變量,我們僅需配置其中的第1、4、5和11號(hào)變量即可完成對(duì)SOSC時(shí)鐘的使能,其功能分別如下:
變量一freq:應(yīng)配置為當(dāng)前SOSC使用的時(shí)鐘源頻率。
變量四gain:用于控制晶振操作的功耗模式,可選高增益或低增益。
變量五range:用于為OSC選擇頻率范圍,作為SPLL的時(shí)鐘源,本文中SOSC只能選擇高頻率范圍。
變量十一initialize:用于對(duì)SOSC時(shí)鐘進(jìn)行使能,決定了時(shí)鐘是否有效。
對(duì)于SPLL時(shí)鐘,初始化結(jié)構(gòu)體類型為scg_spll_config_t,結(jié)構(gòu)體定義如下:
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;
該結(jié)構(gòu)體中共有9個(gè)成員變量,我們需配置其中的第2、3、4和9號(hào)變量以完成對(duì)SPLL時(shí)鐘的使能以及輸出頻率調(diào)控,其功能分別如下:
變量二prediv:用于配置SPLL參考時(shí)鐘頻率的分頻系數(shù)。
變量三mult:用于配置SPLL參考時(shí)鐘頻率的乘法因子。
變量四src:用于配置SPLL的輸入時(shí)鐘源,在本文中僅能選擇參考時(shí)鐘SOSC作為時(shí)鐘源。
變量九initialize:用于對(duì)SPLL時(shí)鐘進(jìn)行使能,決定了時(shí)鐘是否有效。
對(duì)于RUN模式下的內(nèi)部時(shí)鐘配置,初始化結(jié)構(gòu)體類型為scg_system_clock_config_t,結(jié)構(gòu)體定義如下:
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;
該結(jié)構(gòu)體中共有4個(gè)成員變量,其功能分別如下:
變量一divSlow:用于控制FLASH時(shí)鐘分頻比。
變量二divBus:用于控制總線時(shí)鐘分頻比。
變量三divCore:用于控制內(nèi)核時(shí)鐘分頻比。
變量四src:用于在運(yùn)行模式下,選擇產(chǎn)生系統(tǒng)時(shí)鐘的時(shí)鐘源。
九、時(shí)鐘配置代碼
依據(jù)前文中對(duì)寄存器與SCG時(shí)鐘結(jié)構(gòu)體的基本介紹,即可在函數(shù)CLOCK_DRV_Init()中對(duì)系統(tǒng)時(shí)鐘進(jìn)行相關(guān)配置。本文以SPLL為時(shí)鐘源,配置輸出56MHz的SYSCLK、28MHz的BUSCLK以及14MHz的FLASHCLK。相關(guān)結(jié)構(gòu)體代碼如下:
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
+關(guān)注
關(guān)注
146文章
17148瀏覽量
351181 -
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120348 -
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1733瀏覽量
131478
原文標(biāo)題:MCU微課堂|CKS32K148 SCG(二)
文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論