实验5-2 看门狗实验

  • 格式:doc
  • 大小:46.50 KB
  • 文档页数:13

实验5-2 看门狗定时器应用实验

1、实验目的

􀁺 了解 watchdog 的作用

􀁺 掌握 S3C2410A 的watchdog 定时器的使用方法

2、实验内容

􀁺 实现看门狗复位

􀁺 编程实现看门狗喂狗

3、实验设备

􀁺 S3C2410A 开发板

􀁺 ADS1.2 集成开发环境,ARM 仿真器、串口连接线

4、实验原理

4.1 看门狗功能简述

嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系

统瘫痪。为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗

(watchdog)电路。看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。

4.2 看门狗的工作原理

其基本原理为:设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,

Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp 时刻

修改定时器的记数值,定时器将在Ti 时刻溢出,引发系统复位,使系统得以重新运行,从

而起到监控的作用。

4.3 S3C2410A 的看门狗

S3C2410A 的看门狗定时器有两个功能:

􀁺 作为常规时钟,并且可以产生中断;

􀁺 作为看门狗定时器使用,当时钟计数减为0(超时)时,它将产生一个128 个时钟

周期(PCLK)的复位信号。

主要特性如下:

􀁺 通用的中断方式的 16bit 定时器。

􀁺 当计数器减到 0(发生溢出),产生128 个PCLK 周期的复位信号。

下图为看门狗的电路示意图,看门狗时钟使用PCLK 作为他的时钟源,PCLK 通过预分

频产生适合的看门狗时钟。

看门狗模块包括一个预比例因子放大器,一个是四分频器,一个 16bit 计数器。看门狗

的时钟源来自PCLK,为了得到较宽范围的看门狗信号,PCLK 先被预分频,之后再经过分

频器分频。预分频比例因子的分频值,都可以由看门狗控制器(WTCON)决定,预分频值

的有效范围从0 到256-1。分频因子可以选择16、32、64 或者128。

看门狗定时器记数值的计算公式如下:

t_watchdog=1/ [PCLK/( prescaler value +1)/ Division_factor ]

看门狗的定时周期为 T=WTCH×t_watchdog

一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值不能被自动的装

载到看门狗计数器(WTCNT)中。因此,看门狗启动前要将一个初始值写入看门狗计数器

(WTCNT)中。

调试环境下的看门狗

当 S3C2410A 用嵌入式ICE 调试的时候,看门狗定时器的复位功能不能启动,看门狗

定时器能从CPU 内核信号判断出当前CPU 是否处于调试状态,如果看门狗定时器确定当前

模式是调试模式,尽管看门狗能产生溢出信号,但是仍然不会产生复位信号。

5、S3C2410A 相关寄存器

WTCON――看门狗定时器控制寄存器

看门狗控制寄存器能够禁止或者允许看门狗时钟,从四个不同的时钟源中挑选时钟信

号,允许或禁止中断,并且能允许或禁止看门狗时钟输出。如果用户想要使用看门狗作为普

通时钟,应该中断使能,禁止看门狗定时器复位。

WTDAT――看门狗定时器数据寄存器

WTDAT 用于设置看门狗定时器的超时时间值,在初始化看门狗过程中,WTDAT 的值

不会自动加载到定时计数器中,首次使用定时器超时值为其初始值即0x8000,以后该寄存

器的值会被自动加载到WTCNT 寄存器中。

WTCNT――看门狗定时器计数寄存器

WTCNT 为看门狗定时器工作的时间计数器的当前计数值,注意在初始化看门狗操作

后,看门狗数据寄存器(WTDAT)的值不能自动装载到看门狗计数寄存器(WTCNT)中,

所以看门狗被允许之前应该初始化看门狗计数寄存器的值。

6、实验程序

由于看门狗是对系统的复位或者中断的操作,所以不需要外围的硬件电路。要实现看门

狗的功能,只需要对看门狗的寄存器组进行操作。即对看门狗的控制寄存器(WTCON)、

看门狗数据寄存器(WTDAT)、看门狗计数寄存器(WTCNT)的操作。

设计流程如下:

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

频值、中断使能和复位使能等。

􀁺 对看门狗数据寄存器(WTDAT)和看门狗计数寄存器(WTCNT)的设置。

􀁺 启动看门狗定时器。

6.1 主功能函数

int Main(void)

{

ChangeClockDivider(1,1);

ChangeMPllValue(0xa1,0x3,0x1);

Port_Init();

Uart_Select(0);

Uart_Init(0,115200);

Uart_Printf("watchdog test is beginning\n");

watchdog_test();

while(1);

}

6.2 看门狗复位功能程序实现

void watchdog_test(void)

{

//Prescaler value=100; lock division factor=128 ;PCLK=67.5MHz

//t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.0002

//disable watchdog

rWTCON=((100<<8)|(3<<3));

//看门狗时钟周期T=WTCNT*t_watchdog=3S

//看门狗喂狗

rWTDAT=15000;

rWTCNT=15000;

//disable watchdog interrupt

rWTCON &= ~(3<<1);

//enable Watchdog timer;reset signal.

rWTCON|=((1<<5)|(1<<0));

while(1);

}

6.3 看门狗定时器功能程序实现

void watchdog_test(void)

{

{

//initialize interrupt registers

ClearPending(BIT_WDT);

//建立WatchDog 中断

pISR_WDT=(unsigned)watchdog_int;

//Prescaler value=100、clock division factor=128

//t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.00025856

//disable watchdog

rWTCON=((100<<8)|(3<<3));

//看门狗时钟周期T=WTCNT*t_watchdog=4S

//看门狗喂狗

rWTDAT=15000;

rWTCNT=15000;

rWTCON|=((1<<5)|(1<<2));//enable Watchdog timer ang watchdog interrupt

//rWTCON|=((1<<5)|(1<<2)|1);//watchdog 复位,时间间隔为4S。

rWTCON|=(1<<5)|(1<<2);//每4S watchdog 一次中断。

//设置watchdog 为IRQ 中断模式

rINTMOD&=0xFFFFFDFF;

//开中断

EnableIrq(BIT_WDT);

while(f_ucSencondNo<11);

}

/**** watchdog_int ****/

void __irq watchdog_int(void)

{

//清除中断

ClearPending(BIT_WDT);

f_ucSencondNo++;

if(f_ucSencondNo<11)

Uart_Printf("%ds",f_ucSencondNo);

else

{

//mask watchdog timer interrupt

DisableIrq(BIT_WDT);

Uart_Printf("watch dog is ok\n");

}

}

7、实验步骤

1. 连接好实验环境,将仿真器的一端通过并口连接到PC 机,将仿真器的另一端通过JTAG

线连接到GEC2410 的JTAG 接口。

2. 将串口线一端接到 PC 机,另一端接到GEC2410 的UART0 接口(即P1 口);打开串口超级终端dnw.exe,设置串口Baud Rate 为115200,选择COM1。

3. 重起 GEC2410,开发板会执行flash 中的BIOS 程序,选择GEC2410_Watchdog

目录下的可执行映象文件GEC2410_Watchdog.bin 将该文件下载到SDRAM。

4. 下载结束后,会提示是否要立即运行,这时输入“Y”,执行GEC2410_Watchdog.bin。

5. 在 dnw 中观察实验结果。

注意:

如果做看门狗复位功能实验,打开ADS CodeWarrior,在ADS CodeWarrior 中打开实验工程GEC2410_Watchdog.mcp;将文件watchdog_reset.c 加载到工程中,删除watchdog.c 文件,并对工程进行编译。

然后在对新的GEC2410_Watchdog.bin 按照上述方法下载到SDRAM 内调试,运行映象文件,从串口观察实验结果,经过几秒钟开发板重新启动,串口输出bios 字符。