看門狗
當程序異常(死機),可以自動重啓。
看門狗定時器
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);//延時時間未到,阻塞等待
}