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晶振。谢谢了。 #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时钟信号。 好吧,先自顶一下。 时钟配置我也一直搞不清,我只外接了一个4M的晶振,想倍频,但看那些资料,貌似没有倍频的,(貌似DCO可以,不过要想有稳定的频率,还是要有一个低频晶振才可以。)给你顶下吧,希望高手出现? 楼主,是不是受到看门狗的影响,我没用过看门狗,但是你第一个程序的看门狗是设置为8ms的,关闭看门狗以后就没事了,会不会是XT2稳定时间过长,然后被看门狗复位了 angus1121 发表于 2013-3-10 21:18 static/image/common/back.gif
楼主,是不是受到看门狗的影响,我没用过看门狗,但是你第一个程序的看门狗是设置为8ms的,关闭看门狗以后 ...
这个很有可能,我没想过。试试看看 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]