打印

MSP430低功耗+喂狗问题请教

[复制链接]
4211|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pluto55|  楼主 | 2014-1-26 15:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dirtwillfly 于 2014-1-26 21:50 编辑

现需求低功耗,
1.想使用LPM3的低功耗模式,
2.内部看门狗需要开启,打算看门狗直接使用VLO驱动的ACLK
问题:
1.是否在中断中喂狗?正确的喂狗方法是什么
2.我用定时中断唤醒的话,定时器只能使用VLO时钟,VLO晶振精度变化范围较大,这样会导致定时时间不准。
3.网上看到一个这样的问题:
4%的故障率,我也是打算这样用的,到底是咋回事呢?
@dirtwillfly @地瓜patch

相关帖子

沙发
dirtwillfly| | 2014-1-26 21:51 | 只看该作者
帮楼主编辑了一下,技术没有国界,但论坛是有界限的,希望能理解。

使用特权

评论回复
板凳
dirtwillfly| | 2014-1-26 21:56 | 只看该作者
只要能再要求的时间里喂狗,在哪里为都行。使用msp430的低功耗模式,在中断里喂狗也很常见。
没遇到过你链接说的问题,我怀疑和msp430的电源电路有关系

使用特权

评论回复
地板
dirtwillfly| | 2014-1-26 21:59 | 只看该作者
那个电平下降的弧形曲线很奇怪

使用特权

评论回复
5
dirtwillfly| | 2014-1-26 22:00 | 只看该作者
ACLK输出端口的原理图:

使用特权

评论回复
6
shenmu2012| | 2014-1-26 23:22 | 只看该作者
dirtwillfly 发表于 2014-1-26 21:56
只要能再要求的时间里喂狗,在哪里为都行。使用msp430的低功耗模式,在中断里喂狗也很常见。
没遇到过你链 ...

中断中喂狗是常见的处理方式的 ,我一般的都会在定时中断中做为狗处理的

使用特权

评论回复
7
pluto55|  楼主 | 2014-1-27 09:35 | 只看该作者
本帖最后由 pluto55 于 2014-1-27 09:55 编辑
dirtwillfly 发表于 2014-1-26 21:56
只要能再要求的时间里喂狗,在哪里为都行。使用msp430的低功耗模式,在中断里喂狗也很常见。
没遇到过你链 ...

while(1)
{
进入低功耗;line1
喂狗代码;  line2
代码;      line3
代码;      line4
}
定时中断处理
{
低功耗唤醒;
}
line1进入低功耗之后,CPU停止工作,所以line2喂狗代码是不会执行的,定时中断到后低功耗唤醒,CPU会接着上次停止的时候进行,也就是会执行line2喂狗代码,然后是line3\line4直到又循环到了line1进入低功耗
这样理解可对?

使用特权

评论回复
8
pluto55|  楼主 | 2014-1-27 10:13 | 只看该作者
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能中断必然能检测到死循环或系统状态是否正常,在不正常时复位系统了,仅供参考。


使用特权

评论回复
9
dirtwillfly| | 2014-1-27 11:05 | 只看该作者
本帖最后由 dirtwillfly 于 2014-1-27 11:07 编辑
pluto55 发表于 2014-1-27 09:35
while(1)
{
进入低功耗;line1

msp430进入低功耗模式,被中断唤醒进行入中断服务程序后,如果在中断服务程序里没有退出低功耗模式的程序指令的话,在退出中断服务程序后,仍然进入低功耗模式。
若是在中断服务程序中有退出低功耗模式的指令,会按照你说的进行执行。

使用特权

评论回复
10
pluto55|  楼主 | 2014-1-27 14:03 | 只看该作者
dirtwillfly 发表于 2014-1-27 11:05
msp430进入低功耗模式,被中断唤醒进行入中断服务程序后,如果在中断服务程序里没有退出低功耗模式的程序 ...

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


return_from_interrupt.bmp (705.76 KB )

退出中断

退出中断

使用特权

评论回复
11
shenpingbing| | 2014-1-29 20:53 | 只看该作者
看datasheet应该没问题的

使用特权

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

本版积分规则

9

主题

88

帖子

2

粉丝