STM32HAL低功耗时也能调试设置,调试模式独立看门狗可被冻结L151

本文介绍STM32在低功耗模式下的调试方法,包括如何在STOP模式下进行程序下载和调试,如何在调试模式下冻结独立看门狗(IWDG),以及如何通过修改FLASH_OPTR寄存器来实现休眠时关闭IWDG计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32HAL低功耗时也能调试设置,调试模式独立看门狗可被冻结L151

https://blog.csdn.net/zhaqonianzhu/article/details/98480895

   STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_iwdg.c 

(+)IWDG可以通过软件或硬件启动(可通过选项字节配置)。
(+)IWDG由低速时钟(LSI)提供时钟,因此即使主时钟发生故障,IWDG仍保持活动状态。
(+)一旦启动IWDG,就将LSI强制设置为ON,并且不能同时禁用两者。计数器从复位值(0xFFF)开始递减计数。当达到计数值(0x000)的末尾时,将产生一个复位信号(IWDG复位)。
(+)每当在IWDG_KR寄存器中写入密钥值0x0000 AAAA时,都会将IWDG_RLR值重新加载到计数器中,并防止看门狗复位。
(+)IWDG在仍处于STOP和STANDBY模式下工作的VDD电压域中实现(IWDG复位可从STANDBY唤醒)。 RCC_CSR寄存器中的IWDGRST标志可用于通知何时发生IWDG复位。
(+)调试模式:当微控制器进入调试模式(内核暂停)时,IWDG计数器要么继续正常工作,要么停止,具体取决于DBG模块中的DBG_IWDG_STOP配置位,可通过__HAL_DBGMCU_FREEZE_IWDG()和__HAL_DBGMCU_UNFREEZE_IWDG()宏进行访问

 

STM32 芯片 IWDG 看门狗 停用 关闭 方法

https://www.pianshen.com/article/4346151203/

上google一搜索,发现  使用这个 可以在调试模式下关闭 IWDG,实际也是把WDG_SW设置为了1

__HAL_DBGMCU_FREEZE_IWDG()

另外,可以把opion bits 的 WDG_SW 设置为1.  (0代表硬看门狗, 1代表软件看门狗。) 在st-link utility->target->optionbytes

 

困扰许久的问题,在网上查了许多资料未发现有用信息,在今天看os低功耗模式时发现标准库有解决办法,我试验后,发现HAL库也是有这个功能。还有独立看门狗的问题,调试模式时会复位,本文找到了解决方法,可将独立看门狗冻结

目录

 

1.STOP模式可直接下载程序

  /* Enable Ultra low power mode */
  HAL_PWREx_EnableUltraLowPower();

  /* Enable the fast wake up from Ultra low power mode */
  HAL_PWREx_EnableFastWakeUp();

这两句以及cube(具体此部需要实验,需要查询其他资料,本人是试验成功的)在这里插入图片描述

stm32就支持低功耗时直接下载程序。

2. STOP模式可调试模式

关键词:DBGMCU

/** @defgroup HAL_Exported_Functions_Group3 DBGMCU Peripheral Control functions
 *  @brief    DBGMCU Peripheral Control functions
 *
@verbatim
 ===============================================================================
                      ##### DBGMCU Peripheral Control functions #####
 ===============================================================================
    [..]  This section provides functions allowing to:
      (+) Enable/Disable Debug module during SLEEP mode
      (+) Enable/Disable Debug module during STOP mode
      (+) Enable/Disable Debug module during STANDBY mode

@endverbatim
  * @{
  */

官方注释,文件在 stm32l1xx_hal.c

/* DBGMCU Peripheral Control functions  *****************************************/
void              HAL_DBGMCU_EnableDBGSleepMode(void);
void              HAL_DBGMCU_DisableDBGSleepMode(void);
void              HAL_DBGMCU_EnableDBGStopMode(void);
void              HAL_DBGMCU_DisableDBGStopMode(void);
void              HAL_DBGMCU_EnableDBGStandbyMode(void);
void              HAL_DBGMCU_DisableDBGStandbyMode(void);

这些函数加入到代码中就支持DEBUGMCU在各种模式下,比如,HAL_DBGMCU_EnableDBGStopMode,就可以在stop模式下进行调试。

3. 没进低功耗模式问题建议

表现出来进来就出去了,说明一进来就被唤醒了,可以查各种中断、事件看看有没有唤醒。我发现经常被唤醒的是系统滴答

void               HAL_SuspendTick(void);
void               HAL_ResumeTick(void);

也是在同一文件中,HAL_SuspendTick挂起系统滴答,HAL_ResumeTick恢复系统滴答。

4. 调试模式时独立看门狗

/**
  * @brief  IWDG Peripherals Debug mode
  */
#if defined (DBGMCU_APB1_FZ_DBG_IWDG_STOP)
#define __HAL_DBGMCU_FREEZE_IWDG()            SET_BIT(DBGMCU->APB1FZ, DBGMCU_APB1_FZ_DBG_IWDG_STOP)
#define __HAL_DBGMCU_UNFREEZE_IWDG()          CLEAR_BIT(DBGMCU->APB1FZ, DBGMCU_APB1_FZ_DBG_IWDG_STOP)
#endif

__HAL_DBGMCU_FREEZE_IWDG() 冻结看门狗,此时在调试模式下看门狗就不会复位
__HAL_DBGMCU_UNFREEZE_IWDG()恢复看门狗
类似的有很多,需要根据需求找自己需要的功能

 

 

 

STM32休眠时关闭看门狗计数的简单解决方案

本文采用STM32L476进行测试,休眠模式为STOP,看门狗为独立看门狗IWDG。
其余STM32芯片可参考本贴进行测试。

 

测试平台

本文采用STM32L476进行测试,休眠模式为STOP,看门狗为独立看门狗IWDG。
其余STM32芯片可参考本贴进行测试。

问题的提出

在此之前对这个问题的解决方法主要有三种:
(1)采用调试模式关闭内核的功能来关闭看门狗计数;
(2)休眠时采用时钟唤醒来喂狗后继续休眠;
(3)用基于系统时钟的窗口看门狗WWDG
第一种方法对STM32L476无效;第二种方案太折腾了,影响RTC使用且费电;第三种方案喂狗间隔太短。

问题的解决

官方数据手册中说明了可以在STOP休眠状态关闭IDWG
因此,只需要修改FLASH_OPTR寄存器的对应位既可以实现休眠免喂狗的功能。
在这里插入图片描述

 

源代码

源代码参考了STM32L4XX_HAL_FLASH_EX.C这个库文件,也感谢朱老师NBIOT学习群管理员给予的有益的建议。

	uint8_t flag_IWDG;
	flag_IWDG=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP)!=0;//设置旗标,避免反复加载flash导致重启
	if(flag_IWDG!=0)
	{
		HAL_FLASH_Unlock();
		HAL_FLASH_OB_Unlock();//解锁FLASH

		CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);//修改看门狗参数为:休眠时看门狗停止计数
    	/* Set OPTSTRT Bit */
   		 SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);//以下3句不可缺少,否则无法修改FLASH->OPTR
    	/* Wait for last operation to be completed */
   		 FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
   		 /* If the option byte program operation is completed, disable the OPTSTRT Bit */
    	CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
		HAL_FLASH_OB_Launch();//加载flash,会导致重启
	}
	HAL_FLASH_OB_Lock();
	HAL_FLASH_Lock();//修改完后关闭flash,已经上锁再执行一遍问题不大

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<think>好的,我需要帮助用户找到关于HAL库中独立看门狗IWDG)的代码实现和使用方法。首先,我应该回忆一下用户提到的引用内容,看看有没有相关的信息。根据引用[2]和[3],提到了HAL库中IWDG的初始化函数HAL_IWDG_Init(),以及配置步骤和超间的计算。引用[4]也提到IWDG使用内部40kHz钟,需要注意喂狗间。 用户需要的是具体的代码示例和配置步骤,所以应该结合这些信息来构建回答。首先,我需要说明IWDG的基本配置步骤,比如钟源、预分频器、重装载值等。然后,给出一个代码示例,包括初始化和喂狗的操作。同,要提到CubeMX的配置方法,因为引用[3]提到了STM32CubeMX的使用。 另外,用户可能想知道如何计算超间,所以需要包含公式,比如Tout = (4 * 2^prv) * rlv / 40kHz,并给出例子。还要提醒用户在实际使用中的注意事项,比如及喂狗,不能在中断中进行等。 最后,根据用户的要求生成相关问题,这些问题应该围绕IWDG的配置、原理、应用场景等展开。确保所有数学公式用$$...$$格式,行内公式用$...$,比如计算超间的公式要用独立公式格式。 检查是否有遗漏的步骤,比如CubeMX配置的具体操作,或者代码中的关键点。确保引用的正确性,比如引用[2]提到的初始化函数和头文件,引用[4]提到的钟频率不准确等。最后,保持回答结构清晰,分步骤说明,让用户能够逐步理解和操作。</think>根据STM32 HAL库的IWDG实现规范,独立看门狗配置可分为以下步骤: ### 一、IWDG配置步骤 1. **钟配置** IWDG使用内部低速钟LSI(约40kHz)[^4],无需手动使能钟 2. **参数初始化** 设置预分频系数$prv$和重装载值$rlv$,通过公式计算超间: $$T_{out} = \frac{4 \times 2^{prv} \times rlv}{40\ kHz}$$ 3. **代码实现** ```c #include "stm32f4xx_hal.h" IWDG_HandleTypeDef hiwdg; void MX_IWDG_Init(void) { hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_64; // 预分频系数64 hiwdg.Init.Reload = 625; // 重装载值 if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } } ``` ### 二、喂狗操作 ```c void Feed_Dog(void) { HAL_IWDG_Refresh(&hiwdg); // 写入0xAAAA触发重装载 } ``` ### 三、STM32CubeMX配置 1. 在图形界面勾选IWDG 2. 设置Prescaler为64 3. 输入Reload Value=625(对应1秒超) 4. 生成代码自动创建初始化函数 ### 四、超计算示例 当$prv=6$(64分频),$rlv=625$: $$T_{out} = \frac{4 \times 2^{6} \times 625}{40,000} = \frac{4 \times 64 \times 625}{40,000} = 4\秒$$[^3] ### 五、使用注意事项 1. 必须在计数器归零前执行喂狗 2. 不能在中断服务程序中喂狗[^2] 3. 调试模式下需暂停IWDG(通过DBGMCU模块控制) 4. LSI钟精度±50%,实际应用中需预留余量[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值