天天看点

STC32F12 内部时钟设置

作者:APPLE频道

视频加载中...

一、前言

  做昨天利用STC32F单片机驱动 TM1637 数码管模块的时候,  遇到一个问题, ·那就是 STC32F的时钟频率可以达到 56MHz的时候, 它的 I2C 总线的时钟过快, -使得直接使用 I2C 驱动不了TM1637。 因此, 只能通过 STC32F单片机的 IO 口来软件模拟慢速的 I2C通信协议。 下面通过研究 STC32F系统时钟修改, 来动态改变 SYSCLK 频率, =进而实现慢速 I2C 输出的效果。

STC32F12 内部时钟设置

二、测试结果

1、读取系统时钟控制寄存器

  STC32F 时钟系统的设置是由相关控制寄存器中的不同位的取值进行控制。  在STC32F数据手册中, 给出了时钟系统相关寄存器的名称, 地址。  这些寄存器分成了两组, 它们位段名称和功能在后面进行了定义。  请注意, 在现在我手中的 STC32F头文件中, HPLLCR名称并没有给出定义。   这部分需要手工增加上去。  这是 HPLLR对应的宏定义。

STC32F12 内部时钟设置

  通过编程软件, 将系统时钟控制寄存器内容通过串口进行输出。 这是程序运行输出结果,  将这些结果与内部寄存器对应起来。  可以看到系统时钟控制寄存器的取值。 前面四个控制器地址位于 0x80 至 0xff 之间。   IRC 频段选择寄存器取值为 0x82,  选择的频段为 44MHz。 后面11个寄存器位于高端地址范围。 时钟选择和分频寄存器都是0, 在系统时钟框图中,  意味着系统时钟 MCLK 来自于内部IRC振荡器,   没有经过分频就形成系统时钟 SYSCLK。 下面可以利用 MCLKOCR 寄存器, 来使得时钟信号输出,  从而可以在外部观察测量到 系统时钟信号。

STC32F12 内部时钟设置

2、观察内部时钟信号

  时钟输出控制寄存器, 其中分频倍数设置为 7。 也就是外部时钟频率是 SYSCLK 频率的七分之一。 输出的管脚为 P1.6。 这是利用示波器测量到 P1.6的时钟波形, 时钟频率为8MHz, 正好等于现在单片机 IRC 56MHz 的七分之一。

STC32F12 内部时钟设置

▲ 图1.2.1 系统时钟输出电压波形

  下面通过 CLKDIV 改变 SYSCLK 的频率, 这里设置 CLKDIV 等于 4, 再次测量 P1.6,  可以看到它的频率从原来的 8MHz , 减小到 2MHz了。

STC32F12 内部时钟设置

三、降低I2C时钟

  下面通过修改 CLKDIV来改变 I2C 总线的频率,  使其能够驱动 TM1637 这种需要慢速I2C通讯协议的模块。  使用自制的 STC32F 实验板, 在面包板上连接 TM1637模块进行测试。 这是软件部分,  在使用 TM1637输出控制命令之前, 先将时钟频率降低5倍, ·调用之后再回复到原来的塑料。  经过修改, 可以看到TM1637模块可以正常被调用了。  这种临时改变系统时钟的做法, 虽然可以行得通, 但似乎令人不太放心。   在使用过程中, 也碰到过出现运行不稳定的情况。

STC32F12 内部时钟设置

※总  结 ※

  在这里讨论了 STC32F12 单片机内部时钟设置特性。 利用 CLKDIV 控制寄存器可以的动态改变系统时钟, 这样可以使得一些慢速 I2C 设备能够被驱动。

STC32F12 内部时钟设置