在进入停止模式之前禁用STM32 HAL IWDG或WWDG(看门狗)

4

我使用STM32(L0 5)的HAL,需要在进入STOP模式之前禁用IWDG或WWDG。以下代码在IWDG从STOP模式重置MCU之前运行良好。对于WWDG的使用,这比调用HAL_PWR_EnterSTOPMode之前更快速地重置,尽管在每行后调用了HAL_WWDG_Refresh。我还在Nucleo L05上测试了这些场景。

iwdgHandle.Instance = IWDG;
iwdgHandle.Init.Prescaler = IWDG_PRESCALER_64;
iwdgHandle.Init.Window = 4095;
iwdgHandle.Init.Reload = 4095;
if (HAL_IWDG_Init(&iwdgHandle) != HAL_OK) // almost 7secs until refresh has to be called
{
 _Error_Handler(__FILE__, __LINE__);
}

HAL_PWR_EnableWakeUpPin(WakeSpi_Pin);
HAL_PWREx_EnableUltraLowPower(); // Enable Ultra low power mode
HAL_PWREx_EnableFastWakeUp(); // Enable the fast wake up from Ultra low power mode

HAL_SuspendTick();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

与此同时,我发现以下内容:“IWDG是通过写入其键寄存器或硬件选项来启动的。一旦启动,除非进行复位,否则无法停止。” - Colateral
1
从ST的角度来看,WWDG和IWDG之间的一个区别是IWDG具有独立时钟。WWDG是从APB总线时钟衍生出的频率为核心时钟(SYSCLK)的时钟。由于核心时钟在STOP模式下停止,因此WWDG时钟也会停止。这意味着它会在STOP低功耗模式下自动停止,您不必刷新它。对于IWDG,您需要定期唤醒并刷新它。STM32L4系列微控制器还允许在STOP模式下停止IWDG(通过设置相应的选项字节)。 - Colateral
4个回答

6

独立看门狗无论在任何处理器模式下都无法停止。您需要定期唤醒来重新加载看门狗。您可以将分频器更改为最大值,使得看门狗计数变慢。

只有在断开控制器与电源的连接时才会停止IWDG。


WWDG似乎也有相同的行为。在进入STOP模式之前,这可以被禁用吗? - Colateral
@Colateral 不,通常一旦你启动看门狗,它就会一直运行。这是为了防止代码在故障状态下意外关闭它。 - Colin
我必须纠正自己!在关机模式下,除了LSE之外的所有时钟都关闭。因此,如果您的WDG例如在LSI上运行,则无需重新加载。请参阅电源控制章节,了解睡眠模式和时钟行为的概述。 - A.R.C.
注意:为了调试目的,当核心停止时,独立看门狗(IWDG)可以停止(请参见参考手册中的DBG_IWDG_STOP(在调试MCU冻结寄存器中))。 - rel
对于 WWDG,您可以使用 __HAL_RCC_WWDG_CLK_DISABLE() 命令来禁用它。 - user3509549
请注意,使用 __HAL_RCC_WWDG_CLK_DISABLE 禁用它应被视为一种脆弱的解决方法,不具有可移植性: 我在stm32F4上采用了这种方法,但在stm32G4上,同样的技巧无法防止wwdg引起的复位。 - gg99

1

我有(某种程度上)相同的问题,这是我所做的:

我使用HAL库,它首先初始化HAL_Init();,然后调用SystemClock_Config();,之后开始初始化周边设备,包括iwdg。(你也可以不使用HAL)。

因此,当我想进入停止模式时,我使用HAL_NVIC_SystemReset();重新启动系统,并在微处理器重新启动后,在SystemClock_Config();之后检查以前的系统重启原因(检查这个)。如果是软件复位,请进入停止模式,并且不让IWDG初始化。

简单易懂。

伪代码:

1. instead of directly going to STOP mode -> make a software restart using HAL_NVIC_SystemReset();

//After restart and configuring system clocks (before initializing other peripherals)
2. if(previous restart reason == software restart) { 
        goto stop mode /* we don't init iwdg */
    } else {
        continue initializing peripherals.
    }

1

有一个闪存选项字节,您可以清除它,以防止IWDG或WWDG计时器在停止模式下计数。


哥们,它在哪儿? - Mohammad Kholghi
@MohammadKholghi 用户选项字节包含用于控制 IWDT 是否冻结或在停止或待机模式下运行的位。 清除第 17 位可在停止模式下冻结 IWDT。 清除第 18 位可在待机模式下冻结 IWDT。 您可以使用 stm32l4xx_hal_flash_ex.c 中的 HAL_FLASHEx_OBProgram 来配置选项字节。 - Ted

0
如前所述,有一个涉及选项字节的解决方案。我使用了STM32Cube Programmer应用程序,并在用户选项中禁用了IWDG_STOP选项。这个操作在进入停止模式时会冻结看门狗定时器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接