概述
看门狗
当程序异常(死机),可以自动重启。
看门狗定时器
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=%drn",a);
wdt_init_exit();
while(1)
{
printf("tic=%urn",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);//延时时间未到,阻塞等待
}
最后
以上就是留胡子白开水为你收集整理的8.7、ARM接口编程 -- 看门狗的全部内容,希望文章能够帮你解决8.7、ARM接口编程 -- 看门狗所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复