8.7、ARM接口編程 -- 看門狗

看門狗
當程序異常(死機),可以自動重啓。

看門狗定時器
WTCON 預分頻寄存器
[15:8] = 0xff 對總線時鐘做除法,降低頻率
[5] =1 啓用wdt
[4:3] = 3 固定分頻
[2] = 1 使能中斷
[0] = 1 使能復位信號

WTDAT 重載寄存器 [15:0]

WTCNT [15:0] 減法計數寄存器 = 15259

WTCLRINT 中斷清除寄存器
在這裏插入圖片描述
1、定時5S?
系統時鐘 100M
100M/128 / (255+1)
計數15259 定時5s
1K = 100M/固定分頻/預分頻/重載值
16(00) 9+1 625

y*c = 100M/16/1K = 6250

2、使用看門狗定時器實現sleep
(1)、看門狗爲中斷模式
(2)、GIC WDT中斷
(3)、do_irq處理wdt中斷

/*****************************************************************
*   Copyright (C) 2018 Sangfor Ltd. All rights reserved.
*   
*   文件名稱:watchdog.c
*   創 建 者:yinfei-hu
*   創建日期:
*   功能描述:看門狗		 
*
*****************************************************************/

#include"exynos_4412.h"
#include"uart.h"

unsigned int tic;//時間戳,每ms自增

//void wdt_init(void);
void wdt_init_exit(void);
void msleep(unsigned int ms);

int main()
{
    int a = 100;
    uart_init();
    printf("hello!a=%d\r\n",a);

    wdt_init_exit();
    
    while(1)
    {    
        printf("tic=%u\r\n",tic);
        msleep(1000);    
    }
    return 0;
}

void wdt_init_exit(void)
{
    WDT.WTCON = WDT.WTCON & ~(0XFF<<8) | 9<<8;//9+1
    WDT.WTCON &= ~(0X3<<3); //固定分頻16
    WDT.WTCNT = 625;
    WDT.WTDAT = 625;//自動重裝值爲625
    WDT.WTCON &= ~1;//不使能復位
    WDT.WTCON |= 1<<2;//使能中斷
    WDT.WTCON |= 1<<5;//啓動wdt
    //配置wdt GIC   ID 75
    ICDDCR = 1; //開總中斷
    ICDISER.ICDISER2 |= 1<<11;//使能端口中斷
    ICDIPR.ICDIPR18 &= ~(0xff<<24);//設置端口優先級
    ICDIPTR.ICDIPTR18 = ICDIPTR.ICDIPTR18 & ~(0xff<<24) | 0x1<<24;//中斷處理送CPU0
    //設置cpu0使能中斷
    CPU0.ICCICR = 1;
    //CPU0中斷優先級過濾寄存器
    CPU0.ICCPMR = 255;
    tic = 0;
}

void do_irq(void)
{
    //get id
    int id;
    id = CPU0.ICCIAR;
    if(id == 75)
    {
        tic++;
        //清除中斷掛起
        WDT.WTCLRINT = 1;
        //清除gic中斷掛起
        ICDICPR.ICDICPR2 |= 1<<11;
    }
    //3、清除CPU中斷掛起
    CPU0.ICCEOIR = id;
}

void msleep(unsigned int ms)
{
    unsigned int ttic;
    ttic = tic;//獲取函數調用時的時間
    while(tic - ttic < ms);//延時時間未到,阻塞等待
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章