基于Flagchip FC7300对SCG时钟配置的介绍

简介

本文对时系统时钟发生器(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 / 张傲

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论