tag 标签: 看门狗

相关帖子
相关博文
  • 热度 12
    2022-3-16 11:15
    2041 次阅读|
    0 个评论
    MCU时钟配置及外接晶振选择
    为了提高系统性能,同时降低功耗,MCU通常提供四种时钟: 高速外部时钟(HSE):由外接高频晶振产生。 低速外部时钟(LSE):由外接低频晶振产生,一般为32.768kHz,用于驱动实时时钟 (RTCCLK)。 高速内部时钟(HSI):由内部高频RC电路产生。 低速内部时钟(LSI):由内部低频RC电路产生,一般为32kHz,用于驱动独立看门狗。 图1. 晶振为MCU提供精准外部时钟 这样配置的好处是,如果采用单一时钟,频率高的话可能会导致性能过剩和功耗过高,频率高则导致性能不足,满足不了要求。多个时钟的话可以平衡功耗和性能之间的平衡。 特此说明一下,系统复位后,默认初始化的是高速内部时钟(HSI)来提供sysclock,一般为16MHz。为了提示系统性能,我们需要使能外部时钟晶振,如24MHz、32MHz等。 如果使用外部HSE的话,一般有两种模式: (1)外部晶体/陶瓷谐振器(HSE晶体)模式 这种模式用得比较常见,HSE晶体可以为系统提供较为精确的时钟源。在时钟控制寄存器RCC_CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置’1’,时钟才被释放出来。HSE晶体可以通过设置时钟控制寄存器里RCC_CR中的HSEON位被启动和关闭。 图2. STM32F4系列MCU时钟模式 该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时间,精度也较高,但是一定要正确使用。 (2)外部时钟源(HSE)旁路模式 所谓HSE旁路模式,是指使用外部晶振时,无需芯片内部时钟驱动组件来辅助,直接从外界导入时钟信号,好像芯片内部的RC振荡器功能被旁路了。 该模式下必须提供外部时钟,外部时钟信号必须连到SOC_IN引脚,此时OSC_OUT引脚对外呈高阻态。不过,使用这个旁路模式的情形不像使用外部晶体模式那么多。 (3)晶振选择举例 以STM32F4系列MCU为例,旁路模式除了配置HSEON还得配置HSEBYP位。这里需要注意的是一定要选择无源晶振,即石英晶体谐振器(XTAL)作为时钟源。 首先,为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容必须尽可能地靠近振荡器引脚,负载电容值必须根据所选择的晶体来具体调整等细节问题。至于选择陶瓷晶体和石英晶体,这取决于应用电路对频率精度和温度稳定性的要求。一般而言,石英晶体比陶瓷晶体的精度要高的多,频率温度稳定性也要好很多。 其次,如果选择了有源晶振(XO、TCXO等),用户就无法选择工作模式!由于有源晶振本身就是个完整的振荡器件,其时钟输出不依赖于外部器件振荡电路,只需要供给适当的电源就能输出时钟,无须额外的振荡驱动匹配电路。这时,我们只能将其配置为HSE旁路模式,而不是HSE晶体模式。 另外,有源晶振价格比无源贵很多,选错了不但浪费钱财,还限制了MCU工作模式和用户发挥空间,需要大家引起注意。
  • 热度 18
    2016-4-20 10:45
    1763 次阅读|
    0 个评论
    这几天研究了PIC32795F512L单片机中看门狗部分内容,pic32整体中文资料较少,针对本项目的设计要求,通过学习理解如下: 1、整体了解:WDT(WATCHDOG TIMER)被使能时,工作于内部低功耗RC(Low-power RC,LPRC) 31khz振荡器时钟源。WDT可用于检测系统软件故障,如果软件未定期清零WDT,器件将被复位。可使用WDT后分频器选择各种WDT超时周期。 2、看门狗定时器相关控制寄存器:特殊功能寄存器(special function register,SFR) (1)WDTCON为看门狗定时器控制寄存器,其中WDTCONCLR、WDTCONSET和WDTCONINV为WDTCON的原子级位操作寄存器,所谓原子级位操作,就是可以直接对寄存器中具体哪一位进行相关操作。 (2)RCON复位控制和状态寄存器,其中RCONCLR、RCONSET和RCONINV为RCON的原子级位操作寄存器。 (3)DEVCFG1器件配置寄存器 以上寄存器均与单片机看门狗部分相关,具体寄存器中的每一位的定义以及操作请参考: http://www.doc88.com/p-402265489108.html 3、看门狗具体编程实现 如果FWDTEN器件配置位DEVCFG123的值为0则可以通过软件使能或禁止WDT。在该模式下ON位WDTCON15会反映软件控制下的WDT状态。值为1指示WDT已使能0指示它已被禁止。用软件通过将WDT ON控制位置1来使能WDT。任何器件复位都会导致WDT ON控制位清零。该位在从SLEEP休眠模式唤醒或从IDLE空闲模式退出时不会清零。 软件WDT选项允许用户在关键代码段使能WDT并在非关键代码段禁止WDT从而最大限度地降低功耗。WDT ON控制位还可以用于在器件正常工作时禁止WDT从而不需要执行WDT处理之后在器件置为IDLE空闲或SLEEP休眠模式之前重新使能WDT以便稍后唤醒器件。 实例编程如下: // This code fragment assumes the WDT was not enabled by // the device configuration // The Postscaler value must be set with the device configuration WDTCONSET = 0x8000;// Turn on the WDT main() { WDTCONSET = 0x01;// Service the WDT ... User code goes here ... } 在实际项目中,MPLAB X IDE编译环境下,在MAIN函数初始化中作如下操作: 其中FWDTEN为DEVCFG1中bit23位,FWDTEN具体为看门狗定时器使能位,1 = WDT被使能且无法用软件禁止,0 = WDT未使能,可用软件使能。WDTPS为看门狗定时器后   分频比选择位,用于定义WDT周期,具体参数如下图所示: 有必要解释程序代码中#pragma config的作用和意义,即配置 pragma 伪指令进行设置。该 pragma 伪指令具有以下形式: #pragma config setting = state|value                #pragma config register = value 其中, setting 是配置设置描述符(如WDT),state是所需状态的文本描述(如OFF),value字段是一个可以优先用于描述符的数值。 在本项目的开发环境中,可以通过以下方式查看PIC32795F512L单片机中的相关伪指令的参数: 在界面下方可参考选择相应数值设置。 此外,实际代码中有以下几个封装好可直接调用的函数: (1)、// WDT timeout period is set in the Device Configuration          EnableWDT(); // enable the WDT (2)                          // user code                             ClearWDT(); // service the WDT (3)// A WDT event did occur           DisableWDT();          ClearEventWDT();   // clear the WDT event flag so a subsequent event can set the event bit 这些函数均可在头文件wdt.h中查到定义。  参考资料: http://www.doc88.com/p-402265489108.html http://microchip.wikidot.com/8bit:wdt http://blog.sina.com.cn/s/blog_7f6a64220102uxys.html http://blog.sina.com.cn/s/blog_64ddebbc0101iqbb.html http://bbs.ednchina.com/BLOG_ARTICLE_3010954.HTM
  • 热度 13
    2015-3-12 10:27
    1564 次阅读|
    0 个评论
         近日李工发现,在调试过程中存在疑似单片机死机的情况,死机后必须重新上电,虽然不常见,但是作为一个bug还是需要修复一下。作为一个偏软件的人员,我首先想到了看门狗。     看门狗 从功能上说它可以让单片机 在意外状况下(比如程序陷入死循环)重新回复到系统上电状态,以保证系统出问题的时候重启一次。就跟我们用电脑一样,死机了你就按一下reset键重启一次电脑,看门狗就是负责干这个事儿的。     说明白点:“看门狗”就是一个计数器,由于位数有限计数器能够装的数值是有限的(比如8位的最多装256个数、16位的最多装65536个数),从开启“看门狗”那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(术语叫溢出)就就产生一个复位信号,重启系统。      每种单片机的“看门狗”实现方法不尽相同,但是原理都一样,而且“看门狗”都是启动了之后就不能被关闭(经过实验,及时是能为置低也不行),只能系统复位(重新断电在上电)才能关闭。设置“看门狗”的一般步骤如下: 1. 设置“看门狗”相关寄存器, 启动“看门狗”; 2. 隔一段时间清零一次,“喂狗”; 3. 如果程序正常,一直运行;如果程序出错,没有按时“喂狗”(计数器清零),“看门狗”就在溢出的时候复位系统。 对于STC单片机来说,启动看门狗功能很简单。 第一步:sfr WDT_CONTR=0xE1;//定义特殊功能寄存器: 第二步:配置  WDT_CONTR 寄存器          EN_WDT: 看门狗允许位,置1启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上          电和看门狗复位可以关闭)         CLR_WDT: 看门狗计数器清零位,置1清零看门狗计数器,当计数器开始重新计数,硬件清零该位.        IDLE_WDT: 单片机IDLE模式看门狗允许位,当IDLE_WDT=1时,单片机在IDLE模式(空闲模式)依然启用看门狗 PS2  PS1  PS0  Prescale    0    0    0     2    0    0    1     4   0    1    0     8    0    1    1     16   1    0    0     32   1    0    1     64   1    1    0     128    1    1    1     256     然后查手册可得看门狗时间,一般公式为看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N表示指令周期数N=12表示12时钟周期模式;N=6表示6时钟周期模式 。(可以不必计算手册上已经给出了20M 12M 11.0592M晶振对应的看门狗时间)     启动和喂狗只需  WDT_CONTR=0B 0011 0??? =0X3? (?为0-7越大时间越长) (  空闲模式一般不关心,所以 IDLE=0)     为了使用方便:  #define WEIGOU WDT_CONTR=0x3?  //看门狗启动设置和“喂狗”操作 第三步:在合适的地方喂狗, 需要注意的是:在查询等待串口接受数据的时候,时间可能很长,这是只需要在串口接收程序中while(!RI){ WEIGOU; }即可。
  • 热度 41
    2012-1-7 00:39
    7145 次阅读|
    25 个评论
    /************************************************************************************************** * Filename:    研发之声:嵌入式 C 编程经验 之 只有一条清狗语句 * Author:SedateFire                            E-mail:SedateFire@126.com    * Version:1.000                                   Time: 2012-01-05     * key: 看门狗   系统架构  os-less  嵌入式 **************************************************************************************************/   一个好的 os-less 系统,只有一条清狗语句,它位置就固定在 main 函数中的 while(1)  /* or for(;;;) */ {        __watchdog_reset(); }   如果你有两条以上看门狗语句,那么会有什么后果呢? 在系统足够复杂的时候,很能引起当机,由于静电或者程序自身逻辑的原因,进入了某个思维的盲点,系统进入一个有清狗语句的死循环里面,退不出来。 这是最危险的,尴尬的,蒙羞的事情。   那么多出来的清狗语句,一般会用在哪里呢?   1.   系统初始化 ,有些设备初始化需要读取它的反馈状态,用while,担心复位,于是清狗。我一般用While (dev_read_status() (i--)),这个i,32位顶天了。一般mcu没这么快法。   2. mcu睡眠前清狗 。有些人喜欢在系统进入睡眠前清狗一下,担心系统刚好在那一刻复位。这只能说明你对自己的程序不了解,主回圈程序一圈下来,最大执行时间其实心中有数。函数多少深度宽度心中要有低。如果刚好睡眠前一刻复位,那也有可能在跑别的函数过程中复位。   3.   某些应用逻辑貌似要需要hold住 ,比如屏幕的暂停显示2秒钟等。许多人生生地把这种逻辑做成“硬延时”,就是死等。 这是一个令人戚眉的做法 ,因为这意味麻烦的开始。在你需要暂停显示n秒的过程中,我的一切用户体验你无法响应我了,按键没反应,蜂鸣器不响,led灯不闪烁,一切好像死机了一样。等到系统显示完成后,用户心中大舒一口气,心中悬石落地,你终于又回气儿活过来了。这是糟糕的体验。            好吧,为了改善体验,许多人就想办法来。把用户体验搬到中断里面做, 这是另外一个麻烦的开始 ,全局变量的增多和跨模块的判断,其根源之一始于此,弄个不好,就是随机性崩溃。中断程序变胖,终究是不方便的,于是为了改进,就只好在中断程序中置标志位,然后在hold_delay(TIME)函数的循环中清狗,并且判断标志位作响应动作。许多应用逻辑需要hold住的地方何其多,上九天下地府处处添加,函数深度不可测,逻辑递归难判断,系统大乱的祸患就此埋下。           那如何解决呢, 事件 -- 状态机 ,一句话概括, 在当前状态下,遇到某某事件,则执行什么动作后,进入下一个状态。 它似表非表,如水般自然,像空气般无痕……好了,其实是我不愿多讲,若要具体讲下去,恐怕涉及公司知识产权。尽管这个事件状态机思想是个公开的秘密,原理大家都懂,但做得好的还不多见。Hold住本身就是一种状态,看你如何抽象它了。            佛曰: 菩萨畏因,凡夫畏果 。那灾难之源,是需要敬畏戒惧的,待到结果发生,悔之莫及。
相关资源