STM8S——watchdog(IWDG)

发布者:mlgb999最新更新时间: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 引用地址:STM8S——watchdog(IWDG)

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

推荐阅读最新更新时间:2024-11-10 17:58

STM8S中断优先级设置
基础知识:中断向量表
[单片机]
<font color='red'>STM8S</font>中断优先级设置
STM8S单片机入门3(AD转换及锂电池管理)
锂电池以其容量大、充电性能好的优点,已经得到了广泛引用,特别在小型的需电池供电的电子设备上。但是锂电池的充电和使用条件比较严格,比如充电必须以恒流恒压方式,使用时电压不能低于3V等,所以用锂电池供电的系统一般都需要专门的锂电池管理功能,确保锂电池在正确的工作状态下。 这部分内容以讲述在STM8S单片机系统中,如何使用典型的锂电池充电管理芯片TP4056来实现锂电池的充电,以及如何使用单片机内置的AD转换功能测量电池电压,实现电池电量监控。 1、电路设计 电路图如下,使用TP4056做充电管理,TP4056是一款采用恒定电流/恒定电压线性锂电池充电管理IC,电路简单,只需要外接一个编程电容即可实现恒流恒压充电,
[单片机]
<font color='red'>STM8S</font>单片机入门3(AD转换及锂电池管理)
STM32F0x2 IWDG(独立看门狗)
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。 看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器 的自动复位重启(发送复位信号)。 以下为stm32f042单片机独立看门狗相关代码: /********************************************************** *函数描述:初始化独立看门狗,timeout为1s *函数:void IWDG_Init(unsigned char usb_sw) *参数:无 *作者: *日期: **********************
[单片机]
STM32 独立看门狗IWDG 时限
STM32 独立看门狗IWDG 时限 的确定 看门狗定时时限= IWDG_SetReload()的值 / 看门狗时钟频率 看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数 1.STM32 看门狗的 例子 IWDG的时限定为280微秒。这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微 小的变化。 /* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) ------------------
[单片机]
三分钟看懂stm8s单片机实现多通道转换
今天在使用stm8s单片机的AD功能,单片机上有AN0到AN9十个通道。想只用其中的三路AN5到AN7。 //ADC初始化 void ADC_Init(void) { ADC_CR1 = 0x50; ADC_CR2 = 0x38; ADC_TDRL = 0xE0;//禁止施密特触发 } unsigned int Read_ADC_Temp(unsigned channel) { unsigned int i,ADtemp; ADC_Init(); //ADC_CSR = 0x00; ADC_CSR = channel; ADC_CR1 = 0x01;// CR1寄存器的最低位置1,使能ADC转换 for(i = 0;i 《
[单片机]
三分钟看懂<font color='red'>stm8s</font>单片机实现多通道转换
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 ; void SDA_IN(u8 in) { if(in) GPIO_I
[单片机]
stm8s开发(五) TIMER的使用:定时!
STM8S提供三种类型的TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 使用定时可以确定一个时间片,方便控制发送速率,采样速率,等等一些对时间要求比较高的任务,而这些操作可以放入定时器中断里面执行。这次的例子,定时1s,让LED灯翻转一次,达到2s闪烁一次的效果。由于定时操作简单,我们使用基本定时器:TIMER4 void Init_Timer4(void) { //128分频 256计数,在16MHz下是2
[单片机]
<font color='red'>stm8s</font>开发(五) TIMER的使用:定时!
STM32的IWDG(独立看门狗)详细用法
1、IWDG简介:   STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。   2 、IWDG功能框图剖析 ①独立看门狗时钟     独立看门狗的时钟由独立的 RC振荡器 LSI提供,即使主时钟发生故
[单片机]
STM32的<font color='red'>IWDG</font>(独立看门狗)详细用法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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