MSP430低功耗+喂狗问题请教

2019-08-06 21:18发布

本帖最后由 dirtwillfly 于 2014-1-26 21:50 编辑

现需求低功耗,
1.想使用LPM3的低功耗模式,
2.内部看门狗需要开启,打算看门狗直接使用VLO驱动的ACLK
问题:
1.是否在中断中喂狗?正确的喂狗方法是什么
2.我用定时中断唤醒的话,定时器只能使用VLO时钟,VLO晶振精度变化范围较大,这样会导致定时时间不准。
3.网上看到一个这样的问题:
4%的故障率,我也是打算这样用的,到底是咋回事呢?
@dirtwillfly @地瓜patch
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
pluto55
1楼-- · 2019-08-07 08:51
shenmu2012 发表于 2014-1-26 23:22
中断中喂狗是常见的处理方式的 ,我一般的都会在定时中断中做为狗处理的 ...

网上看到HotPower大侠关于这个问题的理解:

    这样就归类为网上长期争论不休的2种喂狗方法。即“主程序喂狗论”和“中断喂狗论”。
实际上2种方法都有缺点!!!        
    “主程序喂狗论”提出:  在系统进入一个不正常的循环时,中断喂狗仍然起作用,看门狗
                    失去它本来的作用。
    “中断喂狗论”也可提出:在系统运行一个很正常的循环时,主程序喂狗在起作用,看门狗
                    保持它本来的作用。但是在中断被意外关断不能有效工作时,主程序“正常”
                    有何实际意义???
    为什么要叫“狗”呢???因为狗记路是靠撒尿的~~可能菜农说话粗鲁~~~

当程序经过某处时,要置标志说明程序已在此处运行过,如狗撒尿一般。

通常在主循环即后台的某处设置一标志(俗称软狗标志),在中断(一般在定时器)即前台的某处
检测此软狗标志,若有则认为主程序此时运行正常,否则不喂狗直到狗咬人(复位)。
反之也可在前台设置软狗标志,在后台真正喂狗。

这种方法是前后台依据软狗标志互相沟通以达到正确而有效的喂狗目的。
而此种方法的中断喂狗一般用于低功耗的系统中,它的优点是喂狗周期固定,而且很容易做到在
一处真正喂狗。
此种方法的主循环喂狗的缺点是喂狗周期相对不固定,有可能需要多处喂狗。

下面这个代码是中断喂狗的示例:
我觉得还是不错的,尽量都照顾到了:
uint SoftWatchDog; // 软件看门狗
void main(void)
{
系统初始化并启动硬件看门狗;
while(1)
{
执行主程序任务;
SoftWatchDog = 0; // 复位软件看门狗
}
}

void IntT2(void) interrupt 5 using 1
{
复位硬件看门狗;
WatchSystem(); // 监测系统
执行其它任务;
}

void WatchSystem(void)
{
if (++SoftWatchDog >= 设定值) // 系统监测 ,当然还可以监测系统的其它状态
系统复位;
}

如果T2不能进入中断必然导致硬件看门狗复位系统,如果T2能中断必然能检测到死循环或系统状态是否正常,在不正常时复位系统了,仅供参考。


dirtwillfly
2楼-- · 2019-08-07 13:06
本帖最后由 dirtwillfly 于 2014-1-27 11:07 编辑
pluto55 发表于 2014-1-27 09:35
while(1)
{
进入低功耗;line1

msp430进入低功耗模式,被中断唤醒进行入中断服务程序后,如果在中断服务程序里没有退出低功耗模式的程序指令的话,在退出中断服务程序后,仍然进入低功耗模式。
若是在中断服务程序中有退出低功耗模式的指令,会按照你说的进行执行。
pluto55
3楼-- · 2019-08-07 14:02
dirtwillfly 发表于 2014-1-27 11:05
msp430进入低功耗模式,被中断唤醒进行入中断服务程序后,如果在中断服务程序里没有退出低功耗模式的程序 ...

是的,一进入中断,SR被清零,所有中断模式被退出,
退出中断时SR的值会恢复到初始状态,即仍然是低功耗模式,除非有退出低功耗的代码


shenpingbing
4楼-- · 2019-08-07 16:41
 精彩回答 2  元偷偷看……

一周热门 更多>