使用开发板:FS4412,Soc:Exynos4412,内核型号:cortex-A9,架构:armv7;
文档:开发板原理图,Soc数据手册;
环境:文件编写及编译:Linux;下载程序:超级终端hypertrm;串口下载
编译器:交叉编译器arm
文章目录
一 看门狗定时器
1 什么是看门狗定时器
1.1 看门狗是啥?
要是按着教科书上的来学的话,里面的概念就够我们吃一天了,做开发就讲究一个短平快,不要整那些没用的,你把课本上概念默写了就能把代码写出来?正经人谁还看教材啊。
还有,别整喂狗那套,本来学习就够繁琐,还要想狗那套,还要联系到定时器上,累不累啊。
看门狗就是一个定时器,你设定一个时间,时间到了看门狗执行复位,就这么简单;
1.2 看门狗有什么用?
(1) 到时间就复位,这不是捣乱吗?不行!
哎,我在时间到之前把定时器的值给改了,不就到不了触发复位的条件了,好。
(2) 怎么改?
我在时间到之前把定时器改成初始值,即让它重新开始计时,我还周期性地改,让这个定时器一直计时,但是一直都到不了设定的时间,也就一直不会复位。
(3) 到底实现了什么功能:防止程序异常跑飞;
跑飞:就是程序不知道跑到哪里去了,不受控制,不做任何相应,卡死也是一种跑飞;
(4) 对于那些在没有人监控的条件下运行的程序,无法知道什么时候可能会异常,不能及时地去复位它;现在有了看门狗,设定一个时间让它计时;在用户代码中周期性地把它的计数值复原,阻止其复位程序;当用户程序异常跑飞,脱离了用户程序的看门狗计时器到达设定值就把程序复位,让其恢复正常运行状态;
(5) 所以说,看门狗的到点复位,在程序正常运行时是毒瘤,在程序跑飞时是救星;
2 看门狗的使用
2.1 查硬件电路
看门狗定时器是soc的内部外设,工作时不需要用到引脚:
2.2 查寄存器
如图,8-15位设置第一辑分频,3-4位选择第二级分频,第5位控制看门狗的开启与关闭,第2位控制是否中断,第0位设置到达时间是否复位,也就是说,既可以选择到时间中断也可以选择到时间重启,本次我们只选重启;
第0-15位设置计数器最大值,由第一张框图可以看出,这里的wdt是递减型计时器;
2.3 编程
下图的程序中,开启了看门狗但是没用复原操作,只放了流水灯,现象为到达设定时间后程序复位,由于程序是烧录到内存中的,所以直接复位导致程序丢失;流水灯全灭无现象;
/* main.c */
#include "led.h"
#include "wdt.h"
void init()
{
led_init();
wdt_init();
}
int main()
{
init();
while(1)
{
streamled();//流水灯;
}
return 0;
}
下图的主程序中加入了复原操作,程序不再复位,流水灯一直运转;
/* main.c */
#include "led.h"
#include "wdt.h"
void init()
{
led_init();
wdt_init();
}
int main()
{
init();
while(1)
{
streamled();
delay();
delay();
delay();
wdt_re;//复原操作
}
return 0;
}
/* wdt.c */
#include "wdt.h"
void wdt_init()
{
//设置一级250分频,
WTCON&=~(0xff<<8);
WTCON|= (249 <<8);
//设置二级128分频;
WTCON&=~(0x3<<3);
WTCON|= (0x3<<3);
//分频后频率为3125hz;计数器值为15625,即定时5s;
//设置计时器初值;
wdt_re;
//使能reset
WTCON|=1;
//开启
WTCON|=1<<5;
}
/* wdt.h */
#ifndef _WDT_H_
#define _WDT_H_
#define uint unsigned int
#define<