打印

请教MSP430F5510栈的问题

[复制链接]
3996|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lou0908|  楼主 | 2011-10-19 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教MSP430F5510栈的问题我用仿真器调试MSP430F5510,利用定时器和端口中断从低功耗模式中唤醒,工作模式是这样子的:

main()
{
   ……
  while(1)
{
    执行1;
   ……
   LPM3;
}
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
……
LPM3_EXIT;
}
在仿真器挂着跑的时候,程序中没有断点,我点一下IAR的暂停,那么单片机再也不能恢复到main函数里面的while(1)循环里执行我的应用程序,同时编译器警告如下
Wed Oct 19, 2011 21:41:04: The stack pointer for stack 'Stack' (currently Memory:0x3404) is outside the stack range (Memory:0x3360 to Memory:0x3400)
意思是我栈的内容超出MSP430F5510的RAM范围,我查了很长时间,我的子程序基本没有多层嵌套,且子程序里面变量很少,我把栈由原来的160设成现在320,也没有解决上面问题,请高手指导一下,这是为什么?

相关帖子

沙发
TI_MCU| | 2011-10-20 09:32 | 只看该作者
楼主是不是无意中形成中断嵌套了?如在中断处理函数中使能了GIE。另外楼主中断处理函数放在TIMER0,看楼主中断函数名似乎是想处理TIMER1,你的逻辑有没有问题?

如果只留下你写出来的这些代码(把其它的先注释掉),执行起来应该没有问题的~楼主可以先试着把别的注释掉,然后一点点加回来。

使用特权

评论回复
板凳
lou0908|  楼主 | 2011-10-20 12:42 | 只看该作者
我在中断函数里面通过__get_SR_register()读取到SR中的GIE值,确实在中断执行过程中有把GIE置位的,但在定时器中断函数里面我没有把GIE置位过,而且MSP430中断不嵌套的,比较纳闷?
如果我不进入低功耗模式,即屏蔽掉LPM3,直接让他跑,不管我程序在那里暂停,都不会发生上面这种情况。
这跟仿真器连着一起跑的缘故吗?我的理解是这样子的,单片机带着仿真器在跑,单片机的状态可能是低功耗模式,我一旦点击IAR软件上暂停按钮,仿真器会给单片机带来一个非屏蔽中断导致,PC跑飞?不知道我的理解是不是对的,希望大家能帮我解答

使用特权

评论回复
地板
spark周| | 2011-10-20 13:35 | 只看该作者
你的想象力真丰富,呵呵

使用特权

评论回复
5
xxlin1984| | 2011-10-20 13:48 | 只看该作者
遇到过,是仿真器的误报。程序照样能跑的。

使用特权

评论回复
6
jiajs| | 2011-10-20 14:00 | 只看该作者
仿真器的问题

使用特权

评论回复
7
TI_MCU| | 2011-10-20 14:17 | 只看该作者
3# lou0908

应该没有那么悬...

使用特权

评论回复
8
wyjie| | 2011-10-20 15:18 | 只看该作者
中断嵌套了

使用特权

评论回复
9
lou0908|  楼主 | 2011-10-21 10:13 | 只看该作者
MSP430进入中断服务程序后,是不支持中断嵌套的,而且我在中断服务程序里面根本没有使能GIE,这怎么会把全局中断打开呢??我一直想不通这个问题,请教一下大家

使用特权

评论回复
10
TI_MCU| | 2011-10-21 11:11 | 只看该作者
你确定每一条语句都没有影响? 有时候你不熟悉的某些函数或者语句可能有影响的

使用特权

评论回复
11
lou0908|  楼主 | 2011-10-21 11:29 | 只看该作者
// Timer0_A5 Interrupt Vector (TAIV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
        uint16_t D_Time;
        uint8_t LpmExitFlag = 0;

        switch(__even_in_range(TA0IV,14))
        {
            case  0:
                break;                          // No interrupt
            case  2:
                TA0CCR1 += MIROCSEC_INT_PERIOD;
                SystemTimeStruct.MricoSec ++;
                if(SystemTimeStruct.MricoSec == 0x00)LpmExitFlag = 1;
                break;                          // CCR1 reserve for system delay
            case  4:
                TA0CCR2 += SENSOR_SAMPLE_PERIOD;
                if(SystemRunStatusFlag & NODE_ATTR_RUN_STATUS_FLAG)
                {// 如果节点是正放的,说明节点运行于实际工作模式
                        if(SystemRunStatusFlag & SYSTEM_JOININ_NETWORK_FLAG)
                        {// only slave is created conmuication connection with the host,mag sensor sample data will handle
                                SystemRunStatusFlag |= MAG_DATA_SAMPLE_FLAG;
                                SystemRunStatusFlag1 &=~ MAG_SENSOR_REREAD_FLAG;
                                LpmExitFlag = 1;
                        }
                }
                break;                          
            case  6:
                TA0CCR3 += SAMPLEDATA_HANDLE_PERIOD;
                if(SystemRunStatusFlag & NODE_ATTR_RUN_STATUS_FLAG)
                {// 如果节点是正放的,说明节点运行于实际工作模式
                        if(SystemRunStatusFlag & SYSTEM_JOININ_NETWORK_FLAG)
                        {// only slave is created conmuication connection with the host,mag sensor will work
                                SystemRunStatusFlag |= MAG_DATA_HANDLE_FLAG;  // CCR1 100ms for megnetism sensor data handle
                                LpmExitFlag = 1;
                        }
                }
                break;                          // CCR3  for megnetism sample period,default 100ms
            case  8: // 用于传感器二次采样
//                Bsp_TimerA0_StopCCR(TimerA0_CCR4); // stop timeout wait
                TA0CCTL4 &=~ CCIE;      
                SystemRunStatusFlag |= MAG_DATA_SAMPLE_FLAG;
                SystemRunStatusFlag1 |= MAG_SENSOR_REREAD_FLAG;
                LpmExitFlag = 1;
                break;                          // CCR4 for unit mircosecond counts
            case 10:
                break;                          // CCR5
            case 12:
                break;                          // reserved
            case 14:                            // TCLK = 32768,every interrupt is 2 seconds
                if(0x00 == (SystemTimeStruct.TwoSec % NODE_MEMS_SAMPLE_TIME))
                {// MEMS传感器采样周期,传感器在节点关机模式下也要执行
                        SystemRunStatusFlag1 |= MEMS_DATA_SAMPLE_FLAG;  // 启动mems,1分钟开启一下MEMS
                        LpmExitFlag = 1;
                }
                if(SystemRunStatusFlag & NODE_ATTR_RUN_STATUS_FLAG)
                {// 如果节点是正放的,说明节点运行于实际工作模式
                        if(0x00 == (SystemTimeStruct.TwoSec % NODE_ATTR_SAMPLE_TIME))
                        {
                                SystemRunStatusFlag |= NODE_ATTR_SAMPLE_FLAG; // 节点属性开始采样,开始采样标志位
                                LpmExitFlag = 1;
                        }
                        if(0x00 == ((SystemTimeStruct.TwoSec - 1)% NODE_ATTR_SAMPLE_TIME))
                        {
                                SystemRunStatusFlag |= NODE_ATTR_GETTING_FLAG;// 节点属性获取标志位
                                LpmExitFlag = 1;
                        }
                        D_Time = (SystemTimeStruct.TwoSec >= SystemRecordTimeStruct.WirelessSendDataTime)?(SystemTimeStruct.TwoSec - SystemRecordTimeStruct.WirelessSendDataTime):(65535 - SystemRecordTimeStruct.WirelessSendDataTime + SystemTimeStruct.TwoSec);
                        if(D_Time >= RF_PLUSE_PERIOD)
                        {// 判断当前的时间与记录的发送时间之差,是否大于心跳包的周期发送时间
                                SystemRunStatusFlag |= RF_DATA_SEND_FLAG;  // enable pluse data send
                                SystemRunStatusFlag |= RF_PLUSE_PKT_FLAG;
                                LpmExitFlag = 1;
                        }
                }
                SystemTimeStruct.TwoSec ++;  
                break;                              // overflow
            default:
                break;
        }
        if(LpmExitFlag)
        {
                if(SystemRunStatusFlag1 & SYSTEM_IN_LOWPOWER_FLAG)
                {
                        SystemRunStatusFlag1 &=~ SYSTEM_IN_LOWPOWER_FLAG;
                        LPM3_EXIT; /* Exit Low Power Mode 3 */

                }
        }

}

使用特权

评论回复
12
lou0908|  楼主 | 2011-10-21 11:30 | 只看该作者
本帖最后由 lou0908 于 2011-10-21 11:32 编辑

定时器A的中断服务程序,该程序只对全局变量SystemRunStatusFlag1 与SystemRunStatusFlag1操作,置位或者复位,没有任何子程序
调试的时候暂停会把PC跑飞,应该是MSP430F5510本身的BUG,EEM13,但是我在实际运行中也会出现PC跑飞的状况,但是中断服务程序还是能跑的,应该中断向量还是在的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

193

帖子

1

粉丝