CRG (时钟复位模块)
简介
CRG全称为时钟复位模块(Clock and Reset Generator),该模块主要为芯片提供时钟及复位管理功能。 时钟模块包含外部时钟源,内部时钟源,PLL, 分频器,时钟门控,时钟丢失检测,时钟频偏检测等。
ET6001 时钟源包含:
外部高速时钟源 HSXO 25MHz
内部高速时钟源 HSOSC 25MHz
外部低速时钟源 LSXO 32.768KHz
内部低速时钟源 LSOSC 256KHz
复位包含外部管脚复位,POR复位,WDG复位,全局软复位和CPU全局复位,外部复位支持滤毛刺功能。ET6001 大部分模块支持单独模块复位。
功能概述
支持外部时钟源HSXO和HSOSC选择
支持PLL的倍频和分频设置
支持各模块时钟门控和复位控制
支持时钟丢失检测
支持时钟频偏检测
支持芯片复位设置
支持各总线时钟频率获取
支持各总线分频系数配置
系统时钟软件配置流程
确定PLL时钟源 - 选择外部时钟源HSXO或内部时钟源HSOSC 枚举类型:
CRG_PLL_SOURCE_HSXO :外部时钟源HSXO
CRG_PLL_SOURCE_HSOSC :内部时钟源HSOSC
- 确定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}\]
设置是是否使能PLL FOUTPOSTDIV BYPASS
不使能BYPASS, PLL的最终输出为FOUT2和FOUT3
使能BYPASS, PLL的最终输出为FOUTPOSTDIV
设置各总线时钟频率
总线时钟分频由结构体 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提供
重要
系统上电后默认由内部时钟源HSOSC提供
BOOTROM会自动将系统时钟切换到PLL
用户如果使用非25MHz晶振,需要修改 system_et6x.c 中的宏定义值 HSXO_VALUE 及 PLLFBDIV 值
修改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 函数中默认将所有模块复位解除,用户可以根据需要选择性地解除复位。
通过函数
CRG_resetPeripheral()设置模块复位, 输入参数为枚举类型:CRG_Peripherals通过函数
CRG_enablePeripheral()设置模块时钟门控开启通过函数
CRG_disablePeripheral()设置模块时钟门控关闭通过函数
SYSCTRL_performGlobalSoftReset()设置芯片全局软复位
系统总线及模块时钟频率获取
通过函数
CRG_getCPUClock()获取CPU时钟频率通过函数
CRG_getBUSClock()获取BUS总线时钟频率通过函数
CRG_getAPBClock()获取APB总线时钟频率通过函数
CRG_getAPB3Clock()获取APB3总线时钟频率通过函数
CRG_getCANClock()获取CAN时钟频率通过函数
CRG_getWDGClock()获取WDG时钟频率
通过函数
CRG_getSYSCNTClock()获取系统计数器SYSCNT时钟频率
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
-
uint32_t PLLRefInSrc
-
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
-
uint32_t CPUCLKDivider
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
-
enumerator CRG_PLL_SOURCE_HSXO
-
enum CRG_ClockSource
CRG_PLL0_Source PLL0 Clock Source.
Values:
-
enumerator CRG_CLKSRC_OSC25M
-
enumerator CRG_CLKSRC_PLL_FOUT
-
enumerator CRG_CLKSRC_OSC25M
-
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
-
enumerator CRG_WDG_CLKSRC_HSOSC
-
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
-
enumerator CRG_PERIPH_EFC0