【IAR工程】STM8S208RB基于ST标准库独立看门狗(IWDG)

【IAR工程】STM8S208RB基于ST标准库独立看门狗(IWDG)


📍相关篇《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例

📑独立看门狗(IWDG)

独立看门狗模块可以用于解决处理器因为硬件或软件的故障所发生的错误。它由一个内部的128kHz的LSI阻容振荡器作为时钟源驱动,因此即使是主时钟失效时它仍然照常工作。

  • 🔰硬件看门狗功能
    如果在IWDG_HW选择字节中使能了硬件看门狗的功能,在芯片上电时看门狗的功能被自动开启,如果软件不能及时操作键寄存器,则在计数器达到0x00时产生复位.

  • 🔨OPTION Byte选项字节

    在这里插入图片描述

🔧超时周期和分频系数

  • 超时周期由计数器数值和时钟预分频器决定,下表列出了它们的数值。

在这里插入图片描述

🔖从上表图可知,超时周期长短由分频系数决定,分频系数越大,那么超时周期就越长,最多256分频,对应的时间周期是1.02S

🛠独立看门狗配置函数

/*******************************************************************************
**函数名称:void IWDG_Init()
**功能描述:初始化独立看门狗
**入口参数:无
**输出:无
看门狗时钟源:IWDG LSI = 128KHz/2 =64KHz
f = 64KHZ / 256 = 250Hz;T(周期)= 1/f =0.004S
- 重装载值:0xfa ->0.004S * 250 = 1S(秒)
- 最大重装载值 0xff ->0.004S * 252 = 1.02S(秒)
- 重装载值决定喂狗频率
*******************************************************************************/
 void IWDG_Init( void )
{
    IWDG->KR = 0xCC;//启动IWDG
    IWDG->KR = 0x55;//解除PR以及RLR的写保护
    IWDG->RLR = 0xff;//看门狗计数器重装载数值:250,max=0xff(255)
    IWDG->PR = 0x06;//分频系数256,最长超时时间:1.024S
    IWDG->KR = 0xaa;//刷新IWDG

    //先写0XCC,后写0X55,再写键值,
//    IWDG_Enable();//启动IWDG
//   IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );//解除PR以及RLR的写保护
//    IWDG_SetReload( 0xff );    //重载寄存器写入255
//    IWDG_SetPrescaler( IWDG_Prescaler_256 ); //64KHZ / 256 = 0.004S
//    IWDG_ReloadCounter();//刷新IWDG
  
}

📝主程序代码

  • 🔖在没有配置OPTION Byte选项字节的情况下,默认是软件开启方式。如果需要硬件开启的话需要配置OPTION Byte选项字节,并且在后面的烧写程序当中都要在看门狗复位前进行喂狗,否则超时就会复位,推荐还是软件开启方式。
/**************************************************************************************
实验现象:	开始LED1指示灯亮一秒后熄灭,在循环内不断喂狗,如果未在规定时间喂狗将产生复位,复位后程序
			从头开始执行,即LED1指示灯亮一秒后熄灭。没有被复位下,LED2正常1s频率闪烁。

接线说明:	1,STM8S单片机-->LED1
		   		PC7-->LED1
                                PC6-->LED2

注意事项:1、点击“Download active application”按钮,程序下载完成后,即可运行程序。


***************************************************************************************/

#include "stm8s.h"      /*  添加库函数头文件 */
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "time.h"
#include "iwdg.h"
#include <stdio.h>


/* 主函数 */
int main( void )
{

    disableInterrupts();    //关闭系统中断
    //内部时钟为1分频 = 16Mhz
    CLK_SYSCLKConfig( CLK_PRESCALER_HSIDIV1 );
    USART1_Init( 9600 ); //初始化USART1 , 并设置波特率为9600
    printf( "Hello World \r\n" );
    LED_Init();
    TIM2_Init( TIM2_PRESCALER_1, 16000 );
    LED1_ON();
    TIM2_DelayMs( 1000 );
    LED1_OFF();
    /* Clear IWDGF Flag */
//   RST_ClearFlag( RST_FLAG_IWDGF );
    IWDG_Init();//1.024秒后则会产生复位
    enableInterrupts();     //使能系统中断
    while( 1 )
    {      
        /* Reload IWDG counter */
        IWDG->KR = 0xAA;//喂狗防止系统复位
//       IWDG_ReloadCounter();  //喂狗防止系统复位
        LED2_TOGGLE;
        delay_ms( 978 ); //延时978ms秒,对独立看门狗进行喂狗,防止系统复位
//       TIM2_DelayMs( 965 );//实际延时时间:980ms
    }
}

//是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数
void assert_failed( u8* file, u32 line )
{
    while ( 1 )
    {

    }
}

📚工程源码

  • 🔖IAR对中文路径不友好,不要将工程解压在带有中文字符路径的文件夹内直接打开工程编译,这样会导致IAR内部检索文件路径将消耗大量CPU资源。
链接: https://pan.baidu.com/s/1XcTRAnKCM48k1F0o8G6lBw
提取码: hv4u
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值