HT32F126x_CKCU

Download Report

Transcript HT32F126x_CKCU

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 时钟监控
2
CKCU 方框图 -1
Prescaler
¸1, 2
fCK_USART1,max = 72MHz
CK_USART
PLLSRC
8 MHz
HSI RC
PLLEN
UREN
f CK_PLL,max = 144MHz
1
HSIEN
CK_PLL
PLL
0
1
4-16 MHz
HSE XTAL
fCK_SYS,max = 144MHz
0x
CK_SYS
CK_HSI
HSEEN
11
CK_HSE
AHB
Prescaler
¸1,2,4,8
fCK_AHB,max = 72MHz
CK_AHB
2
HCLKC
( to CortexTM-M3)
CM3EN
(control by HW)
CK_LSE
WDTSRC
LSEEN
32 kHz
LSI RC
FCLK
( free running clock)
10
Clock
Monitor
32.768 kHz
LSE OSC
STCLK
(to SysTick)
¸8
SW[1:0]
1
0
HCLKF
( to Flash)
CK_WDT
CM3EN
FMCEN
CK_LSI
WDTEN
RTCSRC
LSIEN
3
HCLKS
( to SRAM)
CM3EN
SRAMEN
1
0
CK_RTC
14
CKOUTSRC[2:0]
RTCEN
CKOUT
000
CK_PLL/16
001
010
CK_AHB/16
CK_SYS/16
011
CK_HSE/16
100
CK_HSI/16
101
CK_LSE
110
CK_LSI
OPA0EN
14
WDTEN
ADC
Prescaler
¸1,2,4,6,8...
PCLK
( to OPA,
AFIO
GPIO Port,
ADC,
SPI,
USART,
I2C,
GPTIM,
EXTI,
RTC,
Watchdog Timer)
CK_ADC
ADCEN
3
CKCU 方框图 -2

系统时钟 (CK_SYS) 来源可以选择 HSI, HSE 或 PLL,最高允许输出
144MHz
8MHz
HSI RC
CKCU 寄存器内---GCCR
PLLSRC
PLLEN
f CK_PLL,max = 144MHz
HSIEN
1
PLL
0
4-16MHz
HSE XTAL
CK_HSI
HSEEN
CK_HSE
CK_PLL
SW[1:0]
0x
fCK_SYS,max = 144MHz
11
CK_SYS
10
Clock
Monitor
4
CKCU 方框图 -3

AHB, APB 以及
由系统时钟 (CK_SYS) 而来
CortexTM-M3
fCK_USART1,max = 72MHz
Prescal
er¸1, 2
皆是
CK_USART
UREN
STCLK
(to SysTick)
¸8
fCK_AHB,max = 72MHz
CK_SYS

系统核心时钟 (CK_AHB) 的最大
工作频率可达 72MHz
AHB
Prescaler
¸1,2,4,8
CK_AHB
FCLK
( free running clock)
HCLKC
( to CortexTM-M3)
CM3EN
(control by HW)
HCLKF
( to Flash)
CM3EN
FMCEN
HCLKS
( to SRAM)
CM3EN
SRAMEN
14
OPA0EN
14
WDTEN
ADC
Prescaler
¸1,2,4,6,8...
PCLK
( to OPA, AFIO
GPIO Port,
ADC, SPI, USART,
I2C, GPTIM,
EXTI, RTC,
Watchdog Timer)
CK_ADC
ADCEN
5
CKCU 方框图 -4

看门狗定时器 (WDT) 与实时时钟 (RTC) 的时钟来源可以选择
LSI 或 LSE
CKCU 寄存器内---GCFGR
32.768 kHz
LSE OSC
CK_LSE
WDTSRC
LSEEN
32 kHz
LSI RC
1
0
CK_WDT
CK_LSI
WDTEN
RTCSRC
RTC 寄存器内---RTCCR
LSIEN
1
0
CK_RTC
RTCEN
6
外部高速晶体振荡器

HSE

频率为 4 ~ 16MHz,提供高精确度时钟源

通过GCCR寄存器的HSEEN位开启或关闭

GCSR寄存器中的 HSERDY 标志用来指示HSE是否稳定

如果HSE已呈现稳定状态,则寄存器GCIR中的HSERDYIE位被置位,并
产生一个中断
XTALIN
XTALOUT
Rf1
Rd
C1
4~16 MHz
Crystal
C2
7
内部高速 RC 振荡器

HSI

固定频率约为 8MHz±3%,是上电后的默认时钟源

由寄存器 GCCR 中的 HSIEN 位开启或关闭

寄存器 GCSR 中的 HSIRDY 标志位用来指示 HSI 是否稳定

如果 HSI 已呈现稳定的状态,则寄存器 GCIR 中的 HSIRDYIE 位被置
位,并产生一个中断
8
锁相环

PLL

提供 8~144MHz 的时钟输出

输出时钟频率可以由下列公式确定:
Pllout  Ckin 
NF2
NO2
这里,NF2 = Feedback divider 2 = 1~64,NO2 = Output divider 2 =
1, 2, 4 或 8
/2
Ckin=4~16MHz
Ref
Divder
/2
PD
CP
VCO
Loop
filter
Feedback
Divider2
Output
Divder1
VCOout=64~144MHz
Output
Divder2
Pllout=8~144MHz
S1~S0
Feedback
Divider1
/4
B5~B0
9
外部低速晶体振荡器

LSE

频率为 32,768 Hz,提供高精确度时钟源

由RTCCR 寄存器中的LSEEN位开启或关闭 (RTC)

GCSR寄存器中的 LSERDY标志用来指示LSE是否稳定

如果 LSE已呈现稳定的状态,则寄存器 GCIR中的 LSERDYIE位被置位,
并产生一个中断
XTAL32KIN
XTAL32KOUT
Rf2
C3
32768Hz
C4
10
内部低速 RC 振荡器

LSI

固定频率约为 32kHz±2%,是上电后 RTC 和 WDT 的默认时钟源

由寄存器 RTCCR 中的 LSIEN 位开启或关闭 (RTC)

寄存器 GCSR 中的 LSIRDY 标志位用来指示 LSI 是否稳定

如果 LSI 已呈现稳定的状态,则寄存器 GCIR 中的 LSIRDYIE 位会被置
位,并产生一个中断
11
HSE 时钟监控

启动控制位为寄存器 GCCR 的 CKMEN 位

应在 HSE 作为时钟来源之前开启

一旦检测到 HSE 失效,会有下列动作发生:

HSE 会自动关闭

标志位 CKSF 会被置位

如果 CKSIE 位被置位,
PLLSRC
PLLEN
1
PLL
则会产生 NMI 中断

迫使 CK_SYS & PLL来源切换
0
4-16 MHz
HSE XTAL
CK_PLL
SW[1:0]
0x
成HSI
11
HSEEN
CK_SYS
CK_HSE
10
Clock
Monitor
12
CKCU 时钟输出能力

可以通过寄存器 GCFGR 中的 CKOUTSRC[2:0] 来选择几种时钟信号

PB11 引脚应在 CKOUT 模式正确配置
CKOUTSRC[2:0]
CKOUT
000
CK_PLL/16
001
CK_AHB/16
010
CK_SYS/16
011
CK_HSE/16
100
CK_HSI/16
101
CK_LSE
110
CK_LSI
13
CKCU 范例 -1

System_Clock

描述如何将系统频率输出调整为 24MHz, 48MHz 及 72MHz

演示 HSE 时钟监控和时钟输出功能
14
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);
:
}
15
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);
}
:
}
16
谢谢!
17