SCG

相关阅读:MCU微课堂 | CKS32K148 SCG(一)

六、SCG寄存器配置

在前文中,已经对SCG时钟进行了整体介绍,下面以RUN模式下配置SPLL为系统时钟源为例,对时钟配置的具体方法进行讲解。

1.png

图5 SYSCLK生成流程

在RUN模式下选择SPLL作为系统时钟源时,应对SPLL时钟进行相关使能操作,同时应保证SPLL的输出信号频率在正常工作频率90~160MHz范围内。在对SPLL的配置中,有两个较为重要的寄存器,分别是SCG_SPLLCSR和SCG_SPLLCFG。

2.png

图6 SCG_SPLLCSR寄存器

在SCG_SPLLCSR寄存器中,我们应重点关注如下几位:

3.png

图7 SPLL系统时钟选择与有效位

4.png

图8 SPLL时钟使能位

5.png

图9 SCG_SPLLCFG寄存器

在SCG_SPLLCFG寄存器中,我们应关注如下两位:

6.png

图10 SPLL倍频系数位

7.png

图11 SPLL分频系数位

可知,SPLL对参考时钟信号能够进行16~47倍频和最大8分频。

由于SPLL以SOSC作为参考时钟源,还应在寄存器SCG_SOSCCSR中对SOSC时钟使能。

8.png

图12 SCG_SOSCCSR寄存器

SCG_SOSCCSR寄存器中,SOSC时钟使能的相关位如下:

9.png

图13 SOSC时钟有效位

10.png

图14 SOSC时钟使能位

在完成上述时钟配置后,在寄存器SCG_RCCR中配置RUN模式下的系统时钟源。

11.png

图15 SCG_RCCR寄存器

12.png

图16 系统时钟源选择位

除SPLL时钟外,还应保证生成的内部时钟SYS_CLK、BUS_CLK和FLASH_CLK工作在安全频率范围内。下图为系统时钟源信号(紫色)生成内部时钟信号的流程图。

13.png

图17 内部时钟生成流程

生成的内部时钟信号频率由寄存器SCG_RCCR中如下相关位调控:

14.png

图18 内核时钟分频位

15.png

图19 总线时钟分频位

16.png

图20 FLASH时钟分频位

七、SCG结构体初始化

在标准库中,所有时钟的初始化均可通过CLOCK_DRV_Init()实现:

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:用于在运行模式下,选择产生系统时钟的时钟源。

八、时钟配置代码

依据前文中对寄存器与SCG时钟结构体的基本介绍,即可在函数CLOCK_DRV_Init()中对系统时钟进行相关配置。本文以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

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 5

一、SCG简介

系统时钟发生器(SCG)是MCU中的重要模块,它能够为芯片提供多个灵活的时钟源,并支持各种时钟输出选项,实现对芯片内部各个模块的时钟供应。CKS32K148的时钟生成电路提供了各种时钟分频器和选择器,允许不同的模块以该模块特定的频率运行,而时钟生成逻辑实现了可以独立关闭的模块特定时钟门控,从而能够优化芯片性能以满足低功耗的需求。本文将围绕CKS32K148的SCG模块展开介绍,以帮助用户对系统时钟的生成与使用进行了解。

二、时钟树

对于CKS32K148,SCG模块包含四个可用作MCU系统时钟源的可选时钟:

  • 内部快参考时钟(FIRC)

  • 内部慢参考时钟(SIRC)

  • 系统晶振时钟(SOSC)

  • 系统锁相环(SPLL)

其中,SOSC可由内部晶振或外部参考时钟产生,而SPLL由SOSC参考时钟倍频后产生。系统时钟源将用于为内核、总线和FLASH提供时钟,除此之外,上述四种时钟在经过可编程分频器后输出的时钟信号可为外设提供时钟。

下图为CKS32K148的时钟树,其中灰色区域为系统时钟发生器(SCG)模块。

1.png

图1  CKS32K148时钟树

1、FIRC时钟

内部快参考时钟(FIRC)是芯片内部产生的频率为48MHz的时钟,它能够提供高频稳定的内部时钟信号,可作为MCU系统时钟源,也可作为其他片上外设的时钟源。FIRC有两个可编程分频器FIRCDIV1_CLK和FIRCDIV2_CLK,分频器的时钟输出也可作为异步时钟源应用于部分外设模块。

FIRC的使能由寄存器(SCG_FIRCCSR)中的标志位FIRCEN、FIRCVLD和FIRCREGOGG共同控制,只有在这些标志位均正确置位且FIRC模拟模块有一个时钟输出时,FIRC时钟有效。需要注意的是,若FIRCEN在时钟切换期间被写,则写指令执行前,应该先读回和确认。

2、SIRC时钟

内部慢参考时钟(SIRC)是芯片内部产生的频率为8MHz的时钟,它能够提供低频稳定的内部时钟信号,通常用于作为低功耗模式下的系统以及其他片上外设的时钟源。SIRC同样有两个可编程分频器SIRCDIV1_CLK和SIRCDIV2_CLK,其时钟输出可作为异步时钟源应用于部分外设模块。需要注意的是,对于部分需要高频时序控制和高速接口的外设,SIRC无法作为时钟源对其进行同步和控制,在使用这些模块时应注意时钟源的选择。

SIRC的使能由寄存器(SCG_FIRCCSR)中的标志位SIRCEN和SIRCVLD共同控制,只有在这些标志位均置‘1’时,SIRC时钟有效。若SIRCEN在时钟切换期间被写入同样应先读回和确认。除通用情况下的使能,在低功耗模式和停止模式下,SIRC的使能由标志位SIRCLPEN和SIRCSTEN分别控制。

3、SOSC时钟

系统晶振时钟(SOSC)是由内部晶振或外部参考时钟产生的频率为4-40MHz的时钟,它能够提供精确稳定的时钟信号,通常用于为SPLL提供时钟信号,也可直接作为系统以及其他片上外设的时钟源。SOSC的可编程分频器为SOSCDIV1_CLK和SOSCDIV2_CLK,输出信号可用于作为外设异步时钟源。SOSC时钟源支持两档频率范围,可以通过寄存器(SCG_SOSCCFG)中的标志位RANGE来选择,‘10’对应中频范围4MHz至8MHz,‘11’对应高频范围8MHz至40MHz。

SOSC时钟源的选择可通过寄存器(SCG_SOSCCFG)中标志位 EREFS控制,置‘1’时使用的是内部OSC晶振,置‘0’时使用的是外部参考时钟。通常情况下,SOSC选用内部OSC晶振来作为时钟源,但需要注意的是,与内部参考时钟不同,这里的内部晶振信号并非在芯片内部直接产生,而是通过外接晶体振荡器的方式将时钟信号输入SOSC的xtal。而当选择外部参考时钟作为时钟源时,允许使用外部晶振、陶瓷谐振器或信号发生器等多种方式来产生外部参考时钟,生成的外部参考时钟信号通过连接OSC_IN引脚输入extal。

2.png

图2  SOSC时钟生成

SOSC的使能由寄存器(SCG_SOSCCSR)中的标志位SOSCEN和SOSCVLD共同控制,在这些标志位均置‘1’,并经过4096 个时钟周期计数后,SOSC被视为有效。若SOSCEN在时钟切换期间被写入,应先读回和确认。

4、SPLL时钟

系统锁相环(SPLL)的内部由压控分频器、相位/频率检测器和整数循环滤波模块构成,它以SOSC作为参考时钟,通过对参考时钟信号的倍频和同步,提供了高精度、高稳定性和频率可调的时钟信号,是实现高性能、高稳定性系统的重要时钟源。SPLL通常作为MCU系统时钟源使用,也可作为其他片上外设的时钟源。它的两个可编程分频器分别为SPLLDIV1_CLK和SPLLDIV2_CLK,分频器的时钟输出可作为异步时钟源应用于部分外设模块。

对于SPLL的输出时钟频率,可根据下式计算获得:

SPLL_CLK = (VCO_CLK)/2

VCO_CLK = SOSC_CLK/(PREDIV + 1) *(MULT + 16)

其中,PREDIV和MULT的值可在寄存器(SCG_SPLLCFG)中的相应标志位处进行配置。

3.png

图3  SPLL时钟生成

SPLL的使能由寄存器(SCG_SPLLCSR)中的标志位SPLLEN和SPLLVLD共同控制,只有在这些标志位均置‘1’时,SPLL被视为有效。需要注意的是,虽然SPLL有自己的时钟错误标志位SPLLERR,但由于SPLL以SOSC为参考时钟,当寄存器(SCG_SOSCCFG)中的标志位SOSCERR已经置位时,即使SPLL时钟出现错误,SPLLERR将不会置位。同时,若程序检测到出现OSC 时钟错误(SOSCCSR[SOSCERR]),SPLLVLD位将被清零。

除此之外,SPLLVLD位仅适用与在初始化后验证SPLL是否被锁,其工作原理是通过一个锁检测电路来完成锁检测,以三个连续采样时钟检测的结果判断该时钟是否有效。当SPLL频率超出参考范围(见数据手册中的Dunl)时,将生成参考时钟的三个连续未被锁定样本,可判断为SPLL失锁,SPLLVLD位将被清零。

三、时钟输出(MCO)

SCG模块可输出到外部MCO引脚的时钟信号可分为两类。一类是在寄存器(SCG_CLKOUTCNFG)中通过标志位CLKOUTSEL控制的输出信号,能够以SCGCLKOUT_CLK的形式被选择输出到MCO引脚的时钟源信号:

  • FIRC_CLK

  • SIRC_CLK

  • SOSC_CLK

  • SPLL_CLK

另一类是在寄存器(SIM_CHIPCTL)中通过标志位CLKOUTSEL选择的输出信号,可直接输出到MCO引脚,包括:

  • 内核时钟(CORE_CLK)

  • 总线时钟(BUS_CLK)

  • 外设时钟:SPLLDIV2_CLK、FIRCDIV1_CLK、FIRCDIV2_CLK、SIRCDIV2_CLK、SOSCDIV1_CLK、SOSCDIV2_CLK

输出上述时钟信号时,相应的GPIO端口寄存器必须被复用为CLKOUT功能。

四、系统时钟(SYSCLK)选择

在前文中提到,SCG中包含四种可作为系统时钟源的可选时钟,但需要注意,在不同的系统工作模式下,并非所有的时钟都可作为系统时钟源。

在RUN模式下,可使用SPLL或SCG参考时钟(SIRC,FIRC和SOSC)作为MCU系统时钟源;在HSRUN模式下,可使用SPLL或FIRC作为MCU系统时钟源;在VLPRUN模式下,仅可使用SIRC作为MCU系统时钟源。

上述不同模式下的时钟源选择由寄存器(SCG_xCCR)中的标志位SCS控制。同时,被选择的时钟源需在自身对应的(SCG_xxxxCSR)寄存器中将标志位xxxxSEL置‘1’,才可被视为有效时钟源。

下图为SCG有效模式切换图,概括了不同模式下可使用的系统时钟源以及不同模式之间的切换关系。

4.png

图4 SCG有效模式切换图

五、SCG时钟工作频率范围

在不同的工作模式下,系统对于不同的内部时钟存在安全工作频率范围的限制,以保证系统的正常工作。下表为SCG内部时钟在不同工作模式下的安全工作频率范围汇总。

表1  SCG内部时钟安全工作频率

5.png

SCG寄存器配置以及相关示例请期待下期微课堂,感谢大家!

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 16
订阅 RSS - SCG