|
MSP430 学习笔记——MCLK时钟配置攻略
[复制链接]
前言:本文仅仅是我在学习过程中的笔记,只讨论几个以我的学识所认识到的几个问题及解决方案,文中不会涉及过多的技术细节。仅仅翻译TI的技术手册让我觉得索然无味;而且这对于一个信息泛滥的时代来说,copy是在创造更多垃圾,精华在于点到关键之处。
复杂的时钟系统
相比较于大多数同学(包括我)学习时单片机的启蒙老师51,MSP430的时钟系统算得上是极其复杂了,而且在使用的过程中还需要对相应的基础器进行配置。 以1系为例,时钟信号源有ACLK、SMCLK、MCLK,分别是辅助时钟、用于外围设备的时钟、系统的主时钟。除了MCLK固定用于CPU外,其它一些外设的时钟信号都可以在三个个时钟信号之间选择。而这三套时钟源可有最多三个振荡器(DCO,LFXT1,XT2)产生。DCO是芯片内部自带的数字振荡器,无论如何都能工作;LFXT1(可以工作于高频模式),XT2是用外部晶振控制频率产生的晶体振荡器。为了避免晶体振荡器起振失败,MSP430提供了一套时钟失效检测电路及相关标志。甚至可以在时钟失效的情况下触发中断。
在了解了上面的基本概念后,相信有一定单片机基础并且肯去读PDF的同学,搞定相关基础器的配置并不是什么难事。但是在实际应用的过程中,MSP430的时系统可不像很多实例程序中那样,配置一番寄存器就能正常工作。在初次配置MSP430单片机时钟系统时,我发现无论如何都无法将MCLK配置为XT2。在后来反复比对TI的英文资料和参考程序后,发现问题出在了时钟失效检测电路之上,只要合理调整时钟的初始化时序便可以解决这个问题。
一不小心就会坑爹的时钟失效检测电路
我在初始使用MSp430F1612进行实验时,根据TI的示例程序编写了一段配置时钟并缓冲输出的程序,如下。(我的实验板,LFXT1为32.7KHz的钟表晶振,XT2为8MHz晶振)
DCOCTL = DCO0 + DCO1 ; // Max DCO
BCSCTL1 = RSEL0 + RSEL1; // XT2on(第一位赋值0), max RSEL
BCSCTL2 = SELM1 + SELS; // MCLK = XT2 ,SMCLK = XT2
//BCSCTL2 |= SELS; // SMCLK = XT2
P5DIR |= 0x70; // P5.6,5,4 outputs
P5SEL |= 0x70; // P5.6,5,5 options,引脚的复用功能
我将MCLK 与 SMCLK 同时配置为 XT2。用示波器观察输出端口时,却发现主时钟MCLK输出的是DCO的频率,而SMCLK输出了XT2的频率。XT2在正常工作的情况下,却不能赋给MCLK。
在时钟失效检测电路的阴影下,配置MCLK
在1系的User's Guide中对时钟失效检测电路有这样的描述
根据用户手册中的这一段,时钟失效检测电路能够检测在晶振失振后约50us内启动,并将MCLK的时钟源自动转换为DCO,以保证程序的正常执行。
而时钟信号的失效会引起失效标志位(OFIFG)的置位,并且在PUC(上电复位)之后失效标志位也会置位。这就不难解释上面的问题了,在单片机刚刚开机的时候,OFIFG是置位了。也就是这个时候,单片机认为晶振是失效的,所以不论你怎么配置寄存器,MCLK都会被强制为DCO。
最后,用户手册中也给出了将始终MCLK从DCO切换到XT2的标准步骤。
1、开启晶振。具体为复位XT2OFF位
2、清除OFIFG位
3、等待至少50us
4、检测OFIFG位,如果依然置位,则重复1-4
因而,在完成相关基本时钟寄存器的配置之后,还需要对时钟失效标志位进行检测和清楚。如下修改程序(添加while循环等待
XT2启振),终于使得程序得以调试通过。
uchar i;
DCOCTL = DCO0 + DCO1 ; // Max DCO
BCSCTL1 = RSEL0 + RSEL1; // XT2on(第一位赋值0), max RSEL
BCSCTL2 = SELM1; // MCLK = XT2 ,SMCLK = DCO
//BCSCTL2 |= SELS; // SMCLK = XT2
P5DIR |= 0x70; // P5.6,5,4 outputs
P5SEL |= 0x70; // P5.6,5,5 options,引脚的复用功能
while ((IFG1 & OFIFG) == OFIFG) //等待XT2启振
{
IFG1 &= ~OFIFG; //clear OFIFG, which is preset
for (i=0;i<200;i++);
}
分享自:http://t.cn/8F8ImCj
|
|