找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2601|回復(fù): 12
收起左側(cè)

大俠發(fā)個(gè)STC51定時(shí)器喂狗代碼 學(xué)習(xí)一下

[復(fù)制鏈接]
ID:302293 發(fā)表于 2023-6-16 11:51 | 顯示全部樓層 |閱讀模式
謝謝大家
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2023-6-16 14:13 | 顯示全部樓層
不要在定時(shí)器中斷中喂狗,那將是一條寵物狗!

用定時(shí)器喂狗不合適吧,主程序跑飛了,但定時(shí)器仍舊喂狗,不能復(fù)位系統(tǒng). 應(yīng)該在主程序loop里面加喂狗指令, 程序跑飛,超時(shí)不能喂狗重啟系統(tǒng).
回復(fù)

使用道具 舉報(bào)

ID:712097 發(fā)表于 2023-6-16 14:57 | 顯示全部樓層
// 看門狗程序 開(kāi)始------------------------------------------------

WDT_CONTR = 0x27; //使能看門狗,溢出時(shí)間約為8s 通常放在main函數(shù)初始化區(qū)域

WDT_CONTR = 0x37; //清看門狗,否則系統(tǒng)復(fù)位(喂狗)通常放在mainWhile(1)循環(huán)體中 注意喂狗間隔不能超過(guò)8秒
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2023-6-16 18:36 | 顯示全部樓層
angmall 發(fā)表于 2023-6-16 14:13
不要在定時(shí)器中斷中喂狗,那將是一條寵物狗!

用定時(shí)器喂狗不合適吧,主程序跑飛了,但定時(shí)器仍舊喂狗,不 ...

不光是定時(shí)器中斷,任何中斷內(nèi)或被中斷調(diào)用的函數(shù)都不能喂狗。
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2023-6-16 21:14 | 顯示全部樓層
喂狗只在主循環(huán)喂一次。
回復(fù)

使用道具 舉報(bào)

ID:517951 發(fā)表于 2023-6-17 07:40 | 顯示全部樓層
定時(shí)器是硬件, 獨(dú)立于單片機(jī)程序執(zhí)行運(yùn)行的, 單片機(jī)程序跑飛死機(jī)了, 定時(shí)器還能持續(xù)喂狗, 單片機(jī)異常后是不能復(fù)位重啟的.
回復(fù)

使用道具 舉報(bào)

ID:302293 發(fā)表于 2023-6-17 08:26 | 顯示全部樓層
chxelc 發(fā)表于 2023-6-16 14:57
// 看門狗程序 開(kāi)始------------------------------------------------

WDT_CONTR = 0x27; //使能看門狗 ...

  那怎么計(jì)算出每個(gè)函數(shù)執(zhí)行的時(shí)間,執(zhí)行完后剛好喂狗呢?
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2023-6-17 13:47 | 顯示全部樓層
sr861126 發(fā)表于 2023-6-17 08:26
那怎么計(jì)算出每個(gè)函數(shù)執(zhí)行的時(shí)間,執(zhí)行完后剛好喂狗呢?

看門狗不是去算主循環(huán)需要跑多少時(shí)間,實(shí)際上你也算不出來(lái),因?yàn)槊看窝h(huán)的時(shí)間是不確定的,一旦有中斷觸發(fā),主循環(huán),一個(gè)循環(huán)的時(shí)間就會(huì)被延長(zhǎng)。
而是你自己定義一個(gè)忍耐極限,就好像電腦多久沒(méi)有反應(yīng)了,你判定認(rèn)為死機(jī)了,然后強(qiáng)制重啟?
看門狗一個(gè)道理,比如,程序比較復(fù)雜的,中斷比較多的,你定義個(gè)3秒,沒(méi)有完成一個(gè)循環(huán),說(shuō)明死機(jī)了,那么就重啟,就定義3秒,反正每次喂3秒,超時(shí)了就重啟。 程序比較簡(jiǎn)單的,可以定義個(gè) 200ms,只要循環(huán)超過(guò)200ms 就重啟。 看你自己的“忍耐極限”
回復(fù)

使用道具 舉報(bào)

ID:712097 發(fā)表于 2023-6-17 14:47 | 顯示全部樓層
sr861126 發(fā)表于 2023-6-17 08:26
那怎么計(jì)算出每個(gè)函數(shù)執(zhí)行的時(shí)間,執(zhí)行完后剛好喂狗呢?

時(shí)間不一定要?jiǎng)倓偤,提前喂狗也是可以的。例?秒的看門狗,1秒喂狗也是可以的。
只要不影響程序的運(yùn)行,你勤快點(diǎn)喂狗,愛(ài)狗人士會(huì)表?yè)P(yáng)你的。

如果程序塊或者函數(shù)執(zhí)行時(shí)間超過(guò)8秒,就需要在函數(shù)或語(yǔ)句塊中加入喂狗語(yǔ)句。
關(guān)于函數(shù)執(zhí)行的時(shí)間,要熟悉下硬件才能估算,1T的單片機(jī),語(yǔ)句執(zhí)行是很快的,耗時(shí)大多在循環(huán)或者延時(shí)函數(shù)上。
回復(fù)

使用道具 舉報(bào)

ID:712097 發(fā)表于 2023-6-17 14:49 | 顯示全部樓層
發(fā)一個(gè)STC官網(wǎng)的STC15系列的看門狗測(cè)試程序供參考

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 看門狗溢出復(fù)位測(cè)試舉例------------------------*/
/* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
/* 如果要在文章中應(yīng)用此代碼,請(qǐng)?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil開(kāi)發(fā)環(huán)境下請(qǐng)選擇Intel的8058芯片型號(hào)進(jìn)行編譯
//若無(wú)特別說(shuō)明,工作頻率一般為11.0592MHz


#include "reg51.h"
#include "intrins.h"

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr WDT_CONTR   = 0xc1;     //看門狗控制寄存器
sbit P32        = P3^2;     //測(cè)試口

void delay(unsigned int i)
{
    while (i--)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    P32 = 0;
    delay(10000);           //復(fù)位閃燈延時(shí)
    P32 = 1;
    WDT_CONTR = 0x04;       //看門狗定時(shí)器溢出時(shí)間計(jì)算公式: (12 * 32768 * PS) / FOSC (秒)
                            //設(shè)置看門狗定時(shí)器分頻數(shù)為32,溢出時(shí)間如下:
                            //11.0592M : 1.14s
                            //18.432M  : 0.68s
                            //20M      : 0.63s
    WDT_CONTR |= 0x20;      //啟動(dòng)看門狗
    while (1);
}

回復(fù)

使用道具 舉報(bào)

ID:712097 發(fā)表于 2023-6-17 15:19 | 顯示全部樓層
發(fā)個(gè)測(cè)試看門狗的代碼供參考:

#include "reg51.h"

sfr     WDT_CONTR   =   0xc1;
sbit    P32         =   P3^2;

sfr     P0M1        =   0x93;
sfr     P0M0        =   0x94;
sfr     P1M1        =   0x91;
sfr     P1M0        =   0x92;
sfr     P2M1        =   0x95;
sfr     P2M0        =   0x96;
sfr     P3M1        =   0xb1;
sfr     P3M0        =   0xb2;
sfr     P4M1        =   0xb3;
sfr     P4M0        =   0xb4;
sfr     P5M1        =   0xc9;
sfr     P5M0        =   0xca;

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

//  WDT_CONTR = 0x23;                           //使能看門狗,溢出時(shí)間約為0.5s
    WDT_CONTR = 0x24;                           //使能看門狗,溢出時(shí)間約為1s
//  WDT_CONTR = 0x27;                           //使能看門狗,溢出時(shí)間約為8s
    P32 = 0;                                    //測(cè)試端口

    while (1)
    {
//      WDT_CONTR = 0x33;                       //清看門狗,否則系統(tǒng)復(fù)位
        WDT_CONTR = 0x34;                       //清看門狗,否則系統(tǒng)復(fù)位
//      WDT_CONTR = 0x37;                       //清看門狗,否則系統(tǒng)復(fù)位

//      Display();                              //顯示模塊
//      Scankey();                              //按鍵掃描模塊
//      MotorDriver();                          //電機(jī)驅(qū)動(dòng)模塊
    }
}
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2023-6-18 17:46 | 顯示全部樓層
喂狗直接放在主函數(shù)
主函數(shù)執(zhí)行時(shí)間是不好算出來(lái)的,特別是用KEIL來(lái)仿真STC
在主函數(shù)放一行取反一個(gè)IO的代碼,用示波器或者邏輯分析儀測(cè)量就知道運(yùn)行時(shí)間了
喂狗時(shí)間大于這個(gè)時(shí)間就可以子
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2023-6-19 09:03 | 顯示全部樓層
喂狗就一條指令而矣。
關(guān)鍵是,你要弄清楚看門狗的應(yīng)用原理,原理通了,寫一個(gè)喂狗語(yǔ)句還值得一提。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表