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

【经验分享】STM32G0学习手册——WWDG运用

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述
系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。

主要特性
激活窗口看门狗后,如满足如下条件则重置芯片:

当递减计数器的值小于0x40时
窗口值外重新加载递减计数器
如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。

用法

如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。

在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。

框图

20200524174123541.png


启用看门狗
当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。
当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。
递减计数器用法
该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);

为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:

20200524180957776.png


提前唤醒中断(EWI)

通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。

计算超时时间

20200524184059993.png


如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;

20200524184304815.png


寄存器
寄存器可通过半字(16位)或字(32位)进行访问。

控制寄存器(WWDG_CR)


偏移地址:0x000

复位值:0x0000 007F

BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗

BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)

配置寄存器(WWDG_CFG)

偏移地址:0x004

复位值:0x0000 007F

bit 13:11 WDGTB[2:0] (r/w),时基

000: CK计数器时钟 (PCLK 分频4096) 除以1
001: CK计数器时钟 (PCLK 分频4096) 除以2
010: CK计数器时钟 (PCLK 分频4096) 除以 4
011: CK计数器时钟 (PCLK 分频4096) 除以8
100: CK计数器时钟 (PCLK 分频4096) 除以16
101: CK计数器时钟 (PCLK 分频4096) 除以32
110: CCK计数器时钟 (PCLK 分频4096) 除以64
111: CCK计数器时钟 (PCLK 分频4096) 除以128

bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。

bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。

状态寄存器(WWDG_SR)

偏移值:0x008

复位值:0x0000 0000

bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。

实验示例
1、开启调试接口、HSE

20200702225341466.png


20200702225405256.png


2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断

20200702225814679.png


3、使能USART1,使用异步模式,波特率115200,8,none,1

20200702230037736.png


20200702230050880.png


4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127

20200702225845997.png


5、设置时钟树,HCLK=64MHz、PCLK=32MHz

20200702230304582.png


6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间

   =1048.576ms

即每1048ms喂一次狗。

7、设置工程文件属性,生成代码。

20200702231252969.png



20200702231302949.png


20200702231406699.png



代码
1、在USART.c文件中加入串口打印代码
  1. /* USER CODE BEGIN 0 */
  2. #include <stdio.h>
  3. #ifdef __GNUC__
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  5.      set to 'Yes') calls __io_putchar() */
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  7. #else
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  9. #endif /* __GNUC__ */
  10. /**
  11.   * @brief  Retargets the C library printf function to the USART.
  12.   * @param  None
  13.   * @retval None
  14.   */
  15. PUTCHAR_PROTOTYPE
  16. {
  17.   /* Place your implementation of fputc here */
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  20.   return ch;
  21. }
  22. /* USER CODE END 0 */
复制代码

2、在main.c文件中加入开机打印代码,

  1. #include <stdio.h>
  2.   MX_GPIO_Init();
  3.   MX_USART1_UART_Init();
  4.   MX_WWDG_Init();
  5.   /* USER CODE BEGIN 2 */
  6.   printf("...RESTARTing...");    //开机打印
  7.   /* USER CODE END 2 */
复制代码

加入EWI中断代码

  1. /* USER CODE BEGIN 4 */
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
  3. {
  4.   /* Prevent unused argument(s) compilation warning */
  5.   UNUSED(hwwdg);
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗
  7.   {
  8.     HAL_WWDG_Refresh(hwwdg);
  9.     printf("Refresh,OK");               
  10.   }
  11.     else
  12.   {
  13.     printf("Fail");
  14.   }
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志
  16. }
  17. /* USER CODE END 4 */
复制代码

3、编译,烧录之后就看到效果

20200702232811689.png




收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似分享

官网相关资源

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