dcoclk 被自动选择 mclk 差分时钟信号号怎样理解

2038人阅读
msp430(7)
电子设计(7)
欢迎访问我的个人网站:
1.&&&&&&时钟模块包括高速晶体振荡器、低俗晶体振荡器、数字控制振荡器DCO、锁频环FLL以及锁频环增强版本FLL+等部件构成。
2.&&&&&&时钟模块产生3个输出结果:ACLK(辅助时钟),MCLK(主系统时钟)和SMCLK(子系统时钟)。
3.&&&&&&MSP430采用锁频环FLL以及锁频环增强版本FLL+等部件将晶体频率倍频至系统频率。数字控制振荡器DCO和锁频环FLL计数相结合可实现快速启动。在晶体振荡器失效时DCO可自动用于系统时钟。
4.&&&&&&3个时钟输入源:
a)&&&&&&&&LFXT1CLK:低频时钟源
b)&&&&&&&&XT2CLK:高频时钟源
c)&&&&&&&&DCOCLK:数字控制RC振荡器
5.&&&&&&3种时钟信号
a)&&&&&&&&ACLK:由LFXT1CLK信号经1、2、4、8分频后得到。ACLK可由软件选做各外围模块的时钟信号,一般用于低俗外设。
b)&&&&&&&&MCLK:由软件选择来自LFXT1CLK、XT2CLK、DCOCLK,然后经过1、2、4、8分频得到。MCLK主要用于CPU和系统。
c)&&&&&&&&SMCLK:可由软件选择来自LFXT1CLK和DCOCLK,然后经过1、2、4、8分频得到。SMCLK主要用于高速外围模块。
6.&&&&&&低速晶体振荡模块LFXT1
a)&&&&&&&&接手表晶振(32768Hz)时直接接在XIN和XOUT两个脚上,不需要其他外部器件,所有保持工作稳定的原件和移相电容都集成在芯片中。
b)&&&&&&&&也可通过外接450kHz~8MHz的高速晶体振荡器来工作在高频模式,这时两个引脚要外接电容。
7.&&&&&&高速晶体振荡器XT2
a)&&&&&&&&MSP430外接高速晶体振荡器XT2的频率为450kHz~8MHz。
8.&&&&&&DCO振荡器
a)&&&&&&&&当LFXT1和XT2失效时,DCO振荡器会自动被选作MCLK的时钟源。振荡器失效引起的NMI中断请求可以得到响应,甚至在CPU关闭的情况下也可以。
b)&&&&&&&&DCO振荡器是一个可数字控制的RC振荡器,它的频率随供电电压和温度变化而具有一定的不稳定性。MSP430可以通过操作控制寄存器软件调节来增强振荡频率的稳定性。
9.&&&&&&时钟模块寄存器
a)&&&&&&&&DCO控制寄存器DCOCTL
&&&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&DCOx:定义8种频率之一,可分段调节DCOCLK的频率,相邻两频率相差10%。而频率由注入直流发生器的电流定义。(默认为3)。
&&&&&&&&&&&&&&&&&&&&&&ii.&&&&&&&&&&&&&MODx:定义在32个DCO周期中插入的fdco+1的个数,而在余下的DCO周期中为fdco周期,控制切换DCO和DCO+1两种频率。如果DCO常数为7,表示已经选择最高频率,此时不能利用MODx进行频率调整。
b)&&&&&&&&基本时钟系统控制寄存器1 BCSCTL1
&&&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&XT2OFF: 0使XT2开启,1使XT2关闭。(默认关闭)
&&&&&&&&&&&&&&&&&&&&&&ii.&&&&&&&&&&&&&XTS:控制LFXT1的工作模式,选择须结合实际晶体振荡器的连接情况。为0时工作在低频,为1时工作在高频。(默认为低频,在高频时必须连接相应的高频时钟源)。
&&&&&&&&&&&&&&&&&&&&&iii.&&&&&&&&&&&&&DIVAx:控制ACLK分频。0为不分频,1为2分频,2为4分频,3为8分频。(默认不分频)。
&&&&&&&&&&&&&&&&&&&&&iv.&&&&&&&&&&&&&XT5V:此位设置为0。
&&&&&&&&&&&&&&&&&&&&&&v.&&&&&&&&&&&&&RSELx:3位控制某个内部电阻以决定标称频率。为0为最低,依次增加,7为最高。(默认为4。)(由DCO默认值为3,RSELx默认值为4可以推算出DCO的默认频率为1000kHz左右。注意DCO的频率不稳定。)
c)&&&&&&&&基本时钟系统控制寄存器2 BCSCTL2
&&&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&SELMx:选择MCLK时钟源,0为DCOCLK,1为DCOCLK,2为TX2CLK,3为LFTXT1CLK。(默认为DCO)
&&&&&&&&&&&&&&&&&&&&&&ii.&&&&&&&&&&&&&DIVMx:选择MCLK分频,0为1分频,1为2分频,2为4分频,3为8分频。(默认1分频)
&&&&&&&&&&&&&&&&&&&&&iii.&&&&&&&&&&&&&SELS:选择SMCLK时钟源,0为DCO,1为TX2CLK(默认DCO)
&&&&&&&&&&&&&&&&&&&&&iv.&&&&&&&&&&&&&DIVSx:选择SMCLK分频,0为1分频,1为2分频,2为4分频,3为8分频。(默认为1分频,即SMCLK与MCLK一样)
&&&&&&&&&&&&&&&&&&&&&&v.&&&&&&&&&&&&&DCOR:选择DCO电阻,0为内部电阻,1为外部电阻
d)&&&&&&&&SFR中断使能寄存器1
&&&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&IE1是中断允许寄存器,IE1.1是振荡器故障中断允许位OFIE,置位表示允许中断,复位表示不允许中断。
e)&&&&&&&&SFR中断标志寄存器1
&&&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&IFG1是中断标志寄存器,IFG1.1是振荡器故障中断标志位OF1FG,置位表示有振荡器故障,复位表示没有发生故障。
10.&&PUC信号后DCOCLK被自动选作MCLK时钟信号,根据需要MCLK的时钟源可以另外设置为LFXT1或者XT2.顺序如下:
a)&&&&&&&&复位OSCOFF
b)&&&&&&&&清除OFIFG
c)&&&&&&&&延时等待至少50us
d)&&&&&&&&再检查OFIFG,如果置位,则重复3,4步,直到OFIFG=0
e)&&&&&&&&代码:
&&&&&&&& IFG1 &=~OFIFG;
&&&&&&&& for(I = 0i& 0;i --);
while((IFG1 & OFIFG) != 0);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40857次
排名:千里之外
原创:26篇
(2)(8)(1)(4)(13)MSP430单片机时钟模块
MSP430单片机时钟模块
MSP430X1XX基本时钟模块有三个时钟输入源LFXT1CLK(低速32768Hz,高速450Hz到8MHz)、XT2CLK(450Hz到8MHz)、DCOCLK
1.ACLK辅助时钟:由LFXT1CLK信号经1、2、4、8分频后得到,可以由软件选作各个外围模块的时钟信号,一般用于低速外
2.MCLK系统主时钟:MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到,MCLK
3.SMCLK子系统时钟:可由软件选自LFXT1CLK和DCOCLK(MSP430X11X、MSP430X12X系列,因其不含XT2),或XT2CLK和2、4、8分频得到。SMCLK主要用于高速外围模块。
系统频率与系统的工作电压密切相关(MSP430工作电压1.8V~3.6V,编程电压2.7V~3.6V),所以不同的工作电压,需要时钟。当两个外部振荡器失效时,DCO振荡器会自动被选作MCLK的时钟源。PUC信号之后,DCOCLK被自动选作MCLK和SMCLK的时钟选作ACLK的时钟信号,根据需要MCLK和SMCLK的时钟源可以另外设置。
控制时钟模块的三个寄存器为DCO控制寄存器DCOCTL、基本时钟系统控制寄存器1BCSCTL1、基本时钟控制寄存器2BCSCTL2
一、设置MCLK=XT2,SMCLK=DCOCLK,将MCLK由P5.4输出(MSP430X14X中引脚P5.4和MCLK复用)
#include "MSP430x14x.h"
void main(void)
WDTCTL= WDTPW+WDTHOLD; //Stop watchdog to prevent to overflow
P5DIR | = 0X10; //Set P5.4 to output
P5SEL | = 0X10; //Set P5.4 to MCLK mode
BCSCTL1 &= ~XT2OFF; //Enable XT2
IFG1 & = ~OFIFG; //Clear OFIFG
for(i=0i&0;i--); //Set a delay
}while(IFG1&OFIFG); //check-up the OFIFG
BCSCTL2 | = SELM_2; //Set XT2CLK the clock of MCLK
二、设置ACLK=MCLK=LFXT1=HF,将ACLK用P2.0(复用)输出。
#include "MSP430x14x.h"
void main(void)
unsigned int i,j;
WDTCTL = WDTPW+ WDTHOLD;
P1DIR =0x02;
P2DIR =0x01;
P2SEL=0x01;
BCSCTL1 | = XTS;
IFG1 & = ~OFIFG;
for(i=0i&0;i--);
}while(IFG1 & OFIFG);
BCSCTL2 | = SELM_3;
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。MSP430学习 - purefriendship的专栏 - CSDN博客
MSP430学习
有个寄存器其中有四个特殊寄存器程序计数器堆栈指针状态寄存器和常数发处理器
程序寄存器用来存放下一条指令的地址
堆栈指针是当程序进入子程序或是中断的时候用来保护现场的
常数发生器是用来产生常数的
以上三个特殊寄存器在写程序时不用考虑
状态寄存器位是用来反应的状态的在写时都要来设置或读取某些位来控制的行为在程序寄存器里可以读取的状态设置总中断控制位设置系统时钟的工作状态
外围模块寄存器
外围模块寄存有的是位的有的是位的
中断使能寄存器位
在这里主要能应用到的是设置的的发送完毕和接收完毕的中断控制位
中断使能寄存器位
在这里主要设置的发送和接收的中断
中断标志寄存器位
这里主要是一些模块的中断标志位根据这些标志们来进入中断
这个寄存器是的也就是这些标志可能是单片机进行某些操作后自己标志的也可以是人为写的这样可以方便打操作
我们主要用的是的发送和接收中断还有看门狗和晶振出错中断
中断标志寄存器位
这主要是控制读写的中断标志位作用和相同
模块使能寄存器位用来使能的传输和接收
模块使能寄存器位
用来使能的传输和接收
看门狗有两个定时器看门狗控制寄存器
看门狗计数器
在默认的情况下看门狗处于工作状态有两个位控制一个是控制时钟输入一个是选择看门狗的工作模式是普通定时器的模式还是看门狗模式
选用的信号是计数频率是
并且做为复位管角
一般情况下要停止看门狗的工作只要不让有时钟输入就可以了
是由晶体失效时产生的中断这个时候时钟会自动被选用做的时钟源
定时器控制寄存器
可以选择时钟源外部管角时钟源或外部输入时钟以及时钟源的分频系数工作模式停止增加连续增减还能对定时器进行清并使能其中断还有中断标志
默认情况下用的是个部管角做为输入信号没有分频定显示停止工作也没有中断使能
定时器计数器位
当计数器的时钟不是时写入该寄数器的时候应停止计数器的计数因为它与不同步用的是做为工作时钟
中断向量寄存器
因为定时器可以有三个中断方式一个是溢出中断也可以是来自己于捕获比较定时器这些中断向量用同一个中断标志位所以这个寄存里就存着中定时器产生的不同中断的向量表是固定的不能写的
定时器捕获比较控制寄存器
定时器有多个捕获比较模块每个模块都有一个
定时器有三种中断方式普通溢出方式捕捉方式还有比较方式
普通方式就是在溢出后产生中断
捕捉方式有一个固定的外部管角如果在这个固定的管角上发生脉冲触发沿则寄存器中的值将会被写入中所以晕种模式经常用于确定事件的发生时间
比较模式即在中写入一个固定的数值当数值变化为时就会产生中断
这个寄存器可以设定的是捕获模式还是比较模式
当是捕获模式时可是设定是同步捕获还是异步捕获异步捕获模式允许在请求时立即将置位和捕获定时器值适用于捕获信号同期远大于定时器时钟周期的情况如果定时器时钟和捕获信号发生时间竞争则捕寄存器的可能出错所以实际上我们一般用同步捕获
捕获模式下我们可以设定是地上升沿捕获还是下降沿捕获还可以选择不同的不同的捕获事件输入源有不同的管角
在比较模式时还可以设定输入方式如等还可以设定中断允许还有中断标志等
一般来说单片机的时钟系统由高速晶体低速晶体和数字控制振荡器等器件构成这三个模式会产生三个不同的时钟供不同的模块使用产生的时钟为辅助时钟主系统时钟子系统时钟当我们选用不同的时钟信号也就是频率不同就可以达到低功耗的作用一般情况下频率越低功耗越小
三种基础时钟模块作用
辅助时钟由信号经分频后得到可由软件选做各外围模块的时钟信号一般用于低速外设
系统主时钟可由软件选择来自三者之一然后经过分频后得到主要用于和系统
子系统时钟可由软件选择来自和可者和由具体器件决定然后经分步得到主要用于高速外围模块
低频振荡器
低频振荡器有两个工作状态一个是低频模式在外部要接一个固定频率为的晶体这个时候不用在晶体外部接电容
另外低频振荡器也可以工作在高频状态这个时候可以在外部接到的晶体但是要外电容
高频振荡器
与低频振荡器不同的时高速晶体振荡器要的功耗更大高整晶体振荡器接在和之间并且必须接外部电容高速晶体硅藻器可以作为和的时钟源外接到之间的晶体
是内部集成的类型的振荡器的频率会随法度和电压的变化而变化并且不同芯片的频率也可能不一样采用方式的时钟信号数度比较差但是可以通过软件来设置来调整的频率从而增加频率的稳定性
寄存器控制寄存器
这个寄存器分成两组比特定义了种频率可以选定其中一种
是作用以个周期为一个大周期这个用于控制在这个周期中有多个个周期起来一个信号调制的作用当为时表示已是最高频率此时就不能利用进行频率调整
基本时钟模块控制器
在这里可以选择内部的电阻不同的阻值会有不同的频率为最低为最高还可以控制高速振荡器的关毕和开启
还能选择低频振荡器是工作在低频模式还是高频模式
选择控制的分步系数
基本时钟模块控制器
在这里可以选择的时钟源
可以选择的分频因子
选择的时钟源和它的分频因子
还可以选择是内部电阻还是外部电阻
不同的芯片还会有不同的功能
在选用作用时钟源频率选用的是最低的没有调制
串口通信分为异步通信同步通信
寄存器可以为或因为不同的芯片可能有一个或两个接口
基本控制寄存器
在这里可以设定是有没有校验
是奇校验还是偶校验
有没有停止位
是异步还是同步
多机模式选择
还有控制位这一位比较重要它的状态影响着其他一些控制位和状态位的状态
一次正确的模块初始化应该是这样的  先使=1来设置串口,然后使=0也就是说说在时,用来设置串口的功能,当=0时,再来使用.如果要设置中断,可以在=0时的时候来设定.
    发送控制寄存器
() 时钟相位控制
0 在模式下,使用正常的时钟
        1 在模式下,时钟信号被延迟半个周期后用作信号
时钟极性控制位
        0  信号的低电平为无效电平,数据在的上升沿输出.输入数据在的上升沿被锁存.
        1  与之下相反.
以上两位之有在模式下才有用,时没有用.
在这里还可以设定波特率发生器的时钟源,可以是外部,也可以是,或一般选用
通过当为时表明不骨接收到数据为时接收到数据请求中断服务
通过当为时下一字节是数据为时下一字节是地址
为时是线模式当为时是线模式
发送器空标志当为时表示发送缓冲区有数据当为时表示发送缓冲区没有数据
接收控制寄存器
这里主要有帧出错标志校验出错标志溢出标志打断检测标志
还有接收出错中断允许位
还有接收唤醒中断允许位当为时当该位为时每接收到一个字符都使都使标志位当位时只有接收到地址字符才能设置
还有接收唤醒标志当该位为时接收到的字符是数据当该位为时接收到的字符是地址
接收出错标志
和是设定波特率的
其中为低字节为高字节这两个字节合起来构成一个位一般情况下同这个就可以设置我们常用的波特率但要是所用的波特
是小数则要可以达到要求
和接收和发送缓冲器
寄存器是用来接收数据的寄存器当有数据的时候从该寄存器里读出来
寄存器是用来发送数据的寄存器当有数据要发送的时候将数据写入到该寄存器就
一般初始化时要以下几上地方以为例
先通过来设定数据长度
清空发送控制寄存器之后现选择波特率发生器我们一般用
再通过来设定波特率
再使能相应的和中断通过模块使能寄存器来使能和
然后再中断使能寄存器来和中断
再将相应管角设定为和并将设定为输出设定为输入
我的热门文章
即使是一小步也想与你分享21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 6309|回复: 23
时钟的初始化和GPIO
&&已结帖(0)
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
MSP430时钟:
1、在MSP430单片机中一共有三个或四个时钟源:
(1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz,也可以接(400kHz~16Mhz);
(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接(400kHz~16Mhz);& &&&
(3)DCOCLK,数控振荡器,为内部晶振,由RC震荡回路构成;
(4)VLOCLK,内部低频振荡器,12kHz标准振荡器。
2、在MSP430单片机内部一共有三个时钟系统:
(1)ACLK,Auxiliary Clock,辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;& &
(2)MCLK,Master Clock,系统主时钟单元,为系统内核提供时钟,它可以通过软件从四个时钟源选择;
(3)SMCLK,Sub-Main Clock,系统子时钟,也是可以由软件选择时钟源。
Basic Clock Module Registers(基础时钟寄存器)
DCO control register& && && && && && && && &
Basic clock system control 1& && && && &
& &&&BCSCTL1
Basic clock system control 2& && && && &
& && &BCSCTL2
Basic clock system control 3& && && && && &
& &BCSCTL3
SFR interrupt enable register 1& && && &
& && & IE1
SFR interrupt flag register 1& && && && &
3、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3
DCOCTL,DCO控制寄存器,地址为56H,初始值为60H
DCO0~DCO2: DCO Select Bit,定义了8种频率之一,而频率由注入直流发生器的电流定义。
MOD0~MOD4: Modulation Bit,频率的微调。
一般不需要DCO的场合保持默认初始值就行了。
BCSCTL1,Basic Clock System Control 1,地址为57H,初始值为84H
RSEL0~RSEL2: 选择某个内部电阻以决定标称频率.0最低,7最高。
DIVA0~DIVA1:选择ACLK的分频系数。DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8;
XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。
XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。
正常情况下把XT2OFF复位就可以了.
BCSCTL2,Basic Clock System Control 2,地址为58H,初始值为00H
DCOR: Enable External Resistor. 0,选择内部电阻;1,选择外部电阻
DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8
SELS: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.
DIVM0~1: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.
SELM0~1: 选择MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CL
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
1. LFXT1: 一次有效的PUC信号将使OSCOFF复位,允许LFXT1工作,如果LFXT1信号没有用作SMCLK或MCLK,可软件置OSCOFF关闭LFXT1.
2. XT2: XT2产生XT2CLK时钟信号,如果XT2CLK信号没有用作时钟MCLK和SMCLK,可以通过置XT2OFF关闭XT2,PUC信号后置XT2OFF,即XT2的关闭的。
3. DCO振荡器:振荡器失效时,DCO振荡器会自动被选做MCLK的时钟源。如果DCO信号没有用作SMCLK和MCLK时钟信号时,可置SCG0位关闭DCO直流发生器。
4. 在PUC信号后,由DCOCLK作MCLK的时钟信号,根据需要可将MCLK的时钟源另外设置为LFXT1或XT2,设置顺序如下:
(1)清OSCOFF/XT2
(2)清OFIFG
(3)延时等待至少50uS
(4)再次检查OFIFG,如果仍置位,则重复(1)-(4)步,直到OFIFG=0为止。
(5)设置BCSCTL2的相应SELM。
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
1、CPU运行在VLO时钟下:
这是最慢的时钟,在约12千赫兹下运行。因此,我们将通过可视化的LED闪烁的红色慢慢地在约每3秒钟率。我们可以让时钟系统默认这种状态,设置专门来操作VLO。我们将不使用任何ALCK外设时钟在此实验室工作,但你应该认识到,ACLK来自VLO时钟。
#include &msp430g2231.h&
void main(void)
WDTCTL = WDTPW + WDTHOLD;& && && &&&// 关闭看门狗定时器
P1DIR = 0x40;& && && && && && && && &&&// P1.6 配置输出
P1OUT = 0;& && && && && && && && && & // 关闭LED
BCSCTL3 |= LFXT1S_2;& && && && && && & // LFXT1 = VLO
IFG1 &= ~OFIFG;& && && && && && && &&&// 清除OSCFault 标志
__bis_SR_register(SCG1 + SCG0);& && && & // 关闭 DCO
BCSCTL2 |= SELM_3 + DIVM_3;& && && &&&// MCLK = VLO/8
P1OUT = 0x40;& && && && && && && &&&// 开启LED
_delay_cycles(100);
P1OUT = 0;& && && && && && && && &&&// 关闭 LED
_delay_cycles(5000);
2、CPU运行在晶振(32768Hz)时钟下:
晶体频率为32768赫兹,约3倍的VLO。如果我们在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么32768赫兹是一个标准?这是因为这个数字是2的15次方,因此很容易用简单的数字计数电路,以每秒一次获得率 ——手表和其他时间时基。认识到ACLK来自外部晶振时钟。
#include &msp430g2231.h&
void main(void)
WDTCTL = WDTPW + WDTHOLD;& && &&&// 关闭看门狗定时器
P1DIR = 0x41;& && && && && && && &&&// P1.0 和P1.6配置输出
P1OUT = 0x01;& && && && && && && & // 开启P1.0
BCSCTL3 |= LFXT1S_0;& && && && && & // LFXT1 = 32768Hz 晶振
while(IFG1 & OFIFG)
IFG1 &= ~OFIFG;& && && && && && & // 清除 OSCFault 标志
_delay_cycles(100000);& && && && & // 为可见的标志延时
P1OUT = 0;& && && && && && && & // 关闭P1
__bis_SR_register(SCG1 + SCG0);& &&&// 关闭 DCO
BCSCTL2 |= SELM_3 + DIVM_3;& && &// MCLK = 32768/8
P1OUT = 0x40;& && && && && && & // 开启 LED
_delay_cycles(100);
P1OUT = 0;& && && && && && && &/ / 关闭LED
_delay_cycles(5000);
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
3、CPU运行在晶振(32768Hz)和DCO时钟下:
最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望ACLK上运行的VLO或32768赫兹晶振。由于ACLK在我们目前的代码是在晶体上运行,我们会打开DCO计算。
#include &msp430g2231.h&
void main(void)
WDTCTL = WDTPW + WDTHOLD;& && && && &// 关闭看门狗定时器
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
while(1);& && && && && && && && && && & // If cal const erased, 挂起
BCSCTL1 = CALBC1_1MHZ;& && && && && & // Set range
DCOCTL = CALDCO_1MHZ;& && && && && & //设置DCO模式
P1DIR = 0x41;& && && && && && && && &&&// P1.0 和P1.6配置输出
P1OUT = 0x01;& && && && && && && && & // P1.0 开启
BCSCTL3 |= LFXT1S_0;& && && && && && & // LFXT1 = 32768Hz
while(IFG1 & OFIFG)
IFG1 &= ~OFIFG;& && && && && && && &&&// 清除OSCFault 标志
_delay_cycles(100000);& && && && && &&&// 为可见标志延时
P1OUT = 0;& && && && && && && && && &// P1.6 关闭
// __bis_SR_register(SCG1 + SCG0);& && & // 关闭DCO
BCSCTL2 |= SELM_0 + DIVM_3;& && && & // MCLK = DCO
P1OUT = 0x40;& && && && && && && &&&// P1.6 开启
_delay_cycles(100);
P1OUT = 0;& && && && && && && && & / / P1.6 关闭
_delay_cycles(5000);
4、CPU运行在DCO时钟下:
最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望在VLO或者是晶振下运行ACLK。由于ACLK在我们目前的代码是在VLO上运行,我们会打开DCO运行。
#include &msp430g2231.h&
void main(void)
WDTCTL = WDTPW + WDTHOLD;& && && && && & // 关闭看门狗定时器
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
while(1);& && && && && && && && && && && &&&// If cal const erased,挂起
BCSCTL1 = CALBC1_1MHZ;& && && && && && && &// Set range
DCOCTL = CALDCO_1MHZ;& && && && && && && &// 设置DCO模式
P1DIR = 0x40;& && && && && && && && && && & // P1.6 配置输出
P1OUT = 0;& && && && && && && && && && && &// P1关闭
BCSCTL3 |= LFXT1S_2;& && && && && && && && &// LFXT1 = VLO
IFG1 &= ~OFIFG;& && && && && && && && && &&&// 清除 OSCFault 标志
//__bis_SR_register(SCG1 + SCG0);& && && && &&&// 关闭DCO
BCSCTL2 |= SELM_0 + DIVM_3;& && && && && &&&// MCLK = DCO/8
P1OUT = 0x40;& && && && && && && && &&&// P1.6 关闭
_delay_cycles(100);
P1OUT = 0;& && && && && && && && && & // P1.6 开启
_delay_cycles(5000);
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
以下将会分析上面4个例子的代码细微差别:
首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明和以上四个代码有关的部分,其余请大家自行阅读。
一、WDTCTL = WDTPW + WDTHOLD;& && && && && & // 关闭看门狗定时器(例1、2、3、4)
头文件中的相关说明如下:
#define __MSP430_HAS_WDT__& &&&
SFR_16BIT(WDTCTL);& && && && && &
#define WDTIS0& && && && && &&&(0x0001)
#define WDTIS1& && && && && &&&(0x0002)
#define WDTSSEL& && && && && & (0x0004)
#define WDTCNTCL& && && && &&&(0x0008)
#define WDTTMSEL& && && && && &(0x0010)
#define WDTNMI& && && && && &&&(0x0020)
#define WDTNMIES& && && && && &(0x0040)
#define WDTHOLD& && && && && & (0x0080)
#define WDTPW& && && && && && &(0x5A00)
这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。
举例如下:
A、间隔时间由Bit0-2位编码:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#define WDT_MDLY_32& && && &(WDTPW+WDTTMSEL+WDTCNTCL)& && && && && && && && &
#define WDT_MDLY_8& && && & (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)& && && && && &&&
#define WDT_MDLY_0_5& && &&&(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)& && && && && &&&
#define WDT_MDLY_0_064& && &(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)& && && &
2、看门狗的时钟由FACLK(假设为32KHz)
#define WDT_ADLY_1000& && & (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)& && && && && &
#define WDT_ADLY_250& && &&&(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)& && && &
#define WDT_ADLY_16& && && &(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)& && && &
B、看门狗模式——在过期时间后重启:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#define WDT_MRST_32& && && &(WDTPW+WDTCNTCL)& && && && && && && && && && && &
#define WDT_MRST_8& && && & (WDTPW+WDTCNTCL+WDTIS0)& && && && && && && && && &
#define WDT_MRST_0_5& && &&&(WDTPW+WDTCNTCL+WDTIS1)& && && && && && && && &&&
#define WDT_MRST_0_064& && &(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)& && && && && && &
2、看门狗的时钟由FACLK(假设为32KHz)
#define WDT_ARST_1000& && & (WDTPW+WDTCNTCL+WDTSSEL)& && && && && && && && &
#define WDT_ARST_250& && &&&(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)& && && && && && &
#define WDT_ARST_16& && && &(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)& && && && && && &
#define WDT_ARST_1_9& && &&&(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
二、P1DIR = 0x40;& && && && && && && && && && & // P1.6 配置输出
& & P1OUT = 0;& && && && && && && && && && && &// P1关闭& && &(例1、2、3、4)
其中DIR 和P1OUT分别配置IO口的方向和输出值,这里不在赘述,请参考手册。
三、BCSCTL3 |= LFXT1S_2;& && && && && && & // LFXT1 = VLO& && & (例1和例4)
& & BCSCTL3 |= LFXT1S_0;& && && && && && & // LFXT1 = 32768Hz& & (例2和例3)
#define __MSP430_HAS_BC2__& && && && && && &
SFR_8BIT(DCOCTL);& && && && && && && && &
SFR_8BIT(BCSCTL1);& && && && && && && &&&
SFR_8BIT(BCSCTL2);& && && && && && && &&&
SFR_8BIT(BCSCTL3);& && && && && && && &&&
#define MOD0& && && && && && & (0x01)& && &&&
#define MOD1& && && && && && & (0x02)& && &&&
#define MOD2& && && && && && & (0x04)& && &&&
#define MOD3& && && && && && & (0x08)& && &&&
#define MOD4& && && && && && & (0x10)& && &&&
#define DCO0& && && && && && & (0x20)& && &&&
#define DCO1& && && && && && & (0x40)& && &&&
#define DCO2& && && && && && & (0x80)& && &&&
& && && && && && && && && && && && && && && && && && && && && && && && && && && &
#define LFXT1OF& && && && && & (0x01)& && &&&
#define XT2OF& && && && && && &(0x02)& && &&&
#define XCAP0& && && && && && &(0x04)& && &
#define XCAP1& && && && && && &(0x08)& && &
#define LFXT1S0& && && && && & (0x10)& && &
#define LFXT1S1& && && && && & (0x20)& && &
#define XT2S0& && && && && && &(0x40)& && &
#define XT2S1& && && && && && &(0x80)& && &
#define XCAP_0& && && && && &&&(0x00)& && &&&
#define XCAP_1& && && && && &&&(0x04)& && &&&
#define XCAP_2& && && && && &&&(0x08)& && &&&
#define XCAP_3& && && && && &&&(0x0C)& && &&&
#define LFXT1S_0& && && && && &(0x00)& && &&&
#define LFXT1S_1& && && && && &(0x10)& &
#define LFXT1S_2& && && && && &(0x20)& &
#define LFXT1S_3& && && && && &(0x30)& &
#define XT2S_0& && && && && &&&(0x00)& &
#define XT2S_1& && && && && &&&(0x40)& &
#define XT2S_2& && && && && &&&(0x80)& &
#define XT2S_3& && && && && &&&(0xC0)& && &
四、__bis_SR_register(SCG1 + SCG0);& && && & // 关闭 DCO
__bis_SR_register()是在intrinsics.h这个头文件中定义了,实现的功能是将SR中的位置零。
关于头文件中的代码作用
#ifdef __cplusplus
extern &C&
#ifdef __cplusplus
一般用于将C++代码以标准C形式输出(即以C的形式被调用),这是因为C++虽然常被认为是C的超集,但是C++的编译器还是与C的编译器不同的。C中调用C++中的代码这样定义会是安全的。
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
五、BCSCTL2 |= SELM_3 + DIVM_3;& && && &&&// MCLK = VLO/8
& & BCSCTL2 |= SELM_3 + DIVM_3;& && && &&&// MCLK = 32768/8
& & BCSCTL2 |= SELM_0 + DIVM_3;& && && & // MCLK = DCO
& & BCSCTL2 |= SELM_0 + DIVM_3;& && && & // MCLK = DCO/8
MSP430中有如下定义:
#define RSEL0& && && && && && &(0x01)& && &&&
#define RSEL1& && && && && && &(0x02)& && &&&
#define RSEL2& && && && && && &(0x04)& && &&&
#define RSEL3& && && && && && &(0x08)& && && &
#define DIVA0& && && && && && &(0x10)& && &&&
#define DIVA1& && && && && && &(0x20)& && &&&
#define XTS& && && && && && &&&(0x40)& && &
#define XT2OFF& && && && && &&&(0x80)& && &&&
#define DIVA_0& && && && && &&&(0x00)& && &&&
#define DIVA_1& && && && && &&&(0x10)& && &&&
#define DIVA_2& && && && && &&&(0x20)& && &&&
#define DIVA_3& && && && && &&&(0x30)& && &&&
#define DIVS0& && && && && && &(0x02)& && &&&
#define DIVS1& && && && && && &(0x04)& && &&&
#define SELS& && && && && && & (0x08)& && &
#define DIVM0& && && && && && &(0x10)& && &&&
#define DIVM1& && && && && && &(0x20)& && &&&
#define SELM0& && && && && && &(0x40)& && &&&
#define SELM1& && && && && && &(0x80)& && &&&
#define DIVS_0& && && && && &&&(0x00)& && &&&
#define DIVS_1& && && && && &&&(0x02)& && &&&
#define DIVS_2& && && && && &&&(0x04)& && &&&
#define DIVS_3& && && && && &&&(0x06)& && &&&
#define DIVM_0& && && && && &&&(0x00)& && &&&
#define DIVM_1& && && && && &&&(0x10)& && &&&
#define DIVM_2& && && && && &&&(0x20)& && &&&
#define DIVM_3& && && && && &&&(0x30)& && &&&
#define SELM_0& && && && && &&&(0x00)& &
#define SELM_1& && && && && &&&(0x40)& &
#define SELM_2& && && && && &&&(0x80)& &
#define SELM_3& && && && && &&&(0xC0)& && &&&
六、BCSCTL1 = CALBC1_1MHZ;& && && && && & //设置值& &&&(例3、4)
#ifndef __DisableCalData
SFR_8BIT(CALDCO_16MHZ);& && && &
SFR_8BIT(CALBC1_16MHZ);& && && &
SFR_8BIT(CALDCO_12MHZ);& && && &
SFR_8BIT(CALBC1_12MHZ);& && && &
SFR_8BIT(CALDCO_8MHZ);& && && &
SFR_8BIT(CALBC1_8MHZ);& && && &
SFR_8BIT(CALDCO_1MHZ);& && && &
SFR_8BIT(CALBC1_1MHZ);& && && &
#endif& && && && && && && && && && &
关于SFR_8BIT的相关说明:
External references resolved by a device-specific linker command file
(外部引用解决的特定于设备的连接器命令文件)
#define SFR_8BIT(address)& &extern volatile unsigned char address
#define SFR_16BIT(address)&&extern volatile unsigned int address
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
高级技术员, 积分 537, 距离下一级还需 463 积分
高级技术员, 积分 537, 距离下一级还需 463 积分
七、if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
while(1);& && && && && && && && && & // If cal const erased,挂起
}& && && && && && && && && && && && &
(例3、例4)
请注意这里的陷阱。它可以清除内存段信息。
八、IFG1 &= ~OFIFG;& && && && && && && &&&// 清除OSCFault 标志&&
(例1、例4)
时钟系统将强制使用的MCLK作为其源的DCO在一个时钟故障的存在。因此,我们必须清除故障标志。
FG1中断标志寄存器是1。寄存器中的位域是唯一的振荡器故障中断标志 - OFIFG。
九、while(IFG1 & OFIFG)
IFG1 &= ~OFIFG;& && && && && && && &&&// 清除OSCFault 标志
_delay_cycles(100000);& && && && && &&&// 为可见标志延时
}& && && && && && && && && && && &&&
(例2、例3)
在上面的代码我们把OSCFault标志继续做我们的任务,由于时钟系统将默认为VLO。现在,我们希望确保该标志保持清零,这意味着晶体是启动并运行着的。
如果该故障标志是明确的,我们就退出循环。我们需要等待清算后的标志,直到我们再次测试50微秒。该_delay_cycles(100000)。我们需要它是那么长的时间,所以我们可以看到在代码开头的LED灯。否则,它会这么快,我们的光将无法看到它。
BCSCTL1BCSCTL2BCSCTL3DCOCTLIFG1VLO(12KHz) SELM_3 + DIVM_3LFXT1S_2
32768KHz SELM_3 + DIVM_3LFXT1S_0 While晶振、DCO SELM_0+ DIVM_3LFXT1S_0 WhileDCOCALBC1_1MHZSELM_0+ DIVM_3LFXT1S_2CALDCO_1MHZ
ACLKMCLKLFXT1VLO(12KHz)VLOVLO/8VLO32768Hz32768Hz32768Hz/832768Hz晶振、DCO32768HzDCO32768HzDCOVLODCO/8VLO
主题帖子积分
高级技术员, 积分 741, 距离下一级还需 259 积分
高级技术员, 积分 741, 距离下一级还需 259 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 741, 距离下一级还需 259 积分
高级技术员, 积分 741, 距离下一级还需 259 积分
主题帖子积分
资深工程师, 积分 11510, 距离下一级还需 8490 积分
资深工程师, 积分 11510, 距离下一级还需 8490 积分
主题帖子积分
专家等级:结帖率:71%
主题帖子积分
资深工程师, 积分 11510, 距离下一级还需 8490 积分
资深工程师, 积分 11510, 距离下一级还需 8490 积分
一品人生 发表于
1. LFXT1: 一次有效的PUC信号将使OSCOFF复位,允许LFXT1工作,如果LFXT1信号没有用作SMCLK或MCLK, ...
讲解的非常详细的,参考了
主题帖子积分
初级技术员, 积分 92, 距离下一级还需 8 积分
初级技术员, 积分 92, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 92, 距离下一级还需 8 积分
初级技术员, 积分 92, 距离下一级还需 8 积分
整理得非常不错,不支持不行!顶楼主!
主题帖子积分
中级工程师, 积分 4651, 距离下一级还需 349 积分
中级工程师, 积分 4651, 距离下一级还需 349 积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
中级工程师, 积分 4651, 距离下一级还需 349 积分
中级工程师, 积分 4651, 距离下一级还需 349 积分
非常详细 楼主辛苦了
主题帖子积分
中级工程师, 积分 4680, 距离下一级还需 320 积分
中级工程师, 积分 4680, 距离下一级还需 320 积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
中级工程师, 积分 4680, 距离下一级还需 320 积分
中级工程师, 积分 4680, 距离下一级还需 320 积分
主题帖子积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
主题帖子积分
专家等级:结帖率:2%
主题帖子积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
不能再详细了 顶!
主题帖子积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
主题帖子积分
专家等级:结帖率:9%
主题帖子积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
楼主的资料是在哪找的?
主题帖子积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
主题帖子积分
专家等级:结帖率:13%
主题帖子积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
挺详细的 很有用
主题帖子积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
主题帖子积分
中级工程师, 积分 4209, 距离下一级还需 791 积分
中级工程师, 积分 4209, 距离下一级还需 791 积分
主题帖子积分
专家等级:结帖率:2%
主题帖子积分
中级工程师, 积分 4209, 距离下一级还需 791 积分
中级工程师, 积分 4209, 距离下一级还需 791 积分
不错的帖子 不过初学者还需要多加指导
主题帖子积分
中级工程师, 积分 3617, 距离下一级还需 1383 积分
中级工程师, 积分 3617, 距离下一级还需 1383 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级工程师, 积分 3617, 距离下一级还需 1383 积分
中级工程师, 积分 3617, 距离下一级还需 1383 积分
整理的不错 很容易理解
主题帖子积分
中级工程师, 积分 3450, 距离下一级还需 1550 积分
中级工程师, 积分 3450, 距离下一级还需 1550 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级工程师, 积分 3450, 距离下一级还需 1550 积分
中级工程师, 积分 3450, 距离下一级还需 1550 积分
不错的帖子 帮顶
技术新星奖章
人才类勋章
时间类勋章
突出贡献奖章
等级类勋章
沉静之湖泊
发帖类勋章
时间类勋章
技术高手奖章
人才类勋章

我要回帖

更多关于 时钟信号的作用 的文章

 

随机推荐