久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 大俠發個STC51定時器喂狗代碼 學習一下 [打印本頁]

作者: sr861126    時間: 2023-6-16 11:51
標題: 大俠發個STC51定時器喂狗代碼 學習一下
謝謝大家

作者: angmall    時間: 2023-6-16 14:13
不要在定時器中斷中喂狗,那將是一條寵物狗!

用定時器喂狗不合適吧,主程序跑飛了,但定時器仍舊喂狗,不能復位系統. 應該在主程序loop里面加喂狗指令, 程序跑飛,超時不能喂狗重啟系統.
作者: chxelc    時間: 2023-6-16 14:57
// 看門狗程序 開始------------------------------------------------

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

WDT_CONTR = 0x37; //清看門狗,否則系統復位(喂狗)通常放在mainWhile(1)循環體中 注意喂狗間隔不能超過8秒
作者: npn    時間: 2023-6-16 18:36
angmall 發表于 2023-6-16 14:13
不要在定時器中斷中喂狗,那將是一條寵物狗!

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

不光是定時器中斷,任何中斷內或被中斷調用的函數都不能喂狗。
作者: coody_sz    時間: 2023-6-16 21:14
喂狗只在主循環喂一次。
作者: rayin    時間: 2023-6-17 07:40
定時器是硬件, 獨立于單片機程序執行運行的, 單片機程序跑飛死機了, 定時器還能持續喂狗, 單片機異常后是不能復位重啟的.
作者: sr861126    時間: 2023-6-17 08:26
chxelc 發表于 2023-6-16 14:57
// 看門狗程序 開始------------------------------------------------

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

  那怎么計算出每個函數執行的時間,執行完后剛好喂狗呢?
作者: 188610329    時間: 2023-6-17 13:47
sr861126 發表于 2023-6-17 08:26
那怎么計算出每個函數執行的時間,執行完后剛好喂狗呢?

看門狗不是去算主循環需要跑多少時間,實際上你也算不出來,因為每次循環的時間是不確定的,一旦有中斷觸發,主循環,一個循環的時間就會被延長。
而是你自己定義一個忍耐極限,就好像電腦多久沒有反應了,你判定認為死機了,然后強制重啟?
看門狗一個道理,比如,程序比較復雜的,中斷比較多的,你定義個3秒,沒有完成一個循環,說明死機了,那么就重啟,就定義3秒,反正每次喂3秒,超時了就重啟。 程序比較簡單的,可以定義個 200ms,只要循環超過200ms 就重啟。 看你自己的“忍耐極限”
作者: chxelc    時間: 2023-6-17 14:47
sr861126 發表于 2023-6-17 08:26
那怎么計算出每個函數執行的時間,執行完后剛好喂狗呢?

時間不一定要剛剛好,提前喂狗也是可以的。例如8秒的看門狗,1秒喂狗也是可以的。
只要不影響程序的運行,你勤快點喂狗,愛狗人士會表揚你的。

如果程序塊或者函數執行時間超過8秒,就需要在函數或語句塊中加入喂狗語句。
關于函數執行的時間,要熟悉下硬件才能估算,1T的單片機,語句執行是很快的,耗時大多在循環或者延時函數上。
作者: chxelc    時間: 2023-6-17 14:49
發一個STC官網的STC15系列的看門狗測試程序供參考

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 看門狗溢出復位測試舉例------------------------*/
/* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序        */
/* 如果要在文章中應用此代碼,請在文章中注明使用了STC的資料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯
//若無特別說明,工作頻率一般為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;     //測試口

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);           //復位閃燈延時
    P32 = 1;
    WDT_CONTR = 0x04;       //看門狗定時器溢出時間計算公式: (12 * 32768 * PS) / FOSC (秒)
                            //設置看門狗定時器分頻數為32,溢出時間如下:
                            //11.0592M : 1.14s
                            //18.432M  : 0.68s
                            //20M      : 0.63s
    WDT_CONTR |= 0x20;      //啟動看門狗
    while (1);
}


作者: chxelc    時間: 2023-6-17 15:19
發個測試看門狗的代碼供參考:

#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;                           //使能看門狗,溢出時間約為0.5s
    WDT_CONTR = 0x24;                           //使能看門狗,溢出時間約為1s
//  WDT_CONTR = 0x27;                           //使能看門狗,溢出時間約為8s
    P32 = 0;                                    //測試端口

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

//      Display();                              //顯示模塊
//      Scankey();                              //按鍵掃描模塊
//      MotorDriver();                          //電機驅動模塊
    }
}

作者: Y_G_G    時間: 2023-6-18 17:46
喂狗直接放在主函數
主函數執行時間是不好算出來的,特別是用KEIL來仿真STC
在主函數放一行取反一個IO的代碼,用示波器或者邏輯分析儀測量就知道運行時間了
喂狗時間大于這個時間就可以子
作者: yzwzfyz    時間: 2023-6-19 09:03
喂狗就一條指令而矣。
關鍵是,你要弄清楚看門狗的應用原理,原理通了,寫一個喂狗語句還值得一提。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲精品国产电影 | 一级全黄少妇性色生活免费看 | 亚洲三级国产 | 国产高清视频一区二区 | 久久99精品久久久久 | 99热国产免费 | 二区成人| 久久国产精品视频 | 蜜桃免费av| 国产一级一级毛片 | 黑人巨大精品欧美一区二区免费 | 欧美日韩在线一区二区 | 99在线国产 | 久久午夜影院 | 青青草原综合久久大伊人精品 | 久久国产精品99久久久久久丝袜 | 亚洲精品福利视频 | 亚洲一区中文字幕在线观看 | 久久精品日产第一区二区三区 | 亚洲国产精品一区二区久久 | 美女黄视频网站 | 国产精品一区二区在线 | 国产激情 | 九九激情视频 | 中文字幕日韩一区 | 日韩欧美视频免费在线观看 | 久久一区二区免费视频 | 国产一区二区三区四区 | 一级毛片在线播放 | 国精产品一区二区三区 | 91亚洲国产精品 | 日韩一区二区三区在线视频 | 久久久久久久久久性 | 国产a级毛毛片 | 欧美v日韩 | 一级做a爰片性色毛片16美国 | 欧美一区二区三区免费在线观看 | 国产精品久久亚洲 | 亚洲97| 国产美女在线播放 | 日本视频中文字幕 |