历史上的今天
今天是:2025年06月04日(星期三)
2018年06月04日 | S3C2440之看门狗
2018-06-04 来源:eefocus
看门狗定时器的主要作用当程序因为干扰而跑飞后,能够使系统复位。从而防止系统跑飞,提高系统稳定性。
先来说说看门狗的工作原理:
设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的记数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用。
看门狗设计步骤:
1,设置看门狗中断操作,包括全局中断操作和看门狗中断的使能,看门狗中断向量的定义。
#define rINTMSK (*(volatile unsigned *)0x4a000008) //Interrupt mask control
#define rINTSUBMSK (*(volatile unsigned *)0x4a00001c) //Interrupt sub mask
//开中断
rINTMSK &= ~(BIT_WDT_AC97);
rINTSUBMSK &= ~(BIT_SUB_WDT);
2,对看门狗控制寄存器WTCON设置,包括设置预分频比例因子,分频器的分频值,中断使能,复位使能。
WTCON相关位的作用可从下图看出:

其中t_watchdog的计算方法为:

如预分频值=100;时钟除数因子=128 ;PCLK=67.5MHz,则
定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]=1/[67.5*1000000/(100+1)/128]=0.0002
预分频值,时钟除数因子的范围如下:

rWTCON=((100<<8)|(3<<3)); //预分频值=100;时钟除数因子=128 ;
rWTCON|=(1<<0);//允许复位
3,启动看门狗。
rWTCON |= ((1<<5)|(1<<2)); //允许看门狗定时器和允许中断产生
4,喂狗,即对WTDAT看门狗数据寄存器和WTCNT看门狗计数寄存器的设置。这要在在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时。而不至于引起系统复位。
rWTDAT=20000; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值
rWTCNT=20000; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值
//看门狗时钟中断周期T=WTCNT*t_watchdog=4S
watchdog.c
实现看门狗功能,防止程序跑飞:
//*********************************************
//看门狗定时器函数
void watchdog_timer(void)
{
//清WatchDog中断寄存器
rSRCPND |=BIT_WDT_AC97;
rINTPND |=BIT_WDT_AC97;
rSUBSRCPND |= BIT_SUB_WDT;
//建立WatchDog中断
pISR_WDT_AC97=(unsigned)Watchdog_ISR;
rWTCON=((100<<8)|(3<<3)); //预分频值=100;时钟除数因子=128 ;
//PCLK=67.5MHz,不允许中断
//每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]
// =1/[67.5*1000000/(100+1)/128]=0.0002
//
//看门狗喂狗
rWTDAT=20000; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值
rWTCNT=20000; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值
//看门狗时钟中断周期T=WTCNT*t_watchdog=4S
rWTCON &= ~(3); //不允许复位
rWTCON |= ((1<<5)|(1<<2)); //允许看门狗定时器和允许中断产生
//开中断
rINTMSK &= ~(BIT_WDT_AC97);
rINTSUBMSK &= ~(BIT_SUB_WDT);
while(count<11);
}
//****************************************
//WatchDog中断
void __irq Watchdog_ISR(void)
{
if(rSUBSRCPND & ~ BIT_SUB_WDT)
{ //清除中断
rSUBSRCPND |=(BIT_SUB_WDT); //清除一级源中断指示寄存器相应位
rSRCPND |= BIT_WDT_AC97;
rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位
count++; //复位次数自加
if(count<11) ; //判断复位次数
else
{
//屏蔽看门狗中断
rINTSUBMSK |= (BIT_SUB_WDT); //屏蔽看门狗相应中断位
rINTMSK |= (BIT_WDT_AC97);
}
}
if(rSUBSRCPND & ~ BIT_SUB_AC97)
{
rSUBSRCPND |=BIT_SUB_AC97;
rSRCPND |= BIT_WDT_AC97;
rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位
}
}
//*****************************************
/*需要复位时选用
void watchdog_reset(void) //看门狗复位函数
{
//预分频值=100;时钟除数因子=128 ;PCLK=67.5MHz
//每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]
// =1/[67.5*1000000/(100+1)/128]=0.0002
//不允许中断
rWTCON=((100<<8)|(3<<3));
//看门狗时钟周期T=WTCNT*t_watchdog=4S
//看门狗喂狗
rWTDAT=20000;
rWTCNT=20000;
rWTCON &= ~(3<<1);//禁止看门狗中断
rWTCON|=((1<<5)|(1<<0));//允许看门狗定时,允许复位
while(1);
}
*/
测试用主函数:
void xmain(void)
{
ChangeClockDivider(3,1);
ChangeMPllValue(127,2,1); //405MHZ
Isr_Init();
/*看门狗定时器用于系统出错时复位,如果不想重启处理器,那么看门狗定时器禁用,
如果想使用看门狗定时器提供正常的定时功能,需使用看门狗中断和看门狗定时器*/
watchdog_timer(); //看门狗定时器函数
//watchdog_reset(); //看门狗复位函数
}
完整工程文件可在这里下载。
上一篇: S3C2440之ADC
下一篇:ARM中断向量表与响应流程
史海拾趣
|
一、生产工艺 1.工艺: a)清洗:采用超声波清洗pcb或led支架,并烘干。 b)装架:在LED管芯(大圆片)底部电极备上银胶后进行扩张,将扩张后的管芯(大圆片)安置在刺晶台上,在显微镜下用刺晶笔将管芯一个一个安装在PCB或LED支架 ...… 查看全部问答> |
|
基于降压的结构可以与很多环路控制结构很好的匹配,而且不用考虑稳定性的限制,滞回控制适合在开关频率变化比较快和输入范围比较小的情况下应用。这种特性刚好满足LED对电源的要求。 随着LED的广泛应用,在很多地方线性电源这种简单的结构已经不能 ...… 查看全部问答> |
|
分配虚拟地址,并映射到指定物理地址 m_IOPreg = (volatile IOPreg *)VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE,PAGE_READWRITE|PAGE_NOCACHE); if(m_IOPreg ==NULL) &nb ...… 查看全部问答> |
|
stm32跑ucos-ii 2.86,外扩了sram,驱动正常了,但分散加载文件里只要把外部的sram想用起来,程度就死掉,无法运行,请问有人遇到改问题吗?怎么搞? 以下是我的手动分配的分散加载文件,把 RW_RAM1 0x60000000 0x00010000  ...… 查看全部问答> |
|
采用 TPS65950 为OMAP™3 供电:TI应用设计指南 此文档介绍了针对OMAP3530器件及TPS65950相关器件[电源集成电路 (IC)]的系统硬件实施。此文档主要说明针对处理器及相关电源IC的电源连接注意事项。… 查看全部问答> |




