8. 系统时钟

8. 系统时钟

8.1 时钟框图

图8.1.1 时钟系统及结构图

Clock_diagram

内部时钟或者外部时钟经过二选一后作为原始时钟Fosc,再经过PLL倍频后产生Fpll高频时钟,最后经过两组分频器分别得到系统时钟Fsys和USB模块的时钟Fusb4x。系统时钟Fsys直接或者经过时钟门控后提供给CH559的各个模块,各个模块并不需要同时工作,为了降低功耗,可以通过设置睡眠控制寄存器禁止无需工作的模块的时钟。

8.2 寄存器描述

表8.2.1 时钟控制寄存器列表

名称地址描述复位值
CLOCK_CFGB3h系统时钟配置寄存器98h
PLL_CFGB2hPLL时钟配置寄存器D8h

系统时钟配置寄存器(CLOCK_CFG),仅在安全模式下可写:

名称访问描述复位值
7bOSC_EN_INTRW内部时钟振荡器使能,该位为1使能内部时钟振荡器并且选用内部时钟;该位为0关闭内部时钟振荡器并且选用外部晶体振荡器提供时钟1
6bOSC_EN_XTRW外部晶体振荡器使能,该位为1则P4.6/P4.7引脚作为XI/XO并启用振荡器,需在XI和XO之间外接石英晶体或陶瓷振荡器;该位为0关闭外部振荡器0
5bWDOG_IF_TOR0看门狗定时器中断标志位,该位为1表示有中断,由定时器溢出信号触发;该位为0表示无中断。该位在重新加载看门狗计数寄存器WDOG_COUNT时或者进入相应的中断服务程序后自动清零0
[4:0]MASK_SYS_CK_DIVRW系统时钟分频系数,数值为00000b时代表100000b11000b

PLL时钟配置寄存器(PLL_CFG),仅在安全模式下可写:

名称访问描述复位值
[7:5]MASK_USB_4X_DIVRWUSB时钟分频系数,数值为000b时代表1000b110b
[4:0]MASK_PLL_MULTRWPLL参考时钟倍频系数11000b

8.3 时钟配置

CH559芯片上电后默认使用内部时钟,内部时钟频率是12MHz。可以通过CLOCK_CFG选择内部时钟或者外部晶体振荡器时钟,如果关闭外部晶体振荡器,那么XI和XO引脚可以作为P4.6和P4.7普通I/O端口使用。如果使用外部晶体振荡器提供时钟,那么应该在XI和XO引脚之间跨接晶体,以及分别为XI和XO引脚对GND连接振荡电容;如果从外部直接输入时钟信号,那么应该从XI引脚输入,XO引脚悬空。

  • 原始时钟频率Fosc=bOSC_EN_INT?12MHz:Fxt
  • PLL频率Fpll=Fosc*(PLL_CFG&MASK_PLL_MULT)
  • USB时钟分频系数Kusb=(PLL_CFG&MASK_USB_4X_DIV)»5
  • USB时钟频率Fusb4x=Fpll/(Kusb?Kusb:8)
  • 系统时钟分频系数Ksys=CLOCK_CFG&MASK_SYS_CK_DIV
  • 系统主频Fsys=Fpll/(Ksys?Ksys:32)
  • 复位后的默认状态下,Fosc=12MHz,Fpll=288MHz,Fusb4x=48MHz,Fsys=12MHz。

切换到外部晶体振荡器提供时钟的步骤如下:

  1. 进入安全模式,步骤一SAFE_MOD=55h;步骤二SAFE_MOD=AAh;
  2. 用“位或”操作将CLOCK_CFG中的bOSC_EN_XT置1,其它位保持不变,启用晶体振荡器;
  3. 延时数毫秒,通常5mS~10mS,等待晶体振荡器工作稳定;
  4. 再次进入安全模式,步骤一SAFE_MOD=55h;步骤二SAFE_MOD=AAh;
  5. 用“位与”操作将CLOCK_CFG中的bOSC_EN_INT清0,其它位保持不变,切换到外部时钟;
  6. 关闭安全模式,向SAFE_MOD写入任意数值提前终止安全模式。

修改系统主频的步骤如下:

  1. 提前计算好PLL_CFG和CLOCK_CFG的新数值,避免计算过程太久超出安全模式的有效期;
  2. 进入安全模式,步骤一SAFE_MOD=55h;步骤二SAFE_MOD=AAh;
  3. 向PLL_CFG写入新数值;
  4. 向CLOCK_CFG写入新数值;
  5. 关闭安全模式,向SAFE_MOD写入任意数值提前终止安全模式。

备注:

  1. PLL频率Fpll建议不要超出24MHz~350MHz频率范围;
  2. 优先使用较低的系统时钟频率Fsys,从而降低系统动态功耗,并使工作温度范围变宽;
  3. 如果使用到USB模块,那么Fusb4x必须调整到48MHz;
  4. 切换外部晶振和修改系统主频是独立的两项操作,如果同时需要两者,那么建议分两种情况:
    1. 如果外部晶振频率不超过13MHz,那么先切换到外部晶振,然后修改系统主频;
    2. 如果外部晶振频率大于13MHz,那么先降低PLL_CFG寄存器中的PLL参考时钟倍频系数,避免PLL频率Fpll溢出,然后切换到外部晶振,最后修改系统主频,或者也可在修改PLL_CFG的同时修改系统主频。