170 likes | 516 Views
HPTC-A1-HT32-06. HOLTEK 产品训练课程. CKCU 简介 ( 时钟控制单元 ). CKCU 特性. 4 ~ 16MHz 外部高速晶体振荡器 (HSE) 8MHz 内部高速 RC 振荡器 (HSI) 32,768Hz 外部低速晶体振荡器 (LSE) 注 : HT32F1251B 不支持 LSE 32kHz 内部低速 RC 振荡器 (LSI) 锁相环 (PLL) 时钟源可以是 HSE 或 HSI HSE 时钟监控. CKCU 方框图 -1. 1. 2. 3.
E N D
HPTC-A1-HT32-06 HOLTEK 产品训练课程 CKCU 简介 ( 时钟控制单元)
CKCU 特性 • 4 ~ 16MHz 外部高速晶体振荡器 (HSE) • 8MHz 内部高速 RC 振荡器 (HSI) • 32,768Hz 外部低速晶体振荡器 (LSE) • 注: HT32F1251B 不支持 LSE • 32kHz 内部低速 RC 振荡器 (LSI) • 锁相环 (PLL) • 时钟源可以是 HSE 或 HSI • HSE 时钟监控
CKCU 方框图 -1 1 2 3
CKCU 寄存器内---GCCR CKCU 方框图 -2 • 系统时钟 (CK_SYS) 来源可以选择 HSI, HSE 或 PLL,最高允许输出 144MHz
CKCU 方框图 -3 • AHB, APB 以及 CortexTM-M3 皆是由系统时钟 (CK_SYS) 而来 • 系统核心时钟 (CK_AHB) 的最大工作频率可达 72MHz
CKCU 寄存器内---GCFGR RTC 寄存器内---RTCCR CKCU 方框图 -4 • 看门狗定时器 (WDT) 与实时时钟 (RTC) 的时钟来源可以选择LSI 或 LSE
外部高速晶体振荡器 • HSE • 频率为 4 ~ 16MHz,提供高精确度时钟源 • 通过GCCR寄存器的HSEEN位开启或关闭 • GCSR寄存器中的 HSERDY 标志用来指示HSE是否稳定 • 如果HSE已呈现稳定状态,则寄存器GCIR中的HSERDYIE位被置位,并产生一个中断
内部高速 RC 振荡器 • HSI • 固定频率约为 8MHz±3%,是上电后的默认时钟源 • 由寄存器 GCCR 中的 HSIEN 位开启或关闭 • 寄存器 GCSR 中的 HSIRDY 标志位用来指示 HSI 是否稳定 • 如果 HSI 已呈现稳定的状态,则寄存器 GCIR 中的 HSIRDYIE 位被置位,并产生一个中断
锁相环 • PLL • 提供 8~144MHz 的时钟输出 • 输出时钟频率可以由下列公式确定: 这里,NF2 = Feedback divider 2 = 1~64,NO2 = Output divider 2 =1, 2, 4 或 8
外部低速晶体振荡器 • LSE • 频率为 32,768 Hz,提供高精确度时钟源 • 由RTCCR 寄存器中的LSEEN位开启或关闭 (RTC) • GCSR寄存器中的 LSERDY标志用来指示LSE是否稳定 • 如果 LSE已呈现稳定的状态,则寄存器 GCIR中的 LSERDYIE位被置位,并产生一个中断
内部低速 RC 振荡器 • LSI • 固定频率约为 32kHz±2%,是上电后 RTC 和 WDT 的默认时钟源 • 由寄存器 RTCCR 中的 LSIEN 位开启或关闭 (RTC) • 寄存器 GCSR 中的 LSIRDY 标志位用来指示 LSI 是否稳定 • 如果 LSI 已呈现稳定的状态,则寄存器 GCIR 中的 LSIRDYIE 位会被置位,并产生一个中断
HSE 时钟监控 • 启动控制位为寄存器 GCCR 的 CKMEN 位 • 应在 HSE 作为时钟来源之前开启 • 一旦检测到 HSE 失效,会有下列动作发生: • HSE 会自动关闭 • 标志位 CKSF 会被置位 • 如果 CKSIE 位被置位, • 则会产生 NMI 中断 • 迫使 CK_SYS & PLL来源切换 成HSI
CKCU 时钟输出能力 • 可以通过寄存器 GCFGR 中的 CKOUTSRC[2:0]来选择几种时钟信号 • PB11 引脚应在 CKOUT 模式正确配置
CKCU 范例 -1 • System_Clock • 描述如何将系统频率输出调整为 24MHz, 48MHz 及 72MHz • 演示 HSE 时钟监控和时钟输出功能
CKCU 范例 -2 int main(void) { : /* Configure system clock frequency and HCLK prescaler. External 8MHz crystal is used to drive the system clock */ SysClockConfig_24MHz(); /* Get the current clocks setting */ CKCU_GetClocksFrequency(&ClockFreq); /* Configure NVIC to enable clock ready interrupt */ NVIC_EnableIRQ(CKRDY_IRQn); /* Enable HSE clock monitor & interrupt, once HSE is failed the NMI exception will occur */ CKCU_CKMCmd(ENABLE); CKCU_IntConfig(CKCU_INT_CKSIE, ENABLE); /* Output HSE on CKOUT pin */ CKCU_APBPerip0ClockConfig(CKCU_APBEN0_AFIO, ENABLE); AFIO_GPBConfig(AFIO_PIN_11, AFIO_MODE_1); CKOUTInit.CKOUTSRC = CKCU_CKOUTSRC_HSECK_DIV16; CKCU_CKOUTConfig(&CKOUTInit); : }
CKCU 范例 -3 • SysClockConfig_24MHz() void SysClockConfig_24MHz (void) { : /* Wait until HSE is ready or time-out */ ClockStatus = CKCU_WaitHSEReady(); if (ClockStatus == SUCCESS) { /* PLL configuration, PLLCLK = 96MHz */ PLLInit.ClockSource = CKCU_PLLSRC_HSE; PLLInit.CFG = CKCU_PLL_8M_96M; PLLInit.BYPASSCmd = DISABLE; CKCU_PLLInit(&PLLInit); CKCU_PLLCmd(ENABLE); /* Wait until PLL is ready */ while (CKCU_GetClockReadyStatus(CKCU_FLAG_PLLRDY) == RESET); /* FLASH zero wait clock */ FLASH_SetWaitState(FLASH_WAITSTATE_0); /* HCLK = SYSCLK/4 */ CKCU_SetHCLKPrescaler(CKCU_SYSCLK_DIV4); /* Configure PLL as system clock */ ClockStatus = CKCU_SysClockConfig(CKCU_SW_PLL); } : }