Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9464444
  • 博文数量: 1750
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20091
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1750)

文章存档

2024年(26)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2019-07-04 19:59:26

 

通过 MX_IWDG_Init 时, 已经开启IWDG. 
剩下就是在合适的时机  HAL_IWDG_Refresh(&hiwdg);

由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下等,所以它叫独立看门狗,注意一旦开启此看门狗则只能由MCU复位后才清除,让它不再工作。

它的时钟是一个内部RC时钟,它会在30KHZ到60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ


点击(此处)折叠或打开

  1. ##### How to use this driver #####
  2.   ==============================================================================
  3.   [..]
  4.     (#) Use IWDG using HAL_IWDG_Init() function to :
  5.       (++) Enable instance by writing Start keyword in IWDG_KEY register. LSI
  6.            clock is forced ON and IWDG counter starts downcounting.
  7.       (++) Enable write access to configuration register: IWDG_PR & IWDG_RLR.
  8.       (++) Configure the IWDG prescaler and counter reload value. This reload
  9.            value will be loaded in the IWDG counter each time the watchdog is
  10.            reloaded, then the IWDG will start counting down from this value.
  11.       (++) wait for status flags to be reset
  12.     (#) Then the application program must refresh the IWDG counter at regular
            intervals during normal operation to prevent an MCU reset, using
            HAL_IWDG_Refresh() function.

点击(此处)折叠或打开

  1. static void MX_IWDG_Init(void)  //在 cubeMX 中配置 iwdg的频率为 40Khz
  2. {
  3.   hiwdg.Instance = IWDG;
  4.   hiwdg.Init.Prescaler = IWDG_PRESCALER_32;  //32分频, 差不多 1.25Khz, 约 0.8 ms 计数一次.
  5.   hiwdg.Init.Reload = 1000;  //1000, 即1000 * 0.8 = 800ms 不刷新IWDG, 则系统复位
  6.   if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  7.   {
  8.     Error_Handler();
  9.   }
  10. }

点击(此处)折叠或打开

  1. while (1)
  2.   {
  3.         HAL_IWDG_Refresh(&hiwdg);  //喂狗        
  4.         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  5.         HAL_Delay(100);  //如果为 820就很临界了, 很可能会触发引起硬复位. 主要是 40KHz 不是精确值.
  6.   }
窗口看门狗相对独立看门狗对计数器的刷新时间要求更加严格。必须在限定的时间窗口内刷新计数器
窗口看门狗激活情况下,7位递减寄存器满足以下条件会产生复位。
    1.当递减计数器的值小于0x40时(即从0x40滚到0x3F)会产生复位。                     狗饿死了.
    2.当计数器值大于窗口寄存器的值时,如果软件重载计数器,则会产生复位.        狗撑死了.
即不能太早刷新, 也不能太迟刷新.

WWDG时钟是挂接到APB1上, 使用 PCLK1.   (24位计数器)
根据 STM32F101xx_2xx_3xx_5xx_7xx_UM.pdf P493的公式

Twwdg = Tpclk1 * 4096 * 2wdgtb(预分频) * (T[5:0](递减计数器的值) + 1)


当 PCLK1=54MHz.
  如果配置WWDG为8分频, 则
   WWDG计数器的频率为:(PCLK1 (54MHz)/4096)/8) = 1648 Hz (~607 us)


WWDG计数器设置刷新值为127,则超时时间为:~607 us * (127-63(即0x40)) = 39 ms

设置窗口值90(狗撑死的界限), 那么在计数器递减到 90, 才能进行喂狗动作.

设置开启 WWDG的中断. 
提前唤醒中断 (EWI)置 1 后,只要计数器值达到 0x40 就会产生中断。此中断只有在复位后才由硬件清零. 一般不需要设置.

点击(此处)折叠或打开

  1. static void MX_WWDG_Init(void)  //当前设置为 PCLK1 = 32MHz.
  2. {
  3.   hwwdg.Instance = WWDG;  
  4.       //则 WWDG计数器的频率为:(PCLK1 (32MHz)/4096)/8) = 1000 Hz (~1000 us)
  5.         // WWDG计数器设置刷新值为127(狗撑死的界限),则超时时间为:~1000 us * (127-63(即0x40)) = 64 ms.
  6.      //设置window = 90, 则 至少需要 ~1000 us * (127-90) = 38 ms 后才能喂狗.
  7.   hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
  8.   hwwdg.Init.Window = 90;
  9.   hwwdg.Init.Counter = 127;
  10.   hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
  11.   if (HAL_WWDG_Init(&hwwdg) != HAL_OK)  //初始化并使能递减计数器开始递减.
  12.   {
  13.     Error_Handler();
  14.   }
  15.   //需要重新赋值一遍, 否则 Init被清空, 应该是HAL的BUG
  16.   hwwdg.Init.Window = 90;
  17.   hwwdg.Init.Counter = 127;
  18.   hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
  19. }
下面就是刷新wwdg. //当递减计数器递减到0x40时,触发中断函数,进行喂狗
void WWDG_IRQHandler(void)  //注意这个暂时无法设置断点的.
{
  // HAL_WWDG_IRQHandler(&hwwdg);  如果设置EWI, 则需要开启 
HAL_WWDG_Refresh(&hwwdg);
}


阅读(3456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~