8187|10

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】退出低功耗 [复制链接]

我用的是149,初始化后让其进入低功耗状态,我用一个端口实现外部中断,可不可以在中断执行完成后,让其退出低功耗,并继续往下执行主程序。(因为主程序比较复杂,无发都写到中断程序中执行)
谢谢!

最新回复

不太明白上楼的意思,干嘛要全退出啊,能不能说的详细点啊?  详情 回复 发表于 2009-4-27 23:36
 
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这要根据你程序结构决定了。
一般在main()中完成初始化后,进入一个死循环,在这个死循环体中执行完进入低功耗,系统就等待中断。此时CPU将不再执行进入低功耗语句后面的程序。

当某个中断发生后,并执行完全部中断任务的最后,执行一条退出低功耗语句,然后返回中断。

此时CPU将继续执行main()中那个死循环中“进入低功耗”后面的所有语句。若在后续语句中又有“进入低功耗”语句,则CPU又进入该语句指定的低功耗模式等待系统再次中断。如此直到死循环体的末尾后回到该循环体的开始重复上述过程。

所以,只要在众多中断源的情况下,只要安排某一个中断程序中执行一条退出低功耗语句,就使CPU退出了低功耗,直到再次执行进入低功耗语句。这完全取决于你的主程序结构是怎样设计的。
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我照着上述说法试了一下。
我进入的是最低的功耗模式LPM4,也是在死循环中写的进入低功耗程序,并在中断函数的最后一步写的推出低功耗语句,发现退出低功耗以后并没有继续执行死循环中进入低功耗语句的后面继续执行,而是从主程序的第一条语句重新执行,然后自然又进入了低功耗。
我又试着改成LPM3,不知道什么原因,进入低功耗以后自动复位了,又重新开始执行主程序。
进入与退出低功耗语句如下(参照头文件)
_BIS_SR(LPM3_bits);
_BIC_SR_IRQ(LPM3_bits);

盼回复,谢谢!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
我现在让程序全部执行一遍再进入低功耗,确实可以由外部中断唤醒,重新执行程序.可遇到一个问题,我没有加外部中断,可程序还是过了一段时间,自己重新开始执行.
我怀疑是其他外部中断引起的唤醒,所以我在进入低功耗的程序中关断了总中断.可奇怪的是为什么还是可以由外部中断唤醒,而且还是过了一段时间自动复位从头执行.
望高手给予指点,谢谢!
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
应该没有问题的,我的程序基本也是这样一个结构。检查一下相关程序是否有对MCU的各个寄存器有可能出现的误操作。

另外,最好在进入低攻耗语句后的第一条语句,安排为“_NOP();”语句试试。
退出低功耗建议采用“LPM4_EXIT”的表示方式,这样不容易出错。

关于自动复位问题,应该与进/出低功耗无关。是否与WDT相关?或是错误写FLASH等等。

似乎你的主程序的死循环中“LPM4”后有很多代码?
建议你调整一下主程序结构,把所有的子功能都写成独立的函数,主程序中只是调用这些函数,若有必要设置一定的状态变量作为是否执行某个函数的标志。这样有利于排错(逐个屏蔽函数调用)。同时,整个程序的可读性和可维护性都很强。

我曾经也碰到了一个和你类似的问题:在主程序中,退出低功耗后调用函数返回时PC指针出错,用逐个屏蔽方法,终于找到了是因为使用数组指针时,超数组上界,结果把SP意外改写,造成返回出错!你的情况我估计与我相似。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 

自动复位的情况已经解决,又碰到一个新的问题,还是进入LPM4后,由外部中断(PORT2)唤醒程序,我在中断函数中想控制一个灯闪烁,我用定时器做的延时函数,即增计时控制,每到一次定时记数时间(CCR0 = 1000); 即产生一次中断,我查了一下,PORT2产生的中断是最低级的,是不是应该定时器产生的定时可以正常实现,然后再继续执行PORT2产生的中断函数.可我做的是,无法实现定时功能,直接唤醒CPU,从头开始执行.

不是很明白这里的中断嵌套问题!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
我不太明白你的P2中断与定时器的关系。我在想,你是不是欲实现这种功能:
1、在P2的第一次中断时,将某个控制灯的端口(非P1、P2口)输出1电平让灯亮。然后启动定时器(比如TA)计数后返回中断。
2、当TA中断时又将控制灯的端口输出状态翻转(让灯熄灭或再次点亮)。
3、在P2的第二次中断时,又将控制灯的端口输出0电平(关灯),然后停止TA计数产生中断。
如此周而复始?

如果这样,应该不要搞什么中断嵌套。P2中断执行完后,TA中断自然会响应,反之亦然。
只是二者在同时中断时有个中断优先问题。这种灯闪烁的控制不会出现这种不同步的情况吧。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 
是我说的不太明白。
其实是我想做的程序无法避免中断嵌套,在上面只是举了个例子,为的就是实验一下中断优先级。
是这样,在P2中断函数中是想让一个灯(别的口驱动的),点亮后,延时一段时间在关断,而这段延时函数是我另外做的。是用TA的增计时功能做的,我设的是(CCR0 = 1000); 用8M 晶震八分频做的TA时钟,这样的话,TA每次中断只能延时10E-3s,所以我在延时函数中设置了一变量,控制其执行1000次,这样可实现延时一秒。
现在是TA没法连续执行1000次,它只执行一次,产生的中断,就将系统重新复位了。
正确的是不是应该TA完成全部延时,跳到P2那层中断,在继续执行P2中断后面的程序。因为TA的中断优先级比P2高啊!
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

9
 
我明白你的意思了。

正如你所说的,在TA中使用8M晶振8分频是不可能达到一次间隔1s中断。所以在这种情况下,就更不应该采用在P2中断里嵌套定时器多次延时后,达到1秒后再从P2中断中返回的方案。
且不说这在430中不可能实现(中断优先级的问题),即便能够实现(比如采用其它的CPU来做)这种方案也是不可取的。首先这是一个单线程的运行模式,CPU在P2中断中等待TA的n次中断完成后再返回,这对系统资源是一个极大的浪费。在多源中断系统中实时性极差,还不如直接软件循环延时来得方便!
再有,你所说的“TA只执行了一次中断,就将系统重新复位了”,其实并不是你观察到的只有一次中断(你大概是设置断点或单步跟踪观察的结果)。应该是在C-SPY停在断点处时,TA已经产生了n次中断,只是后面的中断C-SPY没有响应,而是在C-SPY环境的中断队列中等待而已。当继续执行时可能已经造成堆栈溢出而使系统复位!(没有实践过,仅从理论分析推断的,供参考)
所以,我认为仍然应该采用前面我的回复中建议的方案:既不进行P2中断中嵌套TA中断,而是P2中断和TA中断平行的方案。
不同的是:
1、在P2中断中使用一个(公用)变量作为TA中断次数的计数器,在TA中断中只对该计数器累加。

2、在该计数器值未达到预置值(1000)时,不选择“退出低功耗”从P2中断返回;当达到预置值时选择“退出低功耗”,并将计数器清零后从P2中断返回。

这样就可以达到同一目的。不妨试试。
我的系统中就有在P1口做继电器触点脉冲输入的上升沿中断时,启动BT延时10ms(消抖)后,再读取P1口输入状态,采用的就是这个方法。这和你的“P2口中断开灯,亮灯用TA延时1秒熄灭”是异曲同工的。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
信得过我的可是试试这个:

在中断程序中使用如下语句:

LPM0_EXIT;//退出低功耗模式0
LPM3_EXIT;//退出低功耗模式3
LPM4_EXIT;//退出低功耗模式4
。。。

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
不太明白上楼的意思,干嘛要全退出啊,能不能说的详细点啊?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表