|
#include "msp430x24x.h"
/*****************************常量的宏定义****************************/
#define time_off 0
#define time_on 1
#define led1_1 0x01//点亮LED1
#define led2_1 0x40//点亮LED2
#define led_1 0x41
/******************************全局标志位的定义************************/
unsigned char flag=0;
/*************************函数的声明*************************************/
void InitSys(void);
void Time_Init(void);
void SetTime(unsigned int ti);
void GotimeDfB(unsigned char doit);
void Low_Power_Set(unsigned char flag_lowpower);
/**********************************主函数**********************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
InitSys();
Time_Init(); //对定时器进行初始化
SetTime(30); //设置计数器的初值为3000,即定时
P1DIR |= 0x01; // 设置 P1.0口为输出
GotimeDfB(time_on); //打开定时器
while (1)
{
switch(flag)
{
case 1:
if (0x41 & P1IN)
P1OUT |= 0x41; // 点亮两个灯,分别连接P10和P16
else
P1OUT &= ~0x41; // else reset
break;
}
Low_Power_Set(3);
}
}
/*********************************功能函数的定义*****************************/
/********************************************************
函数名称:void InitSys(void)
函数功能:对430的时钟进行初始化
函数参数:None
函数返回值:None
********************************************************/
void InitSys(void)
{
unsigned int iq0;
// 使用XT2 振荡器
BCSCTL1 &= ~XT2OFF; // 打开XT2 振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for(iq0=0xFF;iq0>0;iq0--); // 延时,等待XT2 起振
}
while ((IFG1 & OFIFG)!= 0); // 判断XT2 是否起振
BCSCTL2=SELM_2+SELS; //选择MCLK、SMCLK为XT2
}
/********************************************************
函数名称:void Time_Init(void)
函数功能:定时器初始化
函数参数:None
函数返回值:None
********************************************************/
void Time_Init(void)
{
/*TBCTL为定时器B的控制寄存器,选择时钟源为ACLK,将计数器清零,先关闭定时器*/
TBCTL=TBSSEL_1+TBCLR+MC_0;
/* TBCCTL0为捕获比较寄存器0,功能为允许定时器中断*/
TBCCTL0=CCIE;
}
/********************************************************
函数名称:void SetTime(unsigned int ti)
函数功能:设置定时时间
函数参数:ti:要定时的时间,与时钟源的频率有关
函数返回值:None
********************************************************/
void SetTime(unsigned int ti)
{
/*TBCCR0为计数器寄存器,用于装载计数比较值,在这里装入的是ti*/
TBCCR0=ti;
}
/********************************************************
函数名称:void GotimeDfB(unsigned char doit)
函数功能:打开或关闭定时器
函数参数:doit:0:停止 100:运行
函数返回值:None
********************************************************/
void GotimeDfB(unsigned char doit)
{
if(doit==100)
{
/* 打开定时器,让计数器工作在连续计数模式,清除计数器初值*/
TBCTL |= MC_1+TBCLR;
}
else if(doit==0)
{
/* 关闭定时器*/
TBCTL &= ~MC0;
}
}
/********************************************************
函数名称:void Low_Power_Set(unsigned char flag_lowpower)
函数功能:低功耗模式设置
函数参数:flag_lowpower:0:LPM0,1:LPM1,2:LPM2,3:LPM3
4:LPM4
函数返回值:None
********************************************************/
void Low_Power_Set(unsigned char flag_lowpower)
{
switch(flag_lowpower)
{
case 0:
LPM0;
break;
case 1:
LPM1;
break;
case 2:
LPM2;
break;
case 3:
LPM3;
break;
case 4:
LPM4;
break;
}
}
/********************************************************
函数功能:定时器B中断服务函数
函数参数:None
函数返回值:None
********************************************************/
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0(void) //定时器中断函数
{
LPM3_EXIT;
flag=1;
}
这是定时器中断函数,在函数内部就是实现退出低功耗模式和将标志位置1。可是加上这个定时器中断函数后就会报错Error[e16]: Segment INTVEC (size: 0x3c align: 0x1) is too long for segment definition.
并且还莫名其妙,看过很多帖子和文章,都说是缓冲区或者变量超出RAM了,可是为什么去掉这段中断服务函数就可以了呢?一直解决不了呢 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|