Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116427
  • 博文数量: 43
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-04 16:56
文章分类

全部博文(43)

文章存档

2011年(1)

2010年(2)

2008年(40)

我的朋友

分类:

2008-09-05 19:31:11

转自:
做个标记

s3c2410 watchdog的操作

对于s3c2410的watchdog来说,PCLK是它唯一的时钟信号源。
s3c2410用了3个寄存器对watchdog进行操作,3个寄存器分别为:WTCON,WTDAT,WTCNT。
WTCON:watchdog控制寄存器
WTDAT:watchdog数据寄存器
WTCNT:watchdog记数寄存器


Watchdog根据PCLK,Prescaler Value,Clock Select会产生一个watchdog自己的工作周期, t_watchdog= 1/ (PCLK / (Prescaler value + 1) / Division_factor)我们把这个工作周期记为,watchdog在一个 t_watchdog周期结束时会产生一个记数递减信号,每当这个信号产生时,WTCNT中的值便减1,若在WTCNT递减为0(Timer Out)的时候软件层还没有重新往WTCNT中写入数值(喂狗),则watchdog触发Reset Signal,系统重起。

根据上述的描述,我们可以更形象地描述watchdog的工作原理和3个寄存器之间的相互关系:

WTCNT通过WTDAT得到一个值,watchdog在每个t_watchdog周期里向WTCNT发送一个递减信号,当WTCNT的值递减到0的时候则发生time out,重而重起系统。

1:void enable_watchdog()
2:{
3:                rWTCON=0x7F81;
4:                rWTDAT=0x8000;
5:                rWTCON|=1<<5;
6:}

rWTCON,rWTDAT分别为寄存器WTCON,WTDAT的地址解引用,我如下定义他们

#define        rWTCON                (*(volatile unsigned int *)0x53000000)
#define        rWTDAT                (*(volatile unsigned int *)0x53000004)


从上面的设置我们可知寄存器WTCON的值为0x7F81,分解出来得:

Prescaler Value               =255
Division_factor                =16(Clock Select=16)
Interrupt Generation       =0(不产生中断)
Reset                            =1(开启Reset Signal)

注1:事实上,WTDAT和WTCNT这两个寄存器在系统上电之后会被硬件自动的填入两个初始值0x8000,开启watchdog之后, WTCNT并没有马上就把WTDAT中的值装入,而是使用初始值0x8000。在发生第一次time out之后,WTDAT寄存器中的值才会被真正的装载进WTCNT寄存器中

Prescaler Value位于寄存器WTCON的8至15位,其值为0~255
Division_factor由寄存器WTCON中的3~4位(Clock Select)决定,其值可以为00,01,10,11分别代表Division_factor的值为16,32,64,128

关于各个寄存器的详细信息请参考s3c2410的操作手册

看门狗应用程序的设计流程:

1设置看门狗中断操作,包括全局中断,看门狗使能,看门狗中断向量的定义

2看门狗WTCON的设计,其中包括预分频因子,分频器的分频值,中断使能和复位使能

3对看门狗寄存器WTDAT和看门狗计数寄存器WTCON的设置

4启动看门狗定时器

阅读(964) | 评论(0) | 转发(0) |
0

上一篇:2410 中断

下一篇:代价

给主人留下些什么吧!~~