基于WINCE6.0+S3C2443的camera驱动
2024-10-18 来源:cnblogs
1 watchdog的作用及工作原理
1.1 watchdog的作用
在嵌入式控制系统运行时收到外部干扰或者系统错误,这时候程序就有可能出现“跑飞”,从而导致整个系统瘫痪。为了防止这种现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗(watchdog)电路或者开启集成在CPU中的watchdog timer(看门狗定时器)。Watchdog的作用就是当系统“跑飞”而进入死循环的时候,可以复位系统,让系统继续重新运行。
1.2 watchdog的工作原理
watchdog原理上就是一个定时器,定时器timer对时钟进行计数,当定时器溢出时,产生复位信号,使得整个系统复位。其基本原理为:设本系统程序完整运行一周期的时间是tp,看门狗的定时周期为ti,且ti>tp,在程序运行一周期后就修改(再重新设定看门狗的定时周期)定时器的计数值(俗称“喂狗”),只要程序正常运行,定时器就不会溢出。若由于干扰等原因使系统不能在tp时刻修改定时器的计数值,定时器将在ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控作用。
2 S3C2443的watchdog
2.1 watchdog概述
S3C2443的看门狗定时器用于控制器因为噪声或系统错误等故障干扰时恢复控制器系统的正常工作,它能作为通用的16位的定时器来请求中断服务。看门狗定时器可以产生128个PCLK周期的复位信号
2.2 watchdog的特征
⑴用于中断请求的通用的定时器模式。
⑵当定时器计数值减到0(计时时间到),激活128PCLK周期的复位信号。
2.3 watchdog定时器的结构图
图1
从上图可知PCLK是看门狗定时器的时钟源,PCLK经过一个预分频器后产生合适的看门狗定时器时钟,这个时钟经过MUX再次被分频。这个8位的预分频值和频率分频系数由看门狗定时器控制寄存器(分别由WTCON[15:8]和WTCON[4:3]来确定)。其中有效的预分频值的范围是0到28-1,频率分配系数的值可以是16,32164或128。我们可以用下面的方程式来计算看门狗定时器频率和每个定时器时钟周期持续时间。
图2
2.4 WTDAT和WTCNT寄存器的关系
一旦使能看门狗定时器,看门狗定时器数据寄存器(WTDAT)不能被自动重新装入到看门狗定时器计数寄存器中(WTCNT),因此,在看门狗定时器开始之前,一个初始值必须被写入到看门狗定时器计数寄存器中。
图3
2.5 调试环境考虑因素
当S3C2443在debug模式使用Embedded ICE(in-circuit Emulator)时,不能操作看门狗定时器。看门狗定时器能够通过CPU内核信号(DBGACK信号)来判断当前是否工作在debug模式下。一旦CPU内核的DBGACK信号生效,看门狗定时器在计时结束时不会激活复位输出,这样就不能复位系统。
2.6 看门狗定时器专用寄存器
⑴看门狗定时器控制(WTCON)寄存器
WTCON寄存器允许用户使能或关闭看门狗定时器,可以从4个不同的时钟源中来选择时钟信号,可以使能和关闭中端,可以使能和关闭看门狗定时器输出。看门狗定时器用于在上电后出现故障的情况下来复位重启S3C2443系统。如果控制器不希望重启,可以关闭看门狗定时器。如果用户把看门狗定时用作普通的定时器,就需要使能中断(WTCON[2])和关闭看门狗定时器(WTCON[5])。
图4
⑵看门狗定时器数据(WTDAT)寄存器
WTDAT寄存器用于指定超时时间,在初始化看门狗定时器操作的时候(也即第一次初始化时),WTDAT寄存器的内容不能被自动加载到看门狗定时器计数寄存器中(WTCNT),但是使用初始值0x8000可以驱动第一次超时,在这种情况下,WTDAT寄存器的值将自动重新加载到WTCNT寄存器中。
图5
⑶看门狗定时器计数(WTCNT)寄存器
WTCNT寄存器包含正常操作时看门狗定时器当前的计数值,注意,在看门狗定时器被开始使能的时候WTDAT寄存器的值不能被自动加载到WTCONT寄存器中,所以我们在使能看门狗定时器前要为WTCONT寄存器初始化一个初始值。
图6
3 WINCE中的初始化代码
Init.c文件中的OEMInit函数调用OALTimerInit函数,下面是OALTimerInit函数初始化watchdog的代码
图7
而SMDKInitWatchDogTimer函数在watchdog.c中实现,如下:
图8
上图的喂狗函数RefreshWatchdogTimer在watchdog.c中定义,见图1,而pfnOEMRefreshWatchDog和dwOEMWatchDogPeriod在WINCE600/public/common/oal/inc/bceoemglobal.h定义,见下图:
图9
上图的pfnRefreshWatchDog,dwWatchDogPeriod和dwWatchDogThreadPriority的定义在在WINCE600/public/common/oal/inc/oemglobal.h中定义,如下
图10