我使用的是IAR5.3,单片机为MSP430F5510,单片机进入LPM3模式,利用定时器和外部中断来唤醒,定时器是每隔1ms进入中断一次,当单片机下载好程序后,脱机运行,发现过一段时间单片机就无法从低功耗模式下退出,进入低功耗之前没有配置SVSH 与 SVMH,选用MCLK和SMCLK是由XT1(32768Khz)倍频到8Mhz的,定时器中断函数基本没有调用子程序,只是对一些标志位的置位与复位,所以栈溢出可能性比较小,请教大家,这个可能是什么问题?
Fuchong Wang:
是不是在中断服务程序里要关掉低功耗设置,否则中断服务程序执行完返回时还是低功耗模式?
liangliang lou:
回复 Fuchong Wang:
不是的,在程序进入低功耗之前,会把PC和SR保存在栈中,中断服务程序中执行低功耗退出指令会把PC重新从栈中弹出来,问题是:有时候在实际运行中,进入低功耗模式后,PC会被置成不可知的值,导致低功耗无法退出???
所以特向人请教,我记得以前用1xx和2xx系列没有出现这个问题????
Fuchong Wang:
回复 liangliang lou:
中断服务程序中执行低功耗退出指令好像就是修改的堆栈中的值而不是SR中的,用开发环境的扩展指令,例如:
__bic_SR_register_on_exit(CPUOFF);
liangliang lou:
回复 Fuchong Wang:
低功耗模式退出就是恢复进入低功耗之前PC值,使得程序回到原先的地址继续执行, Fuchong Wang 你能否讲的详细一点,谢谢
Fuchong Wang:
回复 liangliang lou:
低功耗的0-4模式可以通过设置SR寄存器中的CPUOFF, OSCOFF, SCG0, SCG1位来配置。在执
行中断服务子程序时,SR寄存器的中内容将会被压入到堆栈中如果在中断服务子程序中没有改
变先SR中的内容,那么程序将返回到先前设置的运行模式。如果中断服务子程序操作存储于堆
栈中的SR积存器中的内容,将使得程序返回至一个不同的运行模式。模式控制位和堆栈将允许
任何指令进行存取访问。当我们对模式控制位进行设置后,被选中的模式将会被立即执行。
Jason Guo:
回复 Fuchong Wang:
请详细描述下 “现过一段时间单片机就无法从低功耗模式下退出”的详细现象。
F5510芯片本身不会出现这种问题。
请排除应用层面的影响。
建议用加些测试代码来确认是那个层面的问题。
liangliang lou:
回复 Jason Guo:
非常感谢您们的回答,这几天我重新改写了一下程序,在重新测试,看是否还出现上面这个问题,
licheng Li:
回复 liangliang lou:
你好,请问你后来解决这个现象了吗?我们现在用F67XX似乎也出现类似现象了