STM8S——watchdog(IWDG)

2019-11-07来源: eefocus关键字:STM8S  watchdog  IWDG

IWDG工作原理:


  1、当键值寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就会被启动,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号。


  2、使用IWDG_PR和IWDG_RLR寄存器配独立看门狗。


  (1)IWDG_PR寄存器是用于选择驱动计数器时钟的预分频系数。


  (2)当KEY_REFRESH的数值(0xAA)写入到IWDG_KR寄存器时,独立看门狗将用IWDG_RLR的数值刷新计数器的内容,从而避免了产生看门狗的复位。


  3、IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改它们前,需首先在IWDG_KR寄存器写入KEY_ACCESS代码(0x55);在IWDG_KR写入0xAA将恢复写保护状态。


 IWDG工作细节:


1、为了避免程序忙跑跑死了没反应,加上一个看门狗watchdog实时监控着程序,一旦程序没有在规定的时间喂狗,则狗叫使得单片机复位。


2、Independent watchdog(IWDG)内部有时钟源(128kHz),所以即使主时钟挂了watchdog还是能继续工作的。


   另外还有个Window watchdog (WWDG),比IWDG复杂得多,我们没有采用。


3、由于内部是128kHz,所以watchdog能允许的最大延迟时间为510ms(当RL[7:0]= 0xFF时),最小延迟时间为2ms(当RL[7:0]= 0x00时);我们选取510ms。

  也就是说一旦打开看门狗,最迟每隔510ms就要进行喂狗操作,否则看门狗将会打开复位。


4、看门狗的实现不难,难点在于怎样验证自己设置的看门狗是否正确,难点在与想办法测试watchdog。


   方法是在while(1)的循环里延时510ms以上(如延时600ms),通过对相关寄存器特征值的显示查看,来判断单片机是否被复位,若被复位则验证成功。


5、值得注意的是,开门狗一旦打开就无法关闭,只有通过不断的喂狗来防止复位。


6、下面给出代码思路并且附带详细注释:


   由于延时函数如果延时太久会无法实现喂狗操作,所以应该在原来的Delay1ms()函数的基础上,再另外定义一个newDelay()函数,目的是每次延时250ms时(即调用Delay1ms(250))喂狗;



  1 /*-- private variable --*/

  2 __IO uint32_t space_reloadTM = 250;//define every after 250 ms reload IWDG

  3 

  4 /*-- private function --*/

  5 void NewDelay(__IO uint32_t nTime);//include reload IWDG

  6 

  7 static void IWDG_Config_Enable(void);//config and enable IWDG

  8 

  9 

 10 /*-- main function --*/

 11 int main()

 12 {

 13     IWDG_Config_Enable(); //config and enable IWDG 

 14 

 15     //for test

 16     while (1)

 17     {

 18         Delay1ms(600); //timeout and reset happend

 19         

 20         /*-- never runs here --*/

 21       

 22         //Reload IWDG counter

 23         IWDG_ReloadCounter();

 24     }

 25 }

 26 

 27 

 28 

 29 void NewDelay(__IO uint32_t nTime)

 30 {

 31     uint32_t time_divisor = nTime/space_reloadTM;

 32     uint32_t time_remainder = nTime%space_reloadTM;

 33     uint8_t i;

 34     

 35     /* every after 250ms reload IWDG */

 36     for(i=0;i

 37     {

 38         Delay1ms(space_reloadTM);

 39         //Reload IWDG counter

 40         IWDG_ReloadCounter();

 41     }

 42     

 43     /* delay the remain time */

 44     Delay1ms(time_remainder);

 45     //Reload IWDG counter

 46     IWDG_ReloadCounter();

 47 }

 48 /*

 49 void Delay1ms(__IO uint32_t nTime)

 50 {

 51   TimingDelay = nTime;

 52 

 53   while (TimingDelay != 0);

 54 }

 55 */

 56 

 57 

 58 

 59 /**

 60  * @brief  Configures the IWDG to generate a Reset if it is not refreshed at the

 61  *         correct time.

 62  * @param  None

 63  * @retval None

 64  */

 65 static void IWDG_Config_Enable(void)

 66 {

 67     /* Check if the system has resumed from IWDG reset */

 68     if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)

 69     {

 70         printf("nr");

 71         uart2str(uartbuff,RST->SR,8,2,'0');   //output RST register

 72         printf("Timeout, RST_SR=%snr",uartbuff);

 73         

 74         printf("timeout!!!");

 75         

 76         /* IWDGF flag set */

 77         /* Clear IWDGF Flag */

 78         RST_ClearFlag(RST_FLAG_IWDGF);

 79     }

 80     else

 81     {

 82         //IWDGF flag is not set

 83     }

 84     

 85     

 86     /* --- IWDG Configuration --- */

 87     

 88     /* Enable IWDG (the LSI oscillator will be enabled by hardware) */

 89     IWDG_Enable(); //0xCC

 90     

 91     /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency

 92      dispersion) */

 93     /* Enable write access to IWDG_PR and IWDG_RLR registers */

 94     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55

 95     

 96     /* IWDG counter clock: LSI/128 */

 97     IWDG_SetPrescaler(IWDG_Prescaler_128);

 98     

 99     /* Set counter reload value to obtain 250ms IWDG Timeout.

100      Counter Reload Value = 250ms/IWDG counter clock period

101      = 250ms / (LSI/128)

102      = 0.25s / (LsiFreq/128)

103      = LsiFreq/(128 * 4)

104      = LsiFreq/512

105      */

106     IWDG_SetReload((uint8_t)(0xFF));//510ms

107     

108     /* Reload IWDG counter */

109     IWDG_ReloadCounter(); //0xAA

110 }

watchdog

 


   为了验证代码的可实现性,故意在主函数中调用Delay1ms(600),所以正确的执行结果应该是:执行Delay1ms(600),watchdog启动复位,输出timeout之类的提示;


   其中证明是否是watchdog启动的复位:查看RST->SR(Reset status register)中Bit1的值,为1表示An IWDG reset occurred,为0表示No IWDG reset occurred。

关键字:STM8S  watchdog  IWDG 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479274.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8关于IWDG看门狗和HSI高速时钟和复位的坑
下一篇:STM8S FLASH与EEPROM读写操作

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
模拟I2C读取时钟芯片PCF8563中的日期时间 #define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号#define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1)#define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号#define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2)u8 buf[7];void SDA_IN(u8 in) {  if(in) 
发表于 2019-11-13
STM8S的HALT模式与AWU唤醒
/************************************************************************************************************************************ Name    : STM8S的HALT模式与AWU唤醒* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-11-13
STM8S003的GPIO模拟I2C切换输入输出的解决办法
刚开始学STM8,很多东西刚了解,正在做一个温湿度显示小板,就是使用I2C驱动SHT20传感器,并显示到数码管,数码管用的四位一体共阴数码管,STM8管脚有限,添加了一片TM1650做驱动,不过SHT20和TM1650都是用的I2C接口,由于对STM8硬件I2C还不了解,先打算用软件模拟,这就涉及到需要对GPIO做输入输出切换处理来检测ACK响应,刚开始,直接操作DDR寄存器,但是出现从输出切换到输入就会出现单片机死机,不解,查资料,得到一个解决办法,在输出状态时,可以不用切换到输入,我使用管脚D4,D5这两个管脚,这两个管脚比较特殊,就是真正开漏,在管脚描述为T,其它描述为HS(高吸收电流)。解决办法,将IO设置为开漏输出,外部
发表于 2019-11-11
STM8S103之IO复用
一、简介本文以STM8S103F3P6编程为例,介绍STM8S103F3P6如何引脚复用。二、实验平台电脑平台:Windows7 64位旗舰编译软件:IAR硬件平台:STM8S103F3P6三、版权声明四、实验前提1、在进行本文步骤前,请先安装IAR  EWSTM8-EV-1311版本;准备好STM8S103F3P6硬件平台。五、基础知识暂无六、源码地址暂无七、实验内容1.先阅读STM8S103F数据手册2.操作步骤以STM8S103F3P6的IO“PC6”为定时器1PWM输出为例:1)、配置定时器1为PWM输出void Init_Timer1(void){  GPIO_Init(GPIOC
发表于 2019-11-11
STM8S103之IO复用
STM8S_010_I2C读写EEPROM(硬件方式)
Ⅰ、写在前面相信看过前面那篇文章“更加深入理解I2C总线、协议及应用”的人对I2C都有一定的了解了。那篇文章是针对I2C,使用单片机IO模拟I2C方式实现读写操作。本文将讲述硬件I2C读写操作,也就是由处理器自身硬件的I2C实现时钟、数据的传输过程。Ⅱ、STM8硬件I2C知识STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。允许连接到标准(最高100kHz)或快速(最高400kHz)的I2C总线。1.I2C的4种模式● 从设备发送模式● 从设备接收模式● 主设备发送模式
发表于 2019-11-09
stm8s105调试I2C记录
最近由于AR项目中调试LCOS需要用到STM8S105的mcu,本次主要是使用模拟I2C。1.IIC协议简介 IIC协议这里只做简要介绍,详细介绍可以百度了解,协议相对简单,主要有开始位,停止位,应答位,非应答位。开始位:当时钟为高,数据线由高变低停止位:当时钟位高,数据线由低变高。应答位:第9个时钟到来时,数据线为低。(这里第9个时钟,发送完一个字节,紧接着就是第9个时钟到来)非应答位,第9个时钟到来时,数据线为高。2.LCOS协议:1.发送数据:单数据发送: 开始位:写地址位(8bit):寄存器地址(16bit):数据(8bit):停止位多字节发送:开始位:写地址(8bit):寄存器地址(16bit):数据(8bit
发表于 2019-11-09
stm8s105调试I2C记录
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved