STM32
直播中

最强海贼王

8年用户 1287经验值
擅长:MEMS/传感技术
私信 关注
[问答]

如何去使用独立看门狗IWDG

如何去使用独立看门狗IWDG?
独立看门狗IWDG是怎样运行的?

回帖(1)

李阳

2021-9-24 15:59:18
  独立看门狗的使用
  独立看门狗基于低速内部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();
  }
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分