简介
本文对时系统时钟发生器(SCG)模块进行介绍,对 SCG 不同时钟的来源及参数配置进行了介绍,并参照 FC7300 GPIO_TOGGLE DEMO 程序中的时钟配置进行简要的解析。
一、 SCG框图介绍
1.1、 SCG 模块框图:
▲ 图 1.1 图片来自 FC7300 Reference Manual V3.0附件FC7300 Clocking Diagram V1.0
▲ 图 1.2 图片来自 FC7300 Reference Manual V3.0 附件 FC7300 Clocking Diagram V1.0
SCG 模块包含两个锁相环 PLL0/ PLL1,2 个低速内部参考时钟 SIRC 12MHZ和SIRC 32KHZ,低速振荡器时钟 SOSC 32KHZ 和高速振荡器时钟 FIRC 96M HZ,PLL0/PLL1 由 FOSC 时钟或 FIRC 48 MHZ时钟提供。SCG 可以选择 PLL0,FOSC 或 FIRC 作为 MCU 系统时钟的来源。SCG 还支持晶体振荡器的操作,允许外部晶体或外部时钟源产生外部参考时钟。
- SCG 时钟配置范围:
- SIRC (32KHZ) , SOSC ( 32KHZ)。
- SIRC (12MHZ):SIRC- DIVH/ SIRC- DIVM /SIRC- DIVL≤12MHZ。
- FIRC (96MHZ): FIRC-DIVH≤96MHZ FIRC-DIVM≤96MHZ FIRC-DIVL≤48MHZ。
- FOSC (16MHZ-40MHZ):FOSC-DIVH/FOSC-DIVM/FOSC-DIVL≤ 40MHZ。
- PLL0/PLL1(300MHZ-800MHZ):PLL0/PLL1-DIVH & PLL0/PLL1-DIVM≤150MHZ ,PLL0/PLL1-DIVL≤75MHZ。
2.1 Demo 函数概述
- EnableFOSC 函数:在程序中对 FOSC-DIVH、FOSC-DIVM、FOSC-DIVL 时钟不同的分频系数进行配置,使能了 FOSC 时钟 24MHZ,并得到了 FOSC-DIVH、FOSC-DIVM、FOSC-DIVL时钟相应的值。
SCG_FoscType tFoscStruct =
{
.bLock = false,
.bCm = false,
.bCmre = false,
.bSten = false,
.bBypass = false,
.eDivH = SCG_ASYNCCLOCKDIV_BY1, //1分频 FOSC-DIVH = 24MHZ
.eDivM = SCG_ASYNCCLOCKDIV_BY1, //1分频 FOSC-DIVM = 24MHZ
.eDivL = SCG_ASYNCCLOCKDIV_BY2, //2分频 FOSC-DIVHL= 12MHZ
};
SCG_EnableFOSC(&tFoscStruct); //使能FOSC 时钟 24MHZ
- SCG_EnablePLL函数:在程序中选择时钟源 FOSC,选择了 PLL 时钟为 PLL0,对 PLL0-DIVH、PLL0-DIVM、PLL0-DIVL 时钟不同的分频系数进行配置,使能了 PLL0 时钟为 300 MHZ,并得到了 PLL0-DIVH、PLL0-DIVM、PLL0-DIVL 时钟相应的值。
SCG_PllType tPll0Struct =
{
.bLock = false,
.bCm = false,
.bCmre = false,
.bSten = false,
.eDivH = SCG_ASYNCCLOCKDIV_BY2, //2分频 PLL0-DIVH = 150MHZ
.eDivM = SCG_ASYNCCLOCKDIV_BY2, //2分频 PLL0-DIVM = 150MHZ
.eDivL = SCG_ASYNCCLOCKDIV_BY4, //4分频 PLL0-DIVL = 75MHZ
.u8Prediv = 11U, //FOSC 11分频
.ePstDiv = SCG_PLLPSTDIV_BY2, //FOSC 2分频
.u16Mult = 299U, //FOSC 299倍频
.eSrc = SCG_PLLSOURCE_FOSC //PLL 钟源选自FOSC时钟
};
SCG_EnablePLL(SCG_PLL0, &tPll0Struct); //使能 PLL0 时钟 300MHZ
- SCG_EnablePLL 函数:在程序中选择时钟源 FOSC,选择了 PLL 时钟为 PLL1,对 PLL1-DIVH、PLL1-DIVM、PLL1-DIVL 时钟不同的分频系数进行配置,使能了 PLL1 时钟为 240 MHZ,并得到了 PLL1-DIVH、PLL1-DIVM、PLL1-DIVL 时钟相应的值。
SCG_PllType tPll1Struct =
{
.bLock = false,
.bCm = false,
.bCmre = false,
.bSten = false,
.eDivH = SCG_ASYNCCLOCKDIV_BY2, //2分频 PLL1-DIVH = 120MHZ
.eDivM = SCG_ASYNCCLOCKDIV_BY2, //2分频 PLL1-DIVM = 120MHZ
.eDivL = SCG_ASYNCCLOCKDIV_BY4, //4分频 PLL1-DIVL = 60MHZ
.u8Prediv = 11U, //FOSC 11分频
.ePstDiv = SCG_PLLPSTDIV_BY2, //FOSC 2分频
.u16Mult = 239U, //FOSC 239倍频
.eSrc = SCG_PLLSOURCE_FOSC //PLL 钟源选自FOSC时钟
};
SCG_EnablePLL(SCG_PLL1, &tPll1Struct); //使能 PLL1 时钟 240MHZ
- SCG_SetSIRC函数:在程序中选择 SIRC 12MHZ 为时钟源,对 SIRC-DIVH、SIRC-DIVM、SIRC-DIVL 时钟不同的分频系数进行配置,使能了 SIRC 时钟,并并得到了 SIRC-DIVH、SIRC-DIVM、SIRC-DIVL 时钟相应的值。
SCG_SircType tSircStruct =
{
.bLock = false,
.bCm = false,
.bTrEn = false,
.bLpen = false,
.bSten = false,
.eDivH = SCG_ASYNCCLOCKDIV_BY1, //1分频 SIRC-DIVH =12MHZ
.eDivM = SCG_ASYNCCLOCKDIV_BY1, //1分频 SIRC-DIVM =12MHZ
.eDivL = SCG_ASYNCCLOCKDIV_BY2, //2分频 SIRC-DIVL =6MHZ
.u8TrimSrc = 0U
};
SCG_SetSIRC(&tSircStruct); //SIRC 时钟参数配置 12MHZ
- SCG_SetClkCtrl 函数:在程序中选择 PLL0 为时钟源,对 Slow-CLK、Bus-CLK、Core-CLK 时钟不同的分频系数进行配置,并得到了 Slow-CLK、Bus-CLK、Core-CLK 时钟相应的值。
SCG_ClockCtrlType tClockStruct =
{
.bSysClkMonitor = false,
.eSrc = SCG_CLOCK_SRC_PLL0, //选择PLL0时钟源
.eDivSlow = SCG_CLOCK_DIV_BY4, //75MHZ
.eDivBus = SCG_CLOCK_DIV_BY2, // 150MHZ
.eDivCore = SCG_CLOCK_DIV_BY1 //300MHZ
};
SCG_SetClkCtrl(&tClockStruct); //时钟参数配置
三、总结
综上介绍了基于 Flagchip FC7300 SCG 时钟模块进行了介绍,介绍了 FOSC、PLL0、PLL1、SIRC、FIRC 不同时钟源的选择,介绍了不同时钟源对应的 DIVH、DIVM、DIVL 预分频系数的配置且得到的其 DIVH、DIVM、DIVL 时钟的频率,并以 FC7300 GPIO_TOGGLE DEMO 时钟配置程序为例子进行简要的解析。关于详细 SCG 时钟模块介绍及参数配置,请参考 FC7300 Reference Manual V3.0 用户手册及 FC7300_SDK_V_0_2_0 SDK 包中的 FC7300 GPIO_TOGGLE DEMO 程序。
四、参考文献
(1) FC7300 Reference Manual V3.0
(2) FC7300_SDK_V_0_2_0
欢迎在博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com
作者:Jim Zhang / 张傲
评论