第一章 内部资源篇
1: 把主系统时钟设置为高频晶体振荡器:
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD;
P5DIR|=BIT4;
P5SEL|=BIT4; //p5.4选择做为mclk的输出端
BCSCTL1&=~XT2OFF; //XT2=HF XTAL
do
{ unsigned int i;
IFG1&=~OFIFG; //clear OSCFault Flag
for(i=0xff;i>0;i--); //Time for flag to set
}while((IFG1&OFIFG)); //OSCFault flag still OFIFG默认为1 时是没有振荡的
BCSCTL2|=SELM_2; ////MCLK=XT2(safe)
////////////////////////该段程序为切换主时钟的程序
for(;;);//do nothing
}
步骤:第一步:关闭看门狗
第二步:打开高频晶体振荡器 通过设置寄存器 BCSCTL1
第三步:等待高频晶体振荡器起振 然后在进行第四部的时钟源切换
第四步:设置主系统时钟为高频晶体振荡器 通过 寄存器 BCSCTL2
2 低功耗模式:
#include <msp430x14x.h>
#define uint unsigned int
void main(void)
{
P6DIR |= BIT2;P6OUT |= BIT2; //关电平转换
BCSCTL1 |= DIVA_2; // ACLK/4
WDTCTL = WDT_ADLY_1000; // WDT 1s/4 interval timer
IE1 |= WDTIE; // Enable WDT interrupt
while(1)
{
uint i;
_BIS_SR(LPM3_bits + GIE); // Enter LPM3
// 或者写 _EINT(); LPM3;
P3OUT &= ~BIT5; // Set P3.5 LED on
for (i = 18000; i>0; i--); // Delay
P3OUT |= BIT5; // Clear P3.5 LED off
}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
//或者写 LPM3_EXIT;
}
步骤: 第一步:先写看门狗延时函数 ,开看门狗中断
第二步:写进入低功耗模式 开总中断 _EINT(); LPM3;
第三步: 写应用程序
第四步: 写中断函数 退出低功耗 LPM3_EXIT;
3 看门狗定时器与低功耗模式应用
#include<msp430x14x.h>
int flag;
void main()
{
WDTCTL=WDT_MDLY_32;
IE1|=WDTIE;
P2DIR|=BIT7;
_EINT();//开全局中断
LPM0;
}
#pragma vector=WDT_VECTOR
__interrupt void WDTDOG_time()
{
flag++;
if(flag==10)
{
P2OUT^=BIT7;
flag=0;
}
}
步骤: 第一步: 设置看门狗为定时模式
第二步:使能看门狗中断
第三步: 开全局中断 //用简写模式 LPMx 必须写 _EINT();
第四步: 写应用程序
第五步: 进入低功耗模式
第六步: 写看门狗中断服务函数
4 低功耗模式下的时钟源工作状态验证 (2013 09 18)
/********************************************
此程序用看门狗定时器让LED间隔闪烁
也可用来检测不同低功耗模式下SMCLK 与ACLK的工作状态
通过此程序 表面 LPM0 1 2 3情况下ACLK工作
LPM4情况下 ACLK不工作
SMCLK 在LPM2 3 4情况下不工作
在LPM 0 1情况下工作
但这与书本上说的有点不同
*********************************************/
#include<msp430x14x.h>
int flag;
void main()
{
WDTCTL=WDT_MDLY_32;
//WDTCTL=WDT_ADLY_1000;
IE1|=WDTIE;
P2DIR|=BIT7;
_EINT();//开全局中断
LPM0;
}
#pragma vector=WDT_VECTOR
__interrupt void WDTDOG_time()
{
flag++;
if(flag==2)
{
P2OUT^=BIT7;
flag=0;
}
}
5 定时器A 之连续计数模式 2013 09 20
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTHOLD+WDTPW; //关狗
P2DIR|=BIT1;
CCTL0=CCIE; //使能CCR0中断
CCR0=50000; //这个CCR0 与TACCR0一样 但多写成CCRO
TACTL=TASSEL_2+MC_2; //smclk continue mode
_EINT(); //开全局中断
LPM1; //进入低功耗
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timerA ()
{
P2OUT^=BIT1;
CCR0+=50000;//连续计数模式下 CCR0必须加偏置 才能保持方波周期恒定
}
注意: 定时器A操作步骤:
第一步: 打开定时器A的中断
第二步: 选择定时器A的时钟源 分频器 计数模式
6 定时器A 之增计数模式 2013 09 20
/********************************
定时器A的增计数模式
************************************/
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; //关小狗
P2DIR|=BIT2;
CCTL0=CCIE; //使能CCR0
CCR0=50000;
TACTL=TASSEL_2+MC_1; //SMCLK UP MODE
_EINT(); //开全局中断
LPM1;
//_BIS_SR(LPM0_bits + GIE);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timeA0()
{
P2OUT^=BIT2;
}
特别注意: 这个程序在编译过程中若选择F1612就不能实现功能 但选择
F149 F169都可以 这是神马歌原因呢
7 定时器A的双中断运用 2013 09 20
/****************************************************
定时器A工作在连续计数模式下 用CCRO在P2.0出产生一方波
用溢出中断在P2.7产生一方波
****************************************************/
#include<msp430x14x.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; //关小狗
P2DIR=BIT0+BIT7;
CCTL0=CCIE; //CCRO中断允许
CCR0=20000;
TACTL|=MC_2+TASSEL_2+TAIE; //SMCLK CONTINUE MODE 溢出中断允许
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
//TimerA0 CCRO中断服务函数
#pragma vector=TIMERA0_VECTOR
__interrupt void timerA0()
{
P2OUT^=BIT0;
CCR0+=20000;//连续计数模式下 CCR0必须加偏置 才能保持方波周期恒定
}
//TimerA1 溢出中断服务函数
#pragma vector=TIMERA1_VECTOR
__interrupt void timerA1()
{
switch(TAIV)
{
case 2 : break;//CCR1
case 4: break;//CCR2
case 10: P2OUT^=BIT7; break;
}
}
//特别注意: 定时器A有4个中断 CCRO 单独使用一个中断向量TIMERA0_VECTOR
而CCR1 CCR2 溢出中断 共用一个中断向量 |