历史上的今天
返回首页

历史上的今天

今天是:2025年06月04日(星期三)

正在发生

2018年06月04日 | S3C2440之看门狗

2018-06-04 来源:eefocus

看门狗定时器的主要作用当程序因为干扰而跑飞后,能够使系统复位。从而防止系统跑飞,提高系统稳定性。

先来说说看门狗的工作原理:
设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的记数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用。

看门狗设计步骤:
1,设置看门狗中断操作,包括全局中断操作和看门狗中断的使能,看门狗中断向量的定义。


  1. #define rINTMSK     (*(volatile unsigned *)0x4a000008)  //Interrupt mask control  

  2. #define rINTSUBMSK  (*(volatile unsigned *)0x4a00001c)  //Interrupt sub mask  


  1. //开中断  

  2. rINTMSK &= ~(BIT_WDT_AC97);   

  3. 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

预分频值,时钟除数因子的范围如下:



  1. rWTCON=((100<<8)|(3<<3));  //预分频值=100;时钟除数因子=128 ;  


  1. rWTCON|=(1<<0);//允许复位  

3,启动看门狗。


  1. rWTCON |= ((1<<5)|(1<<2));  //允许看门狗定时器和允许中断产生  

4,喂狗,即对WTDAT看门狗数据寄存器和WTCNT看门狗计数寄存器的设置。这要在在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时。而不至于引起系统复位。


  1. rWTDAT=20000; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值  

  2. rWTCNT=20000; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值  

  3.               //看门狗时钟中断周期T=WTCNT*t_watchdog=4S  

watchdog.c

实现看门狗功能,防止程序跑飞:


  1. //*********************************************  

  2. //看门狗定时器函数  

  3. void watchdog_timer(void)  

  4. {  

  5.       //清WatchDog中断寄存器  

  6.   rSRCPND |=BIT_WDT_AC97;  

  7.   rINTPND |=BIT_WDT_AC97;  

  8.   rSUBSRCPND |= BIT_SUB_WDT;      

  9.      

  10.   //建立WatchDog中断  

  11.   pISR_WDT_AC97=(unsigned)Watchdog_ISR;  

  12.     

  13.   

  14.   rWTCON=((100<<8)|(3<<3));  //预分频值=100;时钟除数因子=128 ;  

  15.   //PCLK=67.5MHz,不允许中断   

  16.   //每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]  

  17.   //                            =1/[67.5*1000000/(100+1)/128]=0.0002  

  18.   //  

  19.      

  20.   //看门狗喂狗  

  21.   rWTDAT=20000; //WTDAT看门狗数据寄存器,看门狗定时器重载的计数值  

  22.   rWTCNT=20000; //WTCNT看门狗计数寄存器,看门狗定时器当前计数值  

  23.                 //看门狗时钟中断周期T=WTCNT*t_watchdog=4S  

  24.   rWTCON &= ~(3); //不允许复位  

  25.     

  26.   rWTCON |= ((1<<5)|(1<<2));  //允许看门狗定时器和允许中断产生  

  27.   

  28.   //开中断  

  29.   rINTMSK &= ~(BIT_WDT_AC97);   

  30.   rINTSUBMSK &= ~(BIT_SUB_WDT);  

  31.   while(count<11);  

  32.  }  

  33. //****************************************  

  34. //WatchDog中断  

  35. void __irq Watchdog_ISR(void)  

  36. {  

  37.     

  38.   if(rSUBSRCPND & ~ BIT_SUB_WDT)  

  39.   {  //清除中断  

  40.       rSUBSRCPND |=(BIT_SUB_WDT); //清除一级源中断指示寄存器相应位   

  41.       rSRCPND |= BIT_WDT_AC97;   

  42.       rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位  

  43.       count++;       //复位次数自加  

  44.     

  45.       if(count<11)  ;  //判断复位次数   

  46.       else  

  47.       {   

  48.              //屏蔽看门狗中断  

  49.           rINTSUBMSK |= (BIT_SUB_WDT); //屏蔽看门狗相应中断位  

  50.           rINTMSK |= (BIT_WDT_AC97);  

  51.       }  

  52.   }  

  53.   

  54.   if(rSUBSRCPND & ~ BIT_SUB_AC97)  

  55.   {  

  56.        rSUBSRCPND |=BIT_SUB_AC97;     

  57.        rSRCPND |= BIT_WDT_AC97;   

  58.        rINTPND |= BIT_WDT_AC97; //清除源中断指示寄存器相应位  

  59.   }  

  60. }  

  61. //*****************************************  

  62. /*需要复位时选用  

  63. void watchdog_reset(void)      //看门狗复位函数  

  64. {  

  65.     

  66.   //预分频值=100;时钟除数因子=128 ;PCLK=67.5MHz  

  67.   //每个定时器时钟周期t_watchdog=1/[PCLK/(预分频值+1)/时钟除数因子]  

  68.   //                            =1/[67.5*1000000/(100+1)/128]=0.0002  

  69.   //不允许中断  

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

  71.     

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

  73.   //看门狗喂狗  

  74.   rWTDAT=20000;  

  75.   rWTCNT=20000;  

  76.     

  77.   rWTCON &= ~(3<<1);//禁止看门狗中断  

  78.     

  79.   rWTCON|=((1<<5)|(1<<0));//允许看门狗定时,允许复位  

  80.   while(1);  

  81. }  

  82. */  

测试用主函数:


  1. void xmain(void)  

  2. {  

  3.     ChangeClockDivider(3,1);  

  4.     ChangeMPllValue(127,2,1);       //405MHZ  

  5.     Isr_Init();  

  6.       

  7.     /*看门狗定时器用于系统出错时复位,如果不想重启处理器,那么看门狗定时器禁用,  

  8.       如果想使用看门狗定时器提供正常的定时功能,需使用看门狗中断和看门狗定时器*/  

  9.     watchdog_timer();  //看门狗定时器函数  

  10.   //watchdog_reset();  //看门狗复位函数  

  11.         

  12. }  

完整工程文件可在这里下载。


推荐阅读

史海拾趣

Comus_International公司的发展小趣事

Comus International深知,要想在竞争激烈的电子行业中立足,除了不断创新外,还需要注重产品质量和服务。因此,公司一直将质量和服务作为核心竞争力,不断提升产品质量和服务水平。正是这种对质量和服务的执着追求,使得Comus International在市场上赢得了客户的广泛认可和信赖。

BUSSMANN公司的发展小趣事

1992年,Bussmann开始了第一款芯片保险丝的开发工作。这款保险丝将可熔性材料沉降到陶瓷基底上,大小只有3mm*1.5mm,可以通过自动装配机安装到印刷电路板上。这一创新不仅大大提高了熔断器的性能和可靠性,还降低了生产成本,为电子行业的发展注入了新的活力。

意普(ESPE)公司的发展小趣事

随着市场需求的不断增长,意普(ESPE)公司开始拓展产品线,推出了包括通用光栅、反射板等一系列光电保护产品。同时,公司注重产品创新,不断引进国外先进技术,并结合国内市场需求进行改进,成功推出了多款具有竞争力的新产品。这些产品广泛应用于机械加工、汽车制造等行业,有效提升了客户的安全生产水平。

Crameda Intersys公司的发展小趣事

随着公司业务的不断发展,Crameda Intersys公司开始寻求与行业内其他企业的战略合作。公司通过与多家知名企业建立紧密的合作关系,共同研发和推广新技术产品,成功将业务扩展到全球市场。这些战略合作不仅拓宽了公司的市场渠道,也提升了公司的品牌影响力和市场竞争力。同时,通过与合作伙伴的深入交流和学习,公司不断吸收新的技术和理念,为自身的创新和发展注入了新的活力。

Alps Alpine Co Ltd公司的发展小趣事

Crameda Intersys公司自创立之初,便以技术创新为核心竞争力。在公司成立早期,团队经过长时间的研发,成功推出了一款具有颠覆性的集成电路产品,其高效能和低能耗的特点在当时市场上独树一帜。这一技术突破不仅为公司赢得了大量的订单,也为公司的长远发展奠定了坚实基础。随着产品市场的逐步拓展,公司的知名度和影响力不断提升,为后续的技术研发和市场拓展积累了宝贵的经验和资源。

Electro-Term/Hollingsworth公司的发展小趣事

在电子行业的激烈竞争中,Electro-Term公司凭借其独特的技术创新能力,逐步崭露头角。公司创始人在一次偶然的实验中发现了一项新的半导体材料,这种材料具有更高的导电性和稳定性。凭借这一突破,Electro-Term成功推出了一系列高性能的电子产品,赢得了市场的广泛认可。随着技术的不断升级和产品线的扩展,公司逐渐在电子行业中树立了技术领先的形象。

问答坊 | AI 解惑

显示/光电技术:LED生产工艺及封装技术

一、生产工艺   1.工艺:   a)清洗:采用超声波清洗pcb或led支架,并烘干。   b)装架:在LED管芯(大圆片)底部电极备上银胶后进行扩张,将扩张后的管芯(大圆片)安置在刺晶台上,在显微镜下用刺晶笔将管芯一个一个安装在PCB或LED支架 ...…

查看全部问答>

谁有protel99 的PLCC84封装

急用啊,哪位好心达人帮帮忙吧。…

查看全部问答>

第三讲 利用降压结构实现LED驱动

基于降压的结构可以与很多环路控制结构很好的匹配,而且不用考虑稳定性的限制,滞回控制适合在开关频率变化比较快和输入范围比较小的情况下应用。这种特性刚好满足LED对电源的要求。 随着LED的广泛应用,在很多地方线性电源这种简单的结构已经不能 ...…

查看全部问答>

请教如何绕制电感?

我要绕两只电感分别是68UH和100UH,铁磁芯,电流2A,请问用多粗的铜线?大概绕多少圈?…

查看全部问答>

jtag测试

有谁做过jtag测试的,现遇到这一问题,一条链上两片FPGA相连,旁路其中一片,在EXTEST模式下可以向相应引脚加载数据,若不旁路,即两片都在测试模式下工作,则不能加载,请问是为什么?…

查看全部问答>

app中 设置GPIO

分配虚拟地址,并映射到指定物理地址          m_IOPreg = (volatile IOPreg *)VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE,PAGE_READWRITE|PAGE_NOCACHE);         if(m_IOPreg ==NULL) &nb ...…

查看全部问答>

Cadence调用元件时出现一个问题

在Cadence schematic editing中放置一个MOS管后,就出现这样的error,请问是什么原因啊?库已经建好了。…

查看全部问答>

(版主)stm32外扩sram,一用就死,咋整?

stm32跑ucos-ii 2.86,外扩了sram,驱动正常了,但分散加载文件里只要把外部的sram想用起来,程度就死掉,无法运行,请问有人遇到改问题吗?怎么搞? 以下是我的手动分配的分散加载文件,把    RW_RAM1 0x60000000 0x00010000  ...…

查看全部问答>

采用 TPS65950 为OMAP™3 供电:TI应用设计指南

此文档介绍了针对OMAP3530器件及TPS65950相关器件[电源集成电路 (IC)]的系统硬件实施。此文档主要说明针对处理器及相关电源IC的电源连接注意事项。…

查看全部问答>

MSP430与bq电量计间采用SMBus通信接口的宽输入电池充电器

MSP430与bq电量计间采用SMBus通信接口的宽输入电池充电器…

查看全部问答>