刚学完51,还没来得及消化的自己,转身开始进军msp430。在起初的几天里,感觉msp的一切都是那么的苦涩难懂,与51有截然不同的感觉。在文字之中挣扎了两天,受到的打击不小。然后,拈来几个简单的程序,想开始学会自己点灯闪烁,就像学51的编程起点一样。于是,慢慢的看着程序啃代码,弄清每一条语句。此间,有些书上的知识与代码开始串在一起。才发现,最初几天的功夫,没有白费。
点灯闪烁固然简单,会做也说明不了自己达到了一定的高度,但作为一名初学者,能熟练“玩转”各种不同的定时,说明自己对msp430已然不再陌生。对于从51转身msp430的新手来说,个人认为,msp430定时器这一块,是它的特点,也是基础的部分,甚至可以说,是任何新手,在开始时,无法逃避的一个重点!
接下来是自己根据mspf149写的几个定时程序,在实验板上亲测均能通过。
(注:proteus仿真可能无法到达其效果,因为其中使用的是msp430f249,请注意其头文件与149的区别)
一、/* 定时:LFXT1CLK作为ALCK的时钟源,频率:32768HZ */
#include<msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
//TIMER_A相关设置
CCTL0 = CCIE; //使能CCR0中断
CCR0 = 2047; //设定周期0.5S
TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式
P2DIR = 0x04; //设置P2口方向为输出
_EINT(); //使能全局中断
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P2OUT ^= 0xff;
}
二、/* 掌握XT2、DCO两种时钟源情况下SMCLK的定时 */
#include <msp430x14x.h>
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//基础时钟方面的设置
BCSCTL1&=~XT2OFF; //启动XT2
BCSCTL2=SELS+DIVS1+DIVS0; //XT2CLK作为SMCLK的时钟,八分频
//TIMER_A各种寄存器设置
TACTL=TACLR+TASSEL1+ID1+ID0; //清除TAR,时钟源SMCLK,八分频
TACTL|=MC0; //增计数模式
CCTL0=CCIE;
CCR0=62500;
/*特别注意:当XT2没有开启或没有选择XT2作为SMCLK的时钟,
SMCLK的默认时钟源为DCO:800KHZ,若定时0.5s,CCR0=50000; */
P2DIR|=BIT7;
_EINT();
while(1);
}
//interrupt[TIMERA0_VECTOR]void Timer_A(void)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P2OUT^=BIT7;
}
三、关于看门狗的两种表达起定时效果
#include <msp430x14x.h>
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL =WDT_ADLY_1000;//即:WDTCTL=WDTPW+WDTTMSEL+WDTSSEL+WDTCNTCL;
IE1|=WDTIE;
P2DIR|=BIT0;
_EINT();
while(1);
}
#pragma vector=WDT_VECTOR
__interrupt void WDT()
{
P2OUT^=BIT0;
}