上一篇最后的部分我们用一个例程来对时钟系统的设置有了个正面的认识,只给出了程序没有仿真图示,原因是我所使用的仿真环境下对时钟系统的设置是无效的,选择时钟源没有效果,设置通过指定的引脚同步输出波形也没有效果,只有在通过外部时钟源输入时钟信号才可以设置,这个的使用我们将在定时器的说明时给出。其实还是用块板子比较踏实,仿真和实际有时候真是搞笑,那天他们用单片机做个东西,仿真可以过的在板子上就没反应。倒是仿真没反应的到了板子上竟然很随意的样子,搞不懂。
寄存器
符号
寄存器类型
地址
初始化状态
DCO控制寄存器
DCOCTL
读/写
056H
带PUC的060H
基础时钟系统控制寄存器1
BCSCTL1
读/写
057H
带POR的087H
基础时钟系统控制寄存器2
BCSCTL2
读/写
058H
带PUC的复位
基础时钟系统控制寄存器3
BCSCTL3
读/写
053H
带PUC的005H
SFR中断使能寄存器1
IE1
读/写
000H
带PUC的复位
SFR中断标志寄存器
IFG1
读/写
002H
带PUC的复位
上表给出了设置时钟模块时需要操作到的寄存器,下面让我们去这些寄存器的内部去游览一番。
DCOx:DCO频率选择。这几位选择由RSELx设置位已经选定的REL基础上的8个离散的DCO频率。
MODx:调节器选择。这几位决定在32个DCOCLK周期内频率出现的次数。
XT2OFF7位关闭XT2。
XT2打开
XT2不用于SMCLK或MCLK则关闭
XTS 6位LFXT1模式选择
低频模式
高频模式
DIVAx 5-4位ACLK分频
/1
/2
/4
/8
XT5V 3位 未使用
RSELx 2-0位 范围选择。通过内部寄存器来8种频率阶次。
SELMxBits 7-6选择MCLK的时钟源
DCOCLK
DCOCLK
当有XT2时选择XT2CLK,否则选择LFXT1CLK
LFXT1CLK
DIVMxBits5-4 MCLK的分频系数
/1
/2
/4
/8
SELS Bit 3 选择SMCLK的时钟源
DCOCLK
当有XT2时选择XT2CLK,否则选择LFXT1CLK
DIVSxBit2-1 SMCLk分频系数
/1
/2
/4
/8
DCORBit0 DCO电阻选择
内部电阻
外部电阻
Bits7-2 这些位被其他模块使用。
IFIE Bit1 振荡器失效中断使能。此位使能OFIFG中断。
0 禁止中断
1 使能中断
Bit0 该位可用于其他模块。
Bits7-2这些位被其他模块使用。
OFIFGBit1 振荡器失效中断标志位。
0 没有未相应的中断
1 有未被相应的中断
Bit0 该位可用于其他模块。
当然这些寄存器、标志位不需要过分记忆。不用的话记住也没用,用的话自然而然的就能想起,大不了查找下手册看看而已。
下面我们来看一个比较特别的模块。作为一款优秀的MCU,MSP430可谓为用户使用考虑到了极致,对于基础时钟模块而言,不仅提供了灵感便捷色时钟模块,而且还提供了一个时钟模块自动放故障操作。
在基础时钟模块中整合了一个振荡器失效保护自动防故障模块。通过一个振荡器失效检测器的模拟电路来监视LFXT1CLK(in HF mode)和XT2CLK。当任意的这两个时钟源信号失效后50us内振荡器失效保护模块就会自动工作。如果这个时候MCLK的时钟源选自失效振荡器,那么就会自动转到DCO作为其时钟源,这样就可以在晶体振荡器失效的情况下仍然能够保证代码的执行。
上图是其运行的时序图。
当OFIFG和OFIE标志位被置位时将产生一个NMI请求。NMI中断服务程序将检测OFIFG标志位来决定是否有振荡器失效发生。OFIFG标志位必须由软件清除。
当产生振荡器失效信号时OFIFG被置位。当LFXT1(in HF mode)产生振荡器失效或者当XT2产生振荡器失效时,在POR中XT_OscFault将被置位。也就是当XT2或者LFXT1 在高频模式下因为软件原因停止后XT_OscFault信号将立即有效,并且持续有效直到振荡器重启。