CRG (时钟复位模块)

简介

CRG全称为时钟复位模块(Clock and Reset Generator),该模块主要为芯片提供时钟及复位管理功能。 时钟模块包含外部时钟源,内部时钟源,PLL, 分频器,时钟门控,时钟丢失检测,时钟频偏检测等。

ET6001 时钟源包含:

  • 外部高速时钟源 HSXO 25MHz

  • 内部高速时钟源 HSOSC 25MHz

  • 外部低速时钟源 LSXO 32.768KHz

  • 内部低速时钟源 LSOSC 256KHz

复位包含外部管脚复位,POR复位,WDG复位,全局软复位和CPU全局复位,外部复位支持滤毛刺功能。ET6001 大部分模块支持单独模块复位。

功能概述

  • 支持外部时钟源HSXO和HSOSC选择

  • 支持PLL的倍频和分频设置

  • 支持各模块时钟门控和复位控制

  • 支持时钟丢失检测

  • 支持时钟频偏检测

  • 支持芯片复位设置

  • 支持各总线时钟频率获取

  • 支持各总线分频系数配置

时钟树简单架构

系统时钟软件配置流程

  1. 确定PLL时钟源 - 选择外部时钟源HSXO或内部时钟源HSOSC 枚举类型:

    • CRG_PLL_SOURCE_HSXO :外部时钟源HSXO

    • CRG_PLL_SOURCE_HSOSC :内部时钟源HSOSC

  2. 确定PLL倍频和分频系数

    PLL输出FOUT时钟频率为:

    \[FOUTPOSTDIV = F_{in} / REFDIV * FBDIV / POSTDIV1 / POSTDIV2\]

    FOUT2 时钟频率为:

    \[FOUT2 = FOUTPOSTDIV / 2 / 2\]

    FOUT3 时钟频率为:

    \[FOUT3 = FOUTPOSTDIV / 2 / 3\]

    使能PLLBYPASS后, PLL输出FOUT时钟频率为:

    \[FOUTPOSTDIV = F_{in}\]
  3. 设置是是否使能PLL FOUTPOSTDIV BYPASS

    • 不使能BYPASS, PLL的最终输出为FOUT2和FOUT3

    • 使能BYPASS, PLL的最终输出为FOUTPOSTDIV

  4. 设置各总线时钟频率

    总线时钟分频由结构体 CRG_ClockConfigParam 进行配置, 除CANCLK和ADCCLK外, 其他时钟分频只支持 偶数 分频。

    • CPUCLKDivider : CPUCLK分频系数

    • BUSCLKDivider : BUSCLK分频系数

    • APBCLKDivider : APBCLK分频系数

    • APB3CLKDivider :APB3CLK分频系数

    • EFCCLKDivider : EFCCLK分频系数

    • CANCLKDivider : CANCLK分频系数

    • ADDACLKDivider :ADCCLK分频系数

    • AESCLKDivider : AESCLK分频系数

5.设置系统时钟源
  • 通过函数 CRG_setClockOutSource() 设置系统时钟配置

    • CRG_CLKSRC_OSC25M

      系统时钟由内部时钟源HSOSC提供, 芯片上电后默认由此时钟源提供

    • CRG_CLKSRC_PLL_FOUT

      系统时钟由PLL输出FOUT或FOUT2/3提供

重要

  1. 系统上电后默认由内部时钟源HSOSC提供

  2. BOOTROM会自动将系统时钟切换到PLL

  3. 用户如果使用非25MHz晶振,需要修改 system_et6x.c 中的宏定义值 HSXO_VALUEPLLFBDIV

  4. 修改CRG模块的配置,需要先解锁CRG模块的锁定寄存器

时钟配置代码说明

// 1. 定义PLL配置参数  PLLFOUT = 25MHz * 32 / 1 / 4  = 200MHz
const static CRG_PLLConfigParam pllInit =
{
    CRG_PLL_SOURCE_HSXO, // 使用外部时钟源HSXO
    CRG_PLL_ON,          // 开启PLL
    0x20,                // PLLFBDiv
    0x00,                // PLLFrac
    0x01,                // PLLPostDiv1
    0x04,                // PLLPostDiv2
    0x01,                // PLLRefDiv
    0x01,                // PLL的最终输出为FOUTPOSTDIV
};
// 2. 定义时钟配置参数, 配置值为 分频值 - 1
const static CRG_ClockConfigParam clkInit =
{
    0x00,              // CPUCLKDivider         //200M
    0x00,              // BUSCLKDivider         //200M
    0x01,              // APBCLKDivider         //100M
    0x01,              // APB3CLKDivider        //100M
    0x03,              // EFCCLKDivider         //50M
    0x04,              // CANCLKDivider         //40M
    0x02,              // ADDACLKDivider        //66.67M
    0x01,              // AESCLKDivider         //100M
    0x00,              // CANCLKSrcSel          //PLLFOUT3
};
// 3. 配置时钟
static void SystemClock_Config(void)
{
    CRG_unlockClockConfig();
    /* Configure PLL */
    if (CRG_setPLLConfig((const CRG_PLLConfigParam *)&pllInit, HSXO_VALUE, PLLLOCK_TIMEOUT) == DRV_OK)
    {
        /* Configure CPU, BUS, Peripherals Clock  dividers  */
        if (CRG_setClockDivConfig((const CRG_ClockConfigParam *)&clkInit) != DRV_OK)
        {
            while (1);
        }
        /* 选择PLL输出为系统时钟 */
        if (CRG_setClockOutSource(CRG_CLKSRC_PLL_FOUT) != DRV_OK)
        {
            while (1);
        }
    }
    else
    {
        while (1);
    }
    CRG_lockClockConfig();
}

复位及门控配置说明

芯片上电后,部分模块并没有处于解复位状态,如果需要使用这些模块,需要先解除复位。SDK启动文件 SystemInit 函数中默认将所有模块复位解除,用户可以根据需要选择性地解除复位。

系统总线及模块时钟频率获取

APB3总线下的模块有:

  • SPI

  • I2C

  • UART

  • CAN

BUS总线下的模块有:

  • CRG

  • CORDIC

  • QEP

  • SDFM

  • ADC

  • ACMP

  • ETIMER

  • SRPWM

  • FMAC

API Reference

Header File

Functions

void CRG_lockClockConfig(void)

lock write reg to CRG register

void CRG_unlockClockConfig(void)

unlock write reg to CRG register

void CRG_resetPeripheral(CRG_Peripherals periph)

Software Reset Modules.

参数:

periph – Module Reset Index

void CRG_enablePeripheral(CRG_Peripherals periph)

CRG Peripheral Clock Enable.

参数:

periph – Peripheral index in struct CRG_Peripherals

void CRG_disablePeripheral(CRG_Peripherals periph)

CRG Peripheral Clock Disable.

参数:

periph – Peripheral index in struct CRG_Peripherals

void CRG_selectWDGClockSource(WDG_Type *WDGx, CRG_WDGClockSource clkSrc, uint8_t clkDiv)

Select Watchdog module clock source.

Attention

before configure clock source ,should deinit WDGx module

参数:
  • WDGx – WDG0 or WDG1

  • clkSrc – struct CRG_WDGClockSource

  • clkDiv – only valid when clkSrc is APB1 range: [0~63]

uint32_t CRG_getCPUClock(void)
返回:

uint32_t

uint32_t CRG_getBUSClock(void)
返回:

uint32_t

uint32_t CRG_getAPBClock(void)

Get APBBUS Clock Frequency(RTC/WDG/STIM/PTIM)

返回:

uint32_t ABPBus3 Clock Frequency

uint32_t CRG_getAPB3Clock(void)

Get ABPBus3 Clock Frequency(UART/I2C/SPI)

返回:

uint32_t ABPBus3 Clock Frequency

uint32_t CRG_getCANClock(void)

Get CAN Core Clock Frequency.

返回:

uint32_t

uint32_t CRG_getWDGClock(WDG_Type *WDGx)

get the clock frequency of WDG

参数:

WDGx – WDG0 or WDG1

返回:

uint32_t

uint32_t CRG_getSYSCNTClock(void)

get the clock frequency of SYSCNT

返回:

uint32_t

DRV_Status CRG_setClockDivConfig(const CRG_ClockConfigParam *clkInitStruct)

Configure BUS and CPU Clock Div.

参数:

clkInitStruct[in] Clock Div params to be setting

返回值:

DRV_Status

  • DRV_OK: Configure success.

  • DRV_ERROR: Configure fail.

DRV_Status CRG_setPLLConfig(const CRG_PLLConfigParam *pllInitStruct, uint32_t pllRefFreq, uint32_t timeout)

Configure PLL out.

参数:
  • pllInitStruct[in] PLL params to be setting

  • timeout[in] timeout for PLL stable

返回值:

DRV_Status

  • DRV_OK: Configure success.

  • DRV_ERROR: Configure fail.

DRV_Status CRG_setClockOutSource(CRG_ClockSource source)

Configure PLL0 Fout Clock Source Select.

参数:

source – sysclk source select ref ot CRG_CLKSRC_OSC25M

返回:

DRV_Status

FlagStatus CRG_isClockSrcPLL(void)

Check System Clock Source from PLL.

返回:

FlagStatus

Structures

struct CRG_PLLConfigParam

Public Members

uint32_t PLLRefInSrc

< PLL input source select CRG_PLLSource PLLState: The new state of the PLL. This parameter can be a value of CRG_PLL_OFF

uint32_t PLLState

PLLFBDiv: Division factor for PLL VCO input clock. This parameter must be a number between Min_Data = 2 and Max_Data = 63

uint32_t PLLFBDiv

PLLFrac: Multiplication factor for PLL VCO output clock. This parameter must be a number between Min_Data = 50 and Max_Data = 432

uint32_t PLLFrac

PLLPostDiv1: Division factor for PLL clock. This parameter must be a value of 1~7

uint32_t PLLPostDiv1

PLLPostDiv2: Division factor for PLL clock.. This parameter must be a value of 1~7

uint32_t PLLPostDiv2

PLLRefDiv: Division factor for reference. This parameter must be a number between Min_Data = 1 and Max_Data = 63

uint32_t PLLRefDiv

PLLPostDivBypass: Bypass PostDiv. This parameter must be a number between 0 or 1

struct CRG_ClockConfigParam

CRG System, AHB and APB busses clock configuration structure definition.

Public Members

uint32_t CPUCLKDivider

< The CPU clock (CPUCLK) divider. This clock is derived from the PLL0 clock out(PLL0CLK). This parameter can be a value of 1/2/4/6/8 The BUS clock (BUSCLK) divider. This clock is derived from the CPU clock (CPUCLK). This parameter can be a value of 1/2

uint8_t BUSCLKDivider

The APB clock (APBCLK) divider. This clock is derived from the bus clock (BUSCLK). This parameter can be a value of 1/2/4/6/8

uint8_t APBCLKDivider

The APB3 clock (APB3CLK) divider. This clock is derived from the bus clock (BUSCLK). This parameter can be a value of 1/2

uint8_t APB3CLKDivider

The EFC clock (EFCCLK) divider. This clock is derived from the BUS clock (BUSCLK). This parameter can be a value of 1/2

uint8_t EFCCLKDivider

The CAN clock (CANCLK) divider. This clock is derived from the PLL1 clock (PLL1CLK). This parameter can be a value of 2/3/4/5

uint8_t CANCLKDivider

The ADC DAC clock (ADDACLK) divider. This clock is derived from the PLL0 clock (PLL0CLK). This parameter can be a value of 1/2/4/6/8/12

uint8_t ADDACLKDivider

The AES clock (AESCLK) divider. This clock is derived from the PLL0 clock (PLL0CLK). This parameter can be a value of 1/2/4/6/8/12

uint8_t AESCLKDivider

The CAN clock (CANCLK) Source Select. 0: PLL1CLK, 1: CNACLK after divider

Macros

HSOSC_VALUE

Value of the HSOSC oscillator in Hz

ERR_CLK
CRG_PLL_OFF

PLL State selection.

CRG_PLL_ON
CRG_PLL_BYPASS

Enumerations

enum CRG_PLLSource

PLL Source selection.

Values:

enumerator CRG_PLL_SOURCE_HSXO

external crystal oscillator 25MHz

enumerator CRG_PLL_SOURCE_HSOSC

internal osc25MHz

enum CRG_ClockSource

CRG_PLL0_Source PLL0 Clock Source.

Values:

enumerator CRG_CLKSRC_OSC25M
enumerator CRG_CLKSRC_PLL_FOUT
enum CRG_WDGClockSource

CRG_WDG_CLK_Source WatchDog Clock Source Select.

Values:

enumerator CRG_WDG_CLKSRC_HSOSC

osc25MHz

enumerator CRG_WDG_CLKSRC_APB1

Clock Bus APB1

enum CRG_Peripherals

CRG Peripheral Gate and Reset Ctrl.

Values:

enumerator CRG_PERIPH_EFC0
enumerator CRG_PERIPH_EFC1
enumerator CRG_PERIPH_EFC2
enumerator CRG_PERIPH_WDG0
enumerator CRG_PERIPH_WDG1
enumerator CRG_PERIPH_STM0
enumerator CRG_PERIPH_STM1
enumerator CRG_PERIPH_XBAR
enumerator CRG_PERIPH_SYSCNT
enumerator CRG_PERIPH_CAN0
enumerator CRG_PERIPH_CAN1
enumerator CRG_PERIPH_UART0
enumerator CRG_PERIPH_UART1
enumerator CRG_PERIPH_IIC0
enumerator CRG_PERIPH_IIC1
enumerator CRG_PERIPH_SPIM0
enumerator CRG_PERIPH_SPIM1
enumerator CRG_PERIPH_SPIM2
enumerator CRG_PERIPH_SPIS0
enumerator CRG_PERIPH_GPIOA
enumerator CRG_PERIPH_GPIOB
enumerator CRG_PERIPH_GPIOC
enumerator CRG_PERIPH_GPIOD
enumerator CRG_PERIPH_GPIOE
enumerator CRG_PERIPH_GPIOF
enumerator CRG_PERIPH_AHBDMA0
enumerator CRG_PERIPH_AHBDMA1
enumerator CRG_PERIPH_CRC
enumerator CRG_PERIPH_CORDIC
enumerator CRG_PERIPH_QEP0
enumerator CRG_PERIPH_QEP1
enumerator CRG_PERIPH_SDFM0
enumerator CRG_PERIPH_SDFM1
enumerator CRG_PERIPH_SDFM2
enumerator CRG_PERIPH_SDFM3
enumerator CRG_PERIPH_SDFM4
enumerator CRG_PERIPH_SDFM5
enumerator CRG_PERIPH_SDFM6
enumerator CRG_PERIPH_SDFM7
enumerator CRG_PERIPH_ADC0
enumerator CRG_PERIPH_ADC1
enumerator CRG_PERIPH_ADC2
enumerator CRG_PERIPH_ACMP0
enumerator CRG_PERIPH_ACMP1
enumerator CRG_PERIPH_ACMP2
enumerator CRG_PERIPH_ACMP3
enumerator CRG_PERIPH_DAC0
enumerator CRG_PERIPH_DAC1
enumerator CRG_PERIPH_ETIM
enumerator CRG_PERIPH_WAG
enumerator CRG_PERIPH_SRPWM0
enumerator CRG_PERIPH_SRPWM1
enumerator CRG_PERIPH_SRPWM2
enumerator CRG_PERIPH_SRPWM3
enumerator CRG_PERIPH_SRPWM4
enumerator CRG_PERIPH_SRPWM5
enumerator CRG_PERIPH_SRPWM6
enumerator CRG_PERIPH_SRPWM7
enumerator CRG_PERIPH_SRPWM8
enumerator CRG_PERIPH_SRPWM9
enumerator CRG_PERIPH_SRPWM10
enumerator CRG_PERIPH_SRPWM11
enumerator CRG_PERIPH_SRPWMCOM
enumerator CRG_PERIPH_AES
enumerator CRG_PERIPH_FMAC