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

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

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

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

▲ 图1.2.1 系统时钟输出电压波形
下面通过 CLKDIV 改变 SYSCLK 的频率, 这里设置 CLKDIV 等于 4, 再次测量 P1.6, 可以看到它的频率从原来的 8MHz , 减小到 2MHz了。

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

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