实验电路如实验1: 在含有单片机的电路板上,有些外围器件需要提供时钟控制,过去常用的方法是使用NE555集成电路与分立原件来完成,现在的STC单片机自带时钟输出功能,使用更方便。
IAP15W4K58S4单片机提供了6路可编程的时钟输出,分别是:
MCLKO P5.4 (主时钟输出,可切换到 P1.6)
T0CLKO P3.5
T1CLKO P3.4
T2CLKO P3.0
T3CLKO P0.4
T4CLKO P0.6
这里要说明几个概念:
主时钟fosc:可以是内部高精度R/C时钟,也可以是外部输入的时钟或外部晶体振荡器产生的时钟。
主时钟经过分频后称为系统时钟SYSclk。
MCLKO输出的是主时钟或者经过分频后的主时钟,其它几个时钟输出频率是由定时器决定的。
主时钟输出MCLKO的频率设置不要大于I/O口最高允许频率13.5MHz,否则不能正常输出。
另外,如果I/O口配置的是默认的弱上拉或推挽输出方式,时钟输出时I/O口都会切换到推挽输出状态,因此要注意I/O口输出的时钟信号不能短路。
如果信号频率要求不高,也可设置成开漏输出模式,外接上拉电阻。
1.主时钟(fosc)输出
主时钟(fosc)可以是内部高精度R/C时钟,也可以是外部输入的时钟或外部晶体振荡器产生的时钟。
主时钟输出的控制寄存器CLK_DIV:
位D7D6D5D4D3D2D1D0
位名称MCLKO_S1MCLKO_S0ADRJTX_RXMCLKO_2CLKS2CLKS1CLKS0
MCLKO_S1 MCLKO_S0: 主时钟输出频率
0 0 无主时钟输出
0 1 主时钟输出频率 = fosc/1
1 0 主时钟输出频率 = fosc/2
1 1 主时钟输出频率 = fosc/4
fosc指内部R/C时钟频率或外部晶体振荡器的频率。
ADRJ:用于A/D转换结果存放格式的调整
TX_RX:串口1的中继广播方式
MCLKO_2:主时钟对外输出位置选择
0:主时钟在P5.4口输出
1:主时钟在P1.6口输出
分频后CPU的实际工作时钟称为系统时钟 SYSclk
CLKS2 CLKS1 CLKS0 用于设置R/C时钟或外部晶振的分频系数,用于降低CPU的工作频率。
0 0 0 主时钟频率/1,不分频
0 0 1 主时钟频率/2
0 1 0 主时钟频率/4
0 1 1 主时钟频率/8
1 0 0 主时钟频率/16
1 0 1 主时钟频率/32
1 1 0 主时钟频率/64
1 1 1 主时钟频率/128
除了上面的P5.4腿时钟输出,还有其它的5种时钟输出方式:
T0CLKO P3.5
T1CLKO P3.4
T2CLKO P3.0
T3CLKO P0.4
T4CLKO P0.6
0,1,2的时钟输出分别由外部中断使能与时钟输出寄存器INT_CLKO的T0CLKO、T1CLKO、T2CLKO控制。
T0CLKO的输出时钟频率由定时器T0控制
T1CLKO的输出时钟频率由定时器T1控制
T2CLKO的输出时钟频率由定时器T2控制
这三个定时器需要工作在方式0(16位自动重装模式),或方式2(8位自动重装模式),不允许定时器中断,以免CPU反复进中断。
外部中断使能与时钟输出寄存器INT_CLKO各位的定义如下:
位D7D6D5D4D3D2D1D0
位名称-EX4EX3EX2-T2CLKOT1CLKOT0CLKO
T0CLKO:是否允许将P3.5引脚设置为定时器T0的时钟输出T0CLKO
0:不允许
1:允许
关于预置初值和时钟输出频率的计算过程:
首先,fosc称为主时钟频率。
主时钟频率fosc经过 CLK_DIV 寄存器的CLKS2 CLKS1 CLKS0 设置分频后降低了CPU的工作频率,称为系统时钟频率SYSclk,CPU就是按照这个频率工作的。计数器就是计数这个系统时钟频率SYSclk的。
例如:主时钟频率为22.1184MHz T0工作在16位自动重装入模式,主时钟fosc无分频,定时器时钟12分频(即定时器计数的是系统时钟频率SYSclk的1/12),要产生30ms的定时,那么预装入初值应该这样计算:
主时钟频率fosc=22.1184MHz
主时钟无分频,则系统时钟频率SYSclk=主时钟频率fosc
定时器T0 12分频,则计数频率为SYSclk/12,即每12/SYSclk的时间,计数加1。
设需要定时的时间为T,则要产生T秒定时需要计数:T/(12/SYSclk)=T*SYSclk/12 次
T0计数满65536时发生溢出,所以预装入的初值是:
65536-T*SYSclk/12
将数值带入 T=30ms SYSclk=22.1184MHz:
65536-30*10-3*22.1184*106/12=10240 即十六进制数 0x2800
所以T0预装入的初值为:
TH0=0x28;
TL0=0x00;
时钟输出的预装入初值计算:
溢出率:
溢出率也叫溢出频率,指定时器每秒溢出的次数
如果T0的C/T=0时,则定时器T0对内部时钟计数
如果T0的C/T=1时,则定时器T0对外部输入脉冲(P3.4/T0)计数
需要注意的是溢出频率是时钟输出信号频率的两倍,即
fy=2fout (fy是溢出频率 fout是输出信号频率)
那么,定时时间T=溢出周期Ty=1/(2fout)
而要得到T秒的定时,需要装入的初值是:
预置初值=65536-T*SYSclk/12
将式中的T用1/(2fout)替换,得:
预置初值=65536-1/(2fout)*SYSclk/12
=65536-SYSclk/12/(2fout)
经整理后可得到输出频率fout与预置初值的关系:
fout=SYSclk/12/2/(65536-预置初值)
如果T0没有设置对系统时钟SYSclk的12分频,那么公式为:
fout=SYSclk/2/(65536-预置初值)
例如:15W4K58S4的R/C时钟或外部晶振频率为11.0592MHz,1T方式计数(即定时器计数时不对系统时钟SYSclk 12分频,每一个时钟周期计数一次,而不是每12个时钟周期计数一次)。
如果预置初值=65535,则fout=SYSclk/2=5.5296MHz
如果预置初值=65534,则fout=SYSclk/4=2.7648MHz
如果预置初值=1, 则fout=SYSclk/131070=84.376Hz
如果预置初值=0, 则fout=SYSclk/131072=84.375Hz
T1CLKO:是否允许P3.4引脚配置为定时器T1的时钟输出。
预置初值的方式与 T0CLKO完全相同。
T2CLKO:是否允许P3.0引
脚配置为定时器T2的时钟输出。
预置初值的方式与T0CLKO相同,只是要注意 T2CLKO固定使用16位自动重装入的定时/计数器。
T3、T4的时钟输出与T2的时钟输出类似,只不过它是由寄存器T4T3M控制:
T4T3M:
位D7D6D5D4D3D2D1D0
位名称T4RT4_C/TT4x12T4CLKOT3RT3_C/TT3x12T3CLKO
字节分段定时器/计数器T4定时器/计数器T3
通过一个例子测试IAP15W4K58S4单片机的6个时钟输出口。
内部R/C时钟频率为fosc=11.0592MHz
输出P5.4(MCLKO)------11.0592MHz
输出P3.5(T0_CLKO)----5MHz
输出P3.4(T1_CLK1)----38.4kHz
输出P3.0(T0_CLK2)----500Hz
输出P0.4(T1_CLK3)----200Hz
输出P0.6(T0_CLK4)----100Hz
实验效果:
11.0592MHz P5.4输出(17腿)
5MHz输出 P3.5(26腿)
38.4KHz输出 P3.4(25腿)
500Hz输出 P3.0(21腿)
200Hz输出 P0.4(5腿)
100Hz输出 P0.6(7腿)