[活动] 【APM32F107VC MINIBOARD开发板测评】3.IWDT与WWDT

[复制链接]
 楼主| 发表于 2023-2-19 20:50 | 显示全部楼层 |阅读模式
本帖最后由 xld0932 于 2023-2-19 20:52 编辑

看门狗是用来监测由软件错误引起的系统故障。片上一共有两个看门狗设备:独立看门狗和窗口看门狗,它们提高了安全性、使时间更加精确以及使用变得更加灵活。

独立看门狗是由一个八位预分频器 IWDT_PSC、 12 位递减计数器、 12 位重装载寄存器 IWDT_CNTRLD、键寄存器 IWDT_KEY 和状态寄存器 IWDT_STS 组成。独立看门狗只有在计数器减到 0 时,会复位,在没有减到 0 之前,刷新计数器的值不会发生复位。独立看门狗有独立的时钟源,即使是在主时钟失效的情况下,它仍然有效。独立看门狗适用于需要独立的环境但对精确度要求不高的场所。参考程序如下所示:
  1. MultiTimer IWDT_MultiTimer;

  2. /*!
  3.   * [url=home.php?mod=space&uid=247401]@brief[/url]       IWDT MultiTimer callback
  4.   *
  5.   * @param       None
  6.   *
  7.   * @retval      None
  8.   *
  9.   */
  10. void IWDT_MultiTimerCallback(MultiTimer *timer, void *userData)
  11. {
  12.     IWDT_Refresh();

  13.     MultiTimerStart(&IWDT_MultiTimer, 50, IWDT_MultiTimerCallback, "IWDT");
  14. }

  15. /*!
  16.   * [url=home.php?mod=space&uid=247401]@brief[/url]       IWDG Init
  17.   *
  18.   * @param       None
  19.   *
  20.   * @retval      None
  21.   *
  22.   */
  23. void IWDT_Init(void)
  24. {
  25.     IWDT_EnableWriteAccess();
  26.     IWDT_ConfigDivider(IWDT_DIVIDER_32);
  27.     IWDT_ConfigReload(300);
  28.     IWDT_Enable();

  29.     MultiTimerStart(&IWDT_MultiTimer, 50, IWDT_MultiTimerCallback, "IWDT");
  30. }

窗口看门狗时钟来自 PCLK1,计数器时钟由 CK 计数器时钟经过预分频分频得到(由配置寄存器配置)。窗口看门狗含有一个 7 位自由运行递减计数器、预分频器、控制寄存器WWDT_CTRL、配置寄存器 WWDT_CFG 和状态寄存器 WWDT_STS。窗口看门狗在计数器减到 0x3F 时会发生复位,当计数器计数的值在配置寄存器的窗口值之前,刷新计数器也会发生复位。窗口看门狗适用于需要精确计时的场合。参考程序如下所示:(中断形式实现)
  1. /*!
  2.   * @brief       WWDT Init
  3.   *
  4.   * @param       None
  5.   *
  6.   * @retval      None
  7.   *
  8.   */
  9. void WWDT_Init(void)
  10. {
  11.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_WWDT);

  12.     WWDT_ConfigTimebase(WWDT_TIME_BASE_8);
  13.     WWDT_ConfigWindowData(80);
  14.     WWDT_Enable(127);

  15.     WWDT_ClearFlag();
  16.     NVIC_EnableIRQRequest(WWDT_IRQn, 0, 0);
  17.     WWDT_EnableEWI();
  18. }

参考main主程序,对上电复位的复位源进行监控,并打印出当前系统运行的相关时钟频率:
  1. /*!
  2.   * @brief       Main program
  3.   *
  4.   * @param       None
  5.   *
  6.   * @retval      None
  7.   *
  8.   */
  9. int main(void)
  10. {
  11.     uint32_t PCLK1, PCLK2;

  12.     MultiTimerInstall(SysTick_GetTick);

  13.     SysTick_Config(SystemCoreClock / 1000);

  14.     USART_Init(115200);

  15.     if (SET == RCM_ReadStatusFlag(RCM_FLAG_IWDTRST))
  16.     {
  17.         printf("\r\nIWDT RST");

  18.         RCM_ClearStatusFlag();
  19.     }
  20.     else if (SET == RCM_ReadStatusFlag(RCM_FLAG_WWDTRST))
  21.     {
  22.         printf("\r\nWWDT RST");

  23.         RCM_ClearStatusFlag();
  24.     }
  25.     else
  26.     {
  27.     }

  28.     printf("\r\nAPM32F107VC MINIBOARD V1.0 %s %s\r\n", __DATE__, __TIME__);

  29.     printf("\r\nSYSCLK : %dHz", RCM_ReadSYSCLKFreq());
  30.     printf("\r\nHCLK   : %dHz", RCM_ReadHCLKFreq());

  31.     RCM_ReadPCLKFreq(&PCLK1, &PCLK2);
  32.     printf("\r\nPCLK1  : %dHz", PCLK1);
  33.     printf("\r\nPCLK2  : %dHz", PCLK2);

  34.     printf("\r\nADCCLK : %dHz", RCM_ReadADCCLKFreq());

  35.     ADC_Init();

  36.     DAC_Init();

  37.     IWDT_Init();

  38.     KEY_Init();

  39.     LED_Init();

  40.     WWDT_Init();

  41.     while (1)
  42.     {
  43.         MultiTimerYield();
  44.     }
  45. }

运行日志: 微信图片_20230219205146.png

软件工程源代码:
Project_IWDT_WWDT.zip (488.68 KB, 下载次数: 8)

发表于 2023-3-4 20:56 | 显示全部楼层
这个两个有什么区别呢?              
发表于 2023-3-5 10:47 | 显示全部楼层
IWDG和WWDG?              
发表于 2023-3-7 20:27 | 显示全部楼层
这个两个有什么区别呢?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 返回顶部 返回列表