CrazySummer 发表于 2013-3-9 16:48:41

MSP430新手请教大家一个有关时钟配置的问题

本人这几天才接触MSP430,板子上芯片是MSP430F149,把书上一个例子稍作改动想用看门狗定时功能产生一个方波(周期性取反P1.0),下面是代码#include <msp430x14x.h>

void main(void)
{
unsigned int i ;
WDTCTL = WDT_MDLY_8 ;         //看门狗定时器定时周期设为8ms
IE1 |= WDTIE ;                  //使能WDT中断
P5DIR |= 0X10 ;               //P5.4输出
P5SEL |= 0X10 ;               //P5.4用作MCLK输出
P1DIR |= 0X01 ;               //P1.01输出
BCSCTL1 &= ~XT2OFF ;            //xt2有效
do
{
    IFG1 &= ~OFIFG ;             //清除振荡器失效标志
    for(i = 0xff ; i > 0; i--) ; //适当延时
}
while((IFG1 & OFIFG) != 0) ;   //
BCSCTL2 |= SELM1+SELS ;      //设置MCLK=SMCLK=XT2CLK
BCSCTL2 |= DIVM0+DIVM1 ;       //设置8分频
_EINT() ;               //系统中断允许
while(1)
{
    _BIS_SR(CPUOFF) ;   //进入LPM0
    _NOP() ;
}
}

//看门狗中断服务子程序
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P1OUT ^= 0X01 ;         //P1.0取反
}结果示波器在P1.0口啥也没看到{:cry:} ,更奇怪的是用示波器观测P5.4口是,发现一会是1MHZ一会又是695KHZ,两频率之间跳变,
实在想不明白为什么。后来查看资料得知,将MCLK设置为LFXT1或XT2时,顺序应如下:
1.复位OscOff
2.清除OFIFG
3.延时等待至少50us
4.再次检查OFIFG,如果仍然置位,则继续2,3步骤,直到OFIFG=0为止。
然道是没有复位OSCOFF吗?因为是初学者,还不知道怎么去用C语言复位OSCOFF,特向论坛高手请教。我的单片机是MSP430F149,XT2接8M晶振。谢谢了。

CrazySummer 发表于 2013-3-9 16:51:15

#include <msp430x14x.h>
void main(void)
{
unsigned int i ;
WDTCTL = WDTPW+WDTHOLD ;      //停止看门狗
P5DIR |= 0X10 ;               //P5.4输出
P5SEL |= 0X10 ;               //P5.4用作MCLK输出
BCSCTL1 &= ~XT2OFF ;            //XT2有效
do
{
    IFG1 &= ~OFIFG ;            //清除振荡器失效标志
    for(i = 0xff;i > 0;i--) ;   //延时
}
while((IFG1 & OFIFG)!= 0) ;   //如果振荡器失效标志存在
BCSCTL2 |= SELM1 ;            //设置 MCLK = XT2
BCSCTL2 |= DIVM0+DIVM1 ;
while(1) ;
}用这段代码的时候示波器在P5.4口看到很稳定的1M时钟信号。

CrazySummer 发表于 2013-3-9 16:51:48

好吧,先自顶一下。

ljc2012 发表于 2013-3-10 10:15:08

时钟配置我也一直搞不清,我只外接了一个4M的晶振,想倍频,但看那些资料,貌似没有倍频的,(貌似DCO可以,不过要想有稳定的频率,还是要有一个低频晶振才可以。)给你顶下吧,希望高手出现?

angus1121 发表于 2013-3-10 21:18:41

楼主,是不是受到看门狗的影响,我没用过看门狗,但是你第一个程序的看门狗是设置为8ms的,关闭看门狗以后就没事了,会不会是XT2稳定时间过长,然后被看门狗复位了

CrazySummer 发表于 2013-3-11 16:41:03

angus1121 发表于 2013-3-10 21:18 static/image/common/back.gif
楼主,是不是受到看门狗的影响,我没用过看门狗,但是你第一个程序的看门狗是设置为8ms的,关闭看门狗以后 ...

这个很有可能,我没想过。试试看看

CrazySummer 发表于 2013-3-12 18:09:35

cbing2000 发表于 2013-3-11 20:44 static/image/common/back.gif
_BIS_SR(CPUOFF) ;   -----等效于进入LPM0.
进入LPM0就是关闭MCLK。这时候你还要去测量MCLK输出? 当然不 ...

首先,谢谢你啊。
今天我有把程序改成了这样
#include <msp430x14x.h>

void main(void)
{
unsigned int i ;
WDTCTL = WDT_MDLY_8 ;          //看门狗定时器定时周期设为8ms
IE1 |= WDTIE ;                  //使能WDT中断
P1DIR |= BIT4 ;               //P1.4输出
P1SEL |= BIT4 ;               //P1.4用作SMCLK输出
P1DIR |= BIT0 ;               //P1.0输出
BCSCTL1 &= ~XT2OFF ;            //xt2有效
do
{
    IFG1 &= ~OFIFG ;             //清除振荡器失效标志
    for(i = 0xff ; i > 0; i--) ; //适当延时
}
while((IFG1 & OFIFG) != 0) ;   //
BCSCTL2 |= SELS ;            //设置SMCLK=XT2CLK
BCSCTL2 |= DIVS_3 ;            //设置8分频,SMCLK即为1M
_EINT() ;                      //系统中断允许
while(1)
{
    LPM0 ;   //进入LPM0
    _NOP() ;
    for(i = 0xff ; i > 0; i--) ;
}
}

//看门狗中断服务子程序
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
LPM0_EXIT ;
P1OUT ^= BIT0 ;         //P1.0取反
}测P1.4口的波形还是不对,老在700khz和1Mhz两个值之间跳变,DCO默认设置是800Khz左右,但不稳定,那个700几Khz的应该是DCO的信号,我是在想不明白?
WDTCTL = WDT_MDLY_8,这个语句好像只要SMCLK设置为1Mhz,看门狗定时器就被设为普通定时器定时8ms吧,不一定要是SMCLK=DCO=1Mhz的。
然后我有吧while里面的3条语句全注释掉,把中断服务程序里的LPM0_EXIT也注释掉,但结果还是一样跳变,没什么影响。
页: [1]
查看完整版本: MSP430新手请教大家一个有关时钟配置的问题