STM8S(105K4)使用笔记——IWDG的基础配置

0、独立看门狗的使用

独立看门狗基于低速内部RC振荡器(LSI)运行。
若LSI运行正常,当主程序发生错误时,无法重置看门狗计数器,独立看门狗将会产生复位标志位并重启。
由于独立看门狗基于LSI运行,与主程序、大部分外设相独立,这能最大限度保证独立看门狗的功能正常运行。

1、使能独立看门狗

  /* 使能独立看门狗 (低速内部RC振荡器(LSI)将会被硬件使能) */
  IWDG->KR = (uint8_t)0xCC;
注意!一旦独立看门狗被使能将无法禁用!
如果你需要使用stm8s的低功耗模式,同时需要使用看门狗复位功能,请选择窗口看门狗!

2、配置分频因子与重装载值

解除PR、RLR寄存器写保护

  /* PR、RLR寄存器有写保护,通过向KR寄存器写入0x55解除写保护。 */
  IWDG->KR = (uint8_t)0x55;
  /* 通过写入0xAA恢复写保护。 */
  IWDG->KR = (uint8_t)0xAA;

设置IWDG分频

  /* 4分频 */
  IWDG->PR = (uint8_t)0x00;
  /* 8分频 */
  IWDG->PR = (uint8_t)0x01;
  /* 16分频 */
  IWDG->PR = (uint8_t)0x02;
  /* 32分频 */
  IWDG->PR = (uint8_t)0x03;
  /* 64分频 */
  IWDG->PR = (uint8_t)0x04;
  /* 128分频 */
  IWDG->PR = (uint8_t)0x05;
  /* 256分频 */
  IWDG->PR = (uint8_t)0x06;

设置IWDG自动重装载值

  /* IWDG_Period为需要设置的自动重装载值 */
  IWDG->RLR = (uint8_t)(IWDG_Period);

IWDG计时触发公式

  • IWDG_Period= (time * IWDG_Counter_Clock - 1);
    • IWDG_Period为设置的自动重装载值
    • time 为IWDG触发所需时间(s)
    • IWDG_Counter_Clock 为IWDG频率,等于LSI/IWDG分频值(hz)

3、初始化案例

  __IO uint32_t LsiFreq = 128000;
  /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  IWDG->KR = (uint8_t)0xCC;

  /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
     dispersion) */
  /* Enable write access to IWDG_PR and IWDG_RLR registers */
  IWDG->KR = (uint8_t)0x55;

  /* IWDG counter clock: LSI(128KHZ)/128 = 1000 */
  IWDG->PR = (uint8_t)0x05;

  /* Set counter reload value to obtain 250ms IWDG Timeout.
    Counter Reload Value = 250ms/IWDG counter clock period
                         = 250ms / (LSI/128)
                         = 0.25s / (LsiFreq/128)
                         = LsiFreq/(128 * 4)
                         = LsiFreq/512
   */
  IWDG->RLR = ((uint8_t)(LsiFreq / 512));

  /* Reload IWDG counter */
  IWDG->KR = (uint8_t)0xAA;

主函数

  void main(void)
  {
    /**
    *  省略
    *
    */
    while (1)
    {
      /**
      *  省略
      *
      */
      
	  /* Reload IWDG counter */
      IWDG_ReloadCounter();
    }
  }

你可能感兴趣的:(嵌入式相关)