你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32Cube HAL IDWG独立看门狗/WWDG窗口看门狗

[复制链接]
STMCU小助手 发布时间:2022-4-7 11:36
实验内容:

一、原理图

~`B8KDN6X~)RJC(VYCHIXTF.png

——————————————————独立看门狗——————————————————

二、 CubeMX配置

Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。

~VC35QGY$LT7]BKM36_EXDI.png

Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。

WAHULLSI5C[``04N~VQW4.png

0DCI2X2%V)[8A]8YSI1PJYT.png

Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)

{2FB@N$$U]][`3E$R83TUIV.png

Step4.配置LED灯所涉及到的GPIO口方便我们观察实验现象。

VBRF{_UYCO3DPPZ[MW6M@2S.png

Step5.设置独立看门狗的参数,因为独立看门狗的时钟是由内部低速时装钟LSI提供,时钟值为40KHZ,我们这边设置分频值为64(寄存器的值为4),计数值为3125,计算可得看门狗超时时间为 64*(3125+1)/40000=5S,超时时间 Tout = (rlv+1)*(4*2^prv) / 40000 (s) ,prv 是预分频器寄存器的值,rlv 是 重装载寄存器的值。

[)2DJ%}K07NF8IKA]B7442L.png

到这里关于相关参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。

三、添加功能代码

因为设置的是超时时间为5s,所以只要在5s内喂狗就可以,代码可以通过设置不同的延时时间得到不同实验现象。同时代码中,通过检测标志位区别上电复位和看门狗复位,注意标志位需要手动清除。

  1. int main(void)
  2. {

  3.   HAL_Init();
  4.   SystemClock_Config();
  5.   MX_GPIO_Init();
  6.   MX_IWDG_Init();
  7.         /*判断复位是上电复位还是看门狗复位,看门狗复位:闪红灯,上电复位:闪蓝灯*/
  8.   if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))
  9.   {
  10.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_RESET);//红灯亮
  11.                 HAL_Delay(50);
  12.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET);//红灯灭
  13.                 __HAL_RCC_CLEAR_RESET_FLAGS();//需要手动清除复位标志
  14.   }
  15.   else
  16.   {
  17.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_RESET);//绿灯亮
  18.                 HAL_Delay(50);
  19.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_SET);//绿灯灭
  20.   }
  21.   while (1)
  22.   {
  23.                
  24.                 /*设置独立看门超时时间为5秒,可通过不同时间的喂狗来验证看门狗是否起作用*/
  25.                 HAL_Delay(4000);
  26.                 //HAL_Delay(6000);
  27.                 HAL_IWDG_Refresh(&hiwdg);//喂狗
  28.   }
  29. }
复制代码


  ——————————————————窗口看门狗——————————————————

二、 CubeMX配置

Step1-Step4的配置与独立看门狗基本一致,所以参考独立看门狗即可。

Step5.串口配置(主要为了在串口调试助手显示调试数据),因为没有用到中断和DMA所以我们就不过多讲解。

4TZAP%EOLDQGG0X4]@RFJ)B.png


Step6.窗口看门狗的配置。PCLK1时钟频率为36M,计数器时钟频率为CNTCK=PCLK1/4096/(2^WDGTB)。因为分频数配置为8分频,即WDGTB=3,计一个数的时间TCNT=1/PCLK1=910us。窗口值最大值设置为0X49(73),最小值默认为0x40(64),计数的值为0X7F(127),最大超时时间:(127-64+1)*0.91=58.24ms,最小超时时间:(127-73+1)*0.91=50ms, 所以喂狗的时间段为:50ms-58.24ms。

JG7BVI6D$Y%P43UAGZY_V.png

到这里关于相关参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。

三、添加功能代码

1、我们等会会向串口调试助手发送数据,进行实验结果的验证。 发送数据我们采用printf函数,所有需要重定向c库函数printf到串口。注意使用时需要在keil设置中勾选微库(use mircolib),同时需要添加头文件#include <stdio.h>。

  1. //重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
  2. int fputc(int ch, FILE *f)
  3. {
  4.         /* 发送一个字节数据到串口DEBUG_USART */
  5.         HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);        
  6.         
  7.         return (ch);
  8. }

  9. //重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
  10. int fgetc(FILE *f)
  11. {               
  12.         int ch;
  13.         HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);        
  14.         return (ch);
  15. }
复制代码

2、在主函数while(1)循环中添加检测语句,用于检测计时是够到达窗口值(喂狗的时间段)。在实际程序中,需要计算程序的实际运行时间再来设置窗口值。

  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */
  4.                 /*PCLK1时钟频率为36M,计数器时钟频率为CNTCK=PCLK1/4096/(2^WDGTB),
  5.                 因为分频数配置为8分频,即WDGTB=3,计一个数的时间TCNT=1/PCLK1=910us
  6.                 窗口值最大值设置为0X49(73),最小值默认为0x40(64),计数的值为0X7F(127)
  7.                 最大超时时间:(127-64+1)*0.91=58.24ms,最小超时时间:(127-73+1)*0.91=50ms
  8.                 所以喂狗的时间段为:50ms-58.24ms*/
  9.                 if(((WWDG->CR)&0x7F)==0X49)//计数值等于0X49(十进制:73),开始喂狗
  10.                 {
  11.                          HAL_WWDG_Refresh(&hwwdg);//喂狗函数,即刷新计数值为0X7F(127)
  12.                          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);//正常喂狗,绿灯亮
  13.                 }
  14.     /* USER CODE BEGIN 3 */
  15.   }
复制代码

3、如果没有正常喂狗,进入死前中断函数,进行一些重要数据的处理。

  1. /*WWDG 中断服务程序,如果发生了此中断,表示程序已经出现了故障,用来保存重要数据等*/
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
  3. {
  4.         printf("程序已跑飞");
  5. }
复制代码

关于看门狗的重点:

1、独立看门狗和窗口看门狗的区别

P@_1HFM(@P86BV2P@7P{)RU.png

2、看门狗超时时间的设置。


收藏 评论0 发布时间:2022-4-7 11:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版