在前一篇学习笔记架构篇中,我们将整个MSP430的总体架构唠嗑了一遍,今天我们继续来聊聊MSP430的时钟。对于时钟模块,我们要了解两件事:时钟架构与时钟配置寄存器。
一、时钟架构
下面我们从MSP430系列单片机的时钟模块组成框图入手,将MSP430的时钟架构梳理一遍。
MSP430基本时钟钟模块+框架图
上图就是MSP430 基本时钟钟模块+的框架图(为什么时钟模块后还有个+我也不懂,反正手册上叫这个名字)。最左边是MSP430的时钟生成源,我们看到MSP430的时钟可以从以下地方生成:由内部低频低功耗时钟源(Internat LP/LF Oscillator)生成的VLOCLK,由外部低频时钟源1(LFXT1 Osoillator)配合XIN与XOUT上外接的晶振电路或时钟信号生成的LFXT1CLK, 由外部高速时钟源2(XT2 Osoillator)配合XT2IN与XT2OUT上外接的晶振电路或时钟信号生成的XT12CLK以及内部高速振荡器(DC Generator为核心组成的电路)生成的DCOCLK。
以上就是MSP430时钟的4大来源,值得提一下,这些时钟源并不是所有的MSP430型号都具备的,有些型号考虑到节省引脚缩小体积会省略掉外部高速时钟源。四大时钟源中,前三者:VLOCLK、LFXT1CLK、TX2CLK可在MSP430运行中通过将SR寄存器的OSCOFF位置1来手动关闭,而DCOCLK不允许在正常工作时手动关闭,其相当于MSP430的最后一道防线,用于在所有其他时钟源都失效时确保MSP430最大限度的正常工作,同时在默认情况下,DCOCLK会被设置为1.045MHZ频率作为MSP430的默认时钟。
当然啦,从图上我们可以看出,这四大时钟源并不直接给单片机的的CPU和各大外设提供时钟,而是先驱动MSP430的三大时钟信号:ACLK、MCLK、SMCLK,再由这三大信号来负责给单片机各部分提供时钟。在这三大时钟信号中,ACLK为辅助时钟信号(Auxillary Clock),其由VLOCLK或者LFXT1CLK经过分频后得到,主要负责给各外设提供低速时钟信号(其实设置后也可以当高速时钟信号用,后面会提到);MCLK为系统主时钟信号(Main System Clock),其可以由四大时钟源中的任一时钟源分频后得到,主要用于给CPU与系统提供时钟信号,这也是最重要的时钟信号了;最后是SMCLK,称为系统子时钟信号,其由XT2CLK或DCOCLK分频后得到,主要负责为外设提供高速时钟。
二、时钟模块相关寄存器
下表列出了所有时钟模块相关的寄存器
时钟模块相关寄存器
当然啦,我不打算按照表格里的顺序来介绍,首先在刚开始可以不用太在意DCO控制寄存器,这个寄存器用于控制内置的DCO时钟源的振荡频率。一般除非使用没有外部时钟引脚的型号,我上电后是会切换到外置时钟源的,DCO当作外部时钟源失效后的备用时钟源。所以我想先从基本时钟系统控制来介绍,这也是最常用的时钟配置寄存器。
1、 BCSCTL1寄存器
基本时钟系统控制寄存器由3个8位寄存器构成,我们先来看第一个寄存器BCSCTL1。如下为BCSCTL1寄存器各位功能说明:
BCSCTL1寄存器
第7位为XT2振荡器的禁用位,置1来禁用XT2CLK,也就是外部时钟。
第6位为LFXT1控制位,用来控制外部低速时钟的工作模式,置1可以配合外部接的高速晶振来当高速时钟用(还记得我们在之前提到的ACLK一般为低速时钟源,但也可以配置为高速时钟的事吗?只需要将LFXT1设置为高速时钟模式,然后选为ACLK时钟信号的时钟源就可以了),置0则为低速时钟,一般配合外部32768HZ晶振用来给RTC时钟模块等低速模块提供时钟信号。
第5-4位为ACLK时钟信号的分频控制位,用于控制ACLK的分频系数,比如我当前时钟源频率为2KHZ,设分频位为01,则实际的ACLK频率为2KHZ/2=1KHZ。
第3-0位为DCO标称范围选择,用于配置DCO内置高速时钟源的频率范围,这里可以先不做深究
2、BCSCTL2寄存器
BCSCTL2寄存器为时钟系统控制寄存器里的第二个寄存器,主要用于配置MCLK与SMCLK。
BCSCTL2寄存器
图片里已经说的很清楚了,其实没什么好补充的,第0位一般不用手动去设置它,保持默认即可。
3、BCSCTL3寄存器
BCSCTL3为时钟系统控制寄存器里的最后一个8位寄存器。
BCSCTL3寄存器
7-6位、5-4位分别用于选择XT2CLK以及LFXT1CLK的频率范围,设置的频率范围一定要与实际频率相符合,否则芯片工作可能会不正常。这里着重提一下LFXT1Sx,当BCSCLT1中的XTS位设为0(LFXT1振荡器工作在低频)时,LFXT1Sx用于设置低频时钟源;当XTS位设置为1(LFXT1振荡器工作于高频)时,LFXT1Sx用于设置高频的频率范围。
3-2位一般不用去动它,而第1位和第0位需要关注一下,它们分别叫XT2OF与XT1OF,当XT2或LFXT2上的外部时钟出现问题时,对应的位会被置1以用于阻止不正常的时钟源为单片机提供时钟信号,可以查询这两位得知外部时钟是否正常工作。
4、中断使能寄存器与中断标志寄存器相关位
在中断使能寄存器(IE)的第1位为OFIE位,该位为振荡器故障中断使能. 置1该位可以使能 OFIFG 中断。在中断标志寄存器(IFLG)中的第1位为OFIFG位,称为振荡器故障中断标志,在OFIE位使能的情况下,若发生振荡器故障,该位会被置1以触发相应中断,应在中断服务程序中手动复位OFIFG位为0。
5、DCO控制寄存器
简单提一下DCO控制寄存器。这个寄存器主要用于配置内部的高速DCO时钟源,寄存器的第7-5位为DCOx位,用于选择RSELx 设置的频率范围中的八个离散 DCO 频率中的一个作为DCO频率。第4-0位为MODx位,用于微调DCOCLK的频率,一般用不上,保持默认就行。
三、时钟配置的顺序
1)使能要用的振荡器并选择振荡器的工作模式;
2)清除中断标志寄存器(IFLG)中的OFIFG位;
3)延时50us;
4)检查OFIFG位是否为0,如果为0到第5步,否则返回第2步(说明配置的时钟源有问题);
5)将设置好的时钟源分配给各系统时钟信号(ACLK、MCLK、SMCLK);
下面附上一段时钟配置的示例代码,当时钟配置成功,连接在P1.1脚上的LED将会亮起:
#include /** * main.c */ int main(void) { int i; WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer P1DIR |= 0x01; // Set P1.0 to output direction P1OUT &= ~0x01; //set the P1.1 to 0 BCSCTL1 &= ~XTS; //set LFXT1 work mode to 0 BCSCTL3 |= LFXT1S1; //set VLOCLK as the low freq clock source BCSCTL3 &= ~LFXT1S0; do { //chk the OFIFG when use extern clock source IFG1 &= ~OFIFG; //clear OFIFG for (i = 0xff; i > 0; i--) ; //delay } while (IFG1 & OFIFG); // is the OFIFG clear? BCSCTL2 |= SELM_3; //select VLOCLK as the clock source for MCLK P1DIR |= 0x01; // Set P1.0 to output direction P1OUT |= 0x01; //set the P1.1 to 1 return 0; }
上一篇:MSP430学习笔记-低功耗与中断系统
下一篇:MSP430 G2553 低功耗模式LPMx
推荐阅读最新更新时间:2024-11-09 23:28
设计资源 培训 开发板 精华推荐
- 戴尔服务器电源转接板
- 恩智浦基于MCU的EdgeReady人脸识别解决方案
- NFC冰墩墩雪容融
- 使用 ON Semiconductor 的 CS5203A-2G 的参考设计
- XCUBE-NOIX4SN5000BL-GEVK:X-Cube XGS5000 单声道模块套件
- MP1584EN(DC-DC可调降压模块)
- LT1376CS8-5 1.5A、500kHz 降压型开关稳压器的典型应用电路
- 【训练营】机械狗制作
- 使用 ROHM Semiconductor 的 BD49K40G-TL 的参考设计
- LTC2945HUD 在 -48V 系统中进行电源监控的典型应用,该系统使用外部线性稳压器为光耦合器和 SCL/SDA 电阻上拉供电