MSP430的时钟系统本来是单片机的重点,但是现存的教材中,很少有专门的章节讨论的,大多只是对官方文档的翻译,因此做此文。
一、单片机的时钟我把它分为三个层次,硬件底层,应用抽象层,应用层,分别说明:
硬件底层: 1、LFXT1,也就是低频时钟电路
2、XT2,也就是高频时钟电路
3、DCO振荡器,也就是单片机内部的RC振荡器
为什么这么设置:0、ti的msp430单片机为了尽可能减小用户使用的难度,降低电路设计的难度,自带了震荡电路便于使用,也就是说无需像51单片机那样最小系统中必须要一个晶振,简化为最小系统只要有供电就基本开始开始干活了;
1、DCO作为RC振荡器,主要通过对RSELx的配置实现频段的选择,而后通过DCOx实现频率的粗调,通过MODx的混频实现振荡频率的细调,通过DCOR实现配置电阻的内外选择,
2、DCO振荡器却不够精确,但是有比没有强很多的,主要就是在单片机工作中外接的时钟电路出了问题,可以及时用内部的振荡器电路,相当于对时钟电路做了个备份,单路更可靠;
3、为了解决DCO不够精确的问题,就允许用户外接时钟,引入了XT1震荡电路可以在800k~8MHz间的晶振,
1)为了监测外接晶振有问题,设置了中断标志:OFIFG位,当外接晶振有问题时,及时启用DCO;
2)为了省电设置了SCG0位,置位时,允许用户关闭DCO;
3)为了更进一步省电,设置了SCG1位,置位时,允许用户关闭CPU,这样当只用外设时,允许用户关闭CPU
4)为了进一步省电,将外设分为高速和低速外设,低速外设的晶振可以设置为32.768KHz,因此XT1可以在低频模式下,为了区分高频和低频的时钟晶振,将XT1标明为LFXT1,可以通过设置XTS为设置LFXT1工作在高频模式下
5)后来引入了XT2振荡电路,自然要加上2了,因为在原来XT1的基础上加的,只不过我们现在都习惯将XT1称为LFXT1,XT2主要用于高频晶振,XT2OFF置位时,不使用XT2振荡器;复位时才打开XT2振荡器
应用抽象层:LFXT1CLK、SMCLK和MCLK
4、LFXT1相关的寄存器位:
1)OSCOFF置位时,关闭LFXT1时钟电路
2)XTS置位时,LFXT1在高频模式,XTS复位时,LFXT1在低频模式
3)DIVAx有两位,
00时 分频系数为1,
01时 分频系数为2
10时 分频系数为4
11时 分频系数为8
5、SMCLK相关的寄存器位:
1)SELS选择SMCLK的时钟源,
SELS置位时,SMCLK选择的时钟源为外接振荡器,
当XT2振荡器存在时优先用XT2振荡器;
当XT2振荡器不存在时,就用LFXT1振荡器;
SELS复位时,SMCLK选择的时钟源为DCO振荡器
2)DIVSx有两位,配置SMCLK的分频系数
00时 分频系数为1,
01时 分频系数为2
10时 分频系数为4
11时 分频系数为8
5、MCLK相关的寄存器位:
1)SELMx有两位,选择MCLK的时钟源
00时 选择DCO振荡器为时钟源,
01时 选择DCO振荡器为时钟源,
10时 选择XT2振荡器,如果XT2振荡器不在时,选择LFXT1振荡器为时钟源,
11时 选择LFXT1振荡器为时钟源,
2)DIVMx有两位,配置MCLK的分频系数
00时 分频系数为1,
01时 分频系数为2
10时 分频系数为4
11时 分频系数为8
6、DCO相关的寄存器位:
图一 振荡频率示意图
1)RSELx有三位,选择DCO振荡器的输出频段
000时 如图一所示的RSEL=0的频段,
001时 如图一所示的RSEL=1的频段,
010时 如图一所示的RSEL=2的频段,
011时 如图一所示的RSEL=3的频段,
100时 如图一所示的RSEL=4的频段,
101时 如图一所示的RSEL=5的频段,
110时 如图一所示的RSEL=6的频段,
111时 如图一所示的RSEL=7的频段,
2)DCOx有三位,细分DCO的频率点
000时 如图一所示的DCO=0的频段,
001时 如图一所示的DCO=1的频段,
010时 如图一所示的DCO=2的频段,
011时 如图一所示的DCO=3的频段,
100时 如图一所示的DCO=4的频段,
101时 如图一所示的DCO=5的频段,
110时 如图一所示的DCO=6的频段,
111时 如图一所示的DCO=7的频段,
3)MODx有五位,进一步配置混频系数,公式为:
t = (32 - MODx)* tDCO + MODx * tDCO+1
公式说明:t表示混频后振荡信号的周期;
MODx就是MODx五位寄存器中对应的10进制数值;
tDCO就是混频中的低频信号的周期;
tDCO+1就是混频中的高频信号的周期;
1 #include 2 3 int main(void) 4 { 5 WDTCTL = WDTPW | WDTHOLD; //关闭看门狗 6 //DCOCTL |= MOD4 + DCO1 + DCO0; //设置混频系数为16 fDCO=810Kzh,860KHz,890KHz 7 BCSCTL1 |= RSEL2; //设置频段为RSEL=4 8 DCOCTL |= MOD4; //设置混频系统为16 9 DCOCTL |= DCO1 + DCO0; //设置DCO的频率点为3 fDCO=816.32kHz 10 //DCOCTL |= DCO2; //设置DCO的频率点为4 fDCO=1.24MHz 11 12 P5DIR |= 0x70; //打开时钟输出接口,选择为输出 13 P5SEL |= 0x70; //打开时钟输出接口,选择为第二功能 14 15 while (1) 16 { 17 } 18 } 例如在上述代码: 当没有混频时,将第8行注释,DCOx=3, RSELx=4时,DCO的频率fDCO=816.32kHz 当没有混频时,将第8行注释,第9行用第10行代替,DCOx=4, RSELx=4时,DCO的频率fDCO=1.24MHz 当有混频时,DCOx=3, RSELx=4时,DCO的混频后的频率fDCO=810kHz、860kHz、890kHz等,可见的确混频了。 MODx=16, 3)DCOR配置DCO是否使用外置电阻,置位时使用外部电阻,复位时使用内部电阻,使用外部电阻时可以提高振荡器的输出频率,减少DCO振荡器受温度影响的情况,但是不能超过振荡器的振荡频率的最大值。 msp430的时钟设置说明: 1 #include 2 3 int main(void) 4 { 5 WDTCTL = WDTPW + WDTHOLD; //停止看门狗 6 7 BCSCTL1 &= ~XT2OFF; //开启XT2高频振荡器 8 unsigned char i; 9 // do{ 10 // IFG1 &= ~OFIFG; 11 // for (i = 0; i < 0xFF; i++) 12 // { 13 // ; 14 // } 15 // }while ((IFG1 & OFIFG) != 0); 16 while ((IFG1 & OFIFG) != 0) //从87-94行代码和80-86行代码是一样的,主要是个人更喜欢while的逻辑 17 { 18 IFG1 &= ~OFIFG; //清除XT2振荡错误标志 19 for (i = 0; i < 0xFF; i++) 20 { 21 ; //延时一段时间 22 } 23 } 24 IFG1 &= ~OFIFG; //经过长时间等待,当晶振起振成功后,再次清除振荡错误标志 25 26 BCSCTL2 |= SELM1; 27 BCSCTL2 |= DIVM0 + DIVM1; 28 P5DIR |= 0x70; //打开时钟输出接口,选择为输出 29 P5SEL |= 0x70; //打开时钟输出接口,选择为第二功能 30 31 while (1) 32 { 33 } 34 } 程序非常简单,说明如下: 一、设置ACLK,没有代码,主要使用寄存器相应位的默认值: XTS=0,使用LFXT1的低频模式,DIVAx=0,不分频,因此ACLK的波形为:fACKL=32KHz 二、设置SMCLK,没有代码,主要使用寄存器相应位的默认值: SELS=0,默认时钟源为DCO振荡器 DIVx=0默认不分频 在PUC或POR后, RSELx=4,选择频段为4 DCOx=3,选择频率点为3 MODx=0,默认不混频,也就是用低频 DCOR=0,默认使用内部电阻,因此fDCO=810KHz 三、设置MCLK,使用时钟源为XT2高频时钟,主要使用寄存器相应位为: XT2OFF=0,打开XT2振荡器 SELMx=2,选择XT2时钟源,将时钟源由DCO切换到外部晶振时,必须确定清除了振荡错误标志位,具体就是必须使用9~15行货16~23行的代码,最后加上第24行的代码,进行再次清除振荡器振荡错误标记; DIVMx=3,将MCLK8分频 在PUC或POR后, RSELx=4,选择频段为4 DCOx=3,选择频率点为3 MODx=0,默认不混频,也就是用低频 SELMx=0,选择时钟源为DCO振荡器,或者OFIFG--振荡错误标志存在时也选择为DCO振荡器 DIVMx=0,MCLK不分频 好了,终于写完了。
上一篇:msp430入门学习04
下一篇:MSP430F5529 单片机 Memory game 记忆游戏 OLED实验
推荐阅读最新更新时间:2024-11-08 10:55
推荐帖子
- FAN103 5-7W调试进程
- 今天在调试一款FAN103外置MOS电路;7*1WLED隔离驱动原边反馈方案;先调节空载电压,7*3.6=25.2V;带上LED负载后,灯闪;马上断电;初步断定是空载电压大的情况下,带载后电流比较大;但是由于电流调整端,可能电阻太大,限制的电流值偏小,同时是电压调节和电流调节相差悬殊导致的(个人意见);于是将电流限制调大,但是还是频闪;不知为何?将输出负载加大到30V还是不行;灯闪;可能是IC保护了,才不断的关断(时间长到一定程度),导通;所以灯闪?
- czf0408 LED专区
- 运放电路分析
- 哪位大侠帮我分析下,这个运放构成的反馈电路,两个二极管的作用是什么?U3-2脚接两个输入是什么作用?谢谢大家啦 运放电路分析关注,等待高手来分析看上去像是个消除基线漂移的电路。两个二极管分别对积分后得到的正负极性电平导通,叠加到输入上···············把图好好画画,然后写出传输函数吧。比较有难度了能具体说说吗?这个电路我仿真过了,输入是正弦波,输出也是正弦波,只是幅度小啦!回复板凳huayuliang的帖子前级是反相放大,但反馈之余兼作整流输出,有
- 194027lm 模拟电子
- 接ups后,部分设备不工作的问题
- 家里有一台ups,刚换的电池,打算搭配鱼缸用来无间断供氧。接市电时一切正常,但ups供电时2个制氧机都不工作,景观灯却正常工作。求解是什么原因?制氧机功率不大,就6w左右。接ups后,部分设备不工作的问题电压不够吧制氧机要求的供电多大电压多大功率如果UPS的功率和电压都满足,剩下的就是波形问题了。廉价UPS输出的不是正弦波而是方波,具有大量谐波成分。这类廉价UPS是设计用于驱动采用开关电源的设备,非开关电源类设备就需要分析谐波的影响的了,尤其是直接驱动铁芯、磁芯类元件时尤
- hn200918 模拟与混合信号
- 缅 怀一位模拟技术伟人
- BobPease(1940.8.22-----2011.6.18)http://en.wikipedia.org/wiki/Bob_Pease,他生.前致力于模拟电路设计,他的去.世是我们模拟技术界的巨大损失。他学识渊博,经验丰富。他深入浅出的解释,让许多工程师更深刻地理解了他们的电路。让我们“缅.怀Bob”:http://www.ti.com/ww/en/bobpease/index.html更多信息请下载原文:中文英文缅怀一位模拟技术伟人楼主如果发几篇他的
- 德州仪器 模拟与混合信号
- DSP28335 ECAP模块配置问题
- 大家好,我在使用CAP模块时遇到了一些问题。看了ti的几个eCAP例程,对其中的配置还是有一些疑问,例程里基本都要用到中断,然后eCAP1模块的CAP1-4都要用到,然后算频率之类的等等。而我想实现的功能是:比如EPwm1A输出一个50Hz的方波,将该方波送入ECAP1口检测。检测上升沿时强制EPwm1B置高,检测下降沿时强制EPwm1B置低(其实就是检测电网电压过零点产生50Hz的方波去驱动一个逆变桥)。然后我看了eCAP模块在捕获事件发生时会将ECFLG寄存器中对应的状态位CEVT
- ele_pjb DSP 与 ARM 处理器
- 七千字讲完19种电压转换的电路设计方法
- 标准三端线性稳压器的压差通常是2.0-3.0V。要把5V可靠地转换为3.3V,就不能使用它们。压差为几百个毫伏的低压降(LowDropout,LDO)稳压器,是此类应用的理想选择。图1-1是基本LDO系统的框图,标注了相应的电流。从图中可以看出,LDO由四个主要部分组成:技巧1:使用LDO稳压器,从5V电源向3.3V系统供电标准三端线性稳压器的压差通常是2.0-3.0V。要把5V可靠地转换为3.3V,就不能使用它们。压差为几百个毫伏的低压降(LowD
- 木犯001号 电源技术
设计资源 培训 开发板 精华推荐
- LT3091MPFE 12V 至 ±3.3V 低噪声电源的典型应用
- 使用 ROHM Semiconductor 的 BD49E48G-TR 的参考设计
- LTM4650EY-1B 4 相、1.2V、100A 设计的典型应用电路
- MAXREFDES1018:升压型单路输出DC-DC转换器,1V至3.3V输入,13.5V / 6mA输出
- LT6656BCDC-2.048、2.048V 微控制器电压基准和稳压器的典型应用
- 使用 NXP Semiconductors 的 TDA3681 的参考设计
- 使用 ON Semiconductor 的 LA5759 的参考设计
- 使用 Diodes Incorporated 的 AP1538 的参考设计
- RT8809B多相PWM控制器GPU内核电源典型应用
- 使用 ON Semiconductor 的 LA4815M 的参考设计