搜索
bottom↓
回复: 5

MSP430加入定时器中断服务函数报错Error[e16]: Segment INTVEC

[复制链接]

出0入0汤圆

发表于 2012-7-3 22:49:04 | 显示全部楼层 |阅读模式
#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来反美的!

出0入0汤圆

 楼主| 发表于 2012-7-4 16:41:54 | 显示全部楼层
问题解决了呢,原来是加入的头文件所致,按照好多例程中所写的那样,加入的是"msp430x24x.h,按理说这一系列的单片机都是通用的,可是呢忽略了我实际用的MSP430G2452没有定时器B,因此虽然在中断向量表中找到中断向量,但是实际芯片中的RAM地址中没有这个中断向量,所以提示超出RAM缓冲区了,解决办法之一就是将定时器B改成定时器0

出0入0汤圆

发表于 2012-7-25 10:06:50 | 显示全部楼层
程序整理的挺好,学习...

出0入0汤圆

发表于 2012-7-29 10:49:18 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-9-12 14:20:32 | 显示全部楼层
程序很清晰,学习了。

出0入0汤圆

发表于 2015-6-6 16:24:59 | 显示全部楼层
本帖最后由 黑巧克力 于 2015-6-6 16:26 编辑

好吧,还真是。


遇到了这样的情况,的确是把中断函数去掉就没有问题了。

不过我用的是5438a与头文件x54x.h  还是有点区别,在仔细看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 13:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表