STM32
直播中

孙奕

8年用户 976经验值
私信 关注
[问答]

STM32L433单片机如何在调试的时候关闭看门狗?

背景:在STM32L433单片机上使能了看门狗,但是不能像STM32F103那样配置调试时关闭看门狗
STM32F103配置如何:
__HAL_DBGMCU_FREEZE_IWDG();    // 在调试单步时,独立看门狗iwdg暂停    The independent watchdog counter clock is stopped when the core is halted__HAL_DBGMCU_FREEZE_WWDG();        //窗口狗也暂停
问题:STM32L433要如何配置

回帖(2)

刘琴

2025-7-11 16:54:46
STM32L4系列的IWDG和WWDG在调试状态下的计数动作是可以单独控制的,


由DBGMCU_APB1FZR1寄存器的第11位和第12位控制。


相应库函数有:


__HAL_DBGMCU_FREEZE_WWDG();


__HAL_DBGMCU_FREEZE_IWDG() ;


运行上面代码后,APB1FZR1寄存器的第11位和第12位会被置1,你可以通过SFR寄存器查看确认。


此后,在调试状态下当CPU停止执行指令时看门狗也会停止计数;


你似乎在说,只是调用了__HAL_DBGMCU_FREEZE_IWDG() ;但在CPU暂停执行


指令时WWDG也受到了影响,若是这样的话,你可以确认下DBGMCU_APB1FZR1寄存器的第11位是否也


被置1了,若该位是1,此时你可以使用__HAL_DBGMCU_UNFREEZE_WWDG();将WWDG控制位清零。


我这边实际验证过了,是可以单独控制的。
举报

张波

2025-7-17 17:45:06

在STM32L433上调试时关闭看门狗(IWDG/WWDG)的配置方法与STM32F103不同,需通过DBGMCU寄存器设置。以下是具体解决方案:


配置步骤:




  1. 包含头文件


    #include "stm32l4xx_hal.h"



  2. 在main函数初始化阶段调用(必须在看门狗启用前执行):


    // 调试状态下冻结独立看门狗(IWDG)
    HAL_DBGMCU_EnableDBGSleepMode();
    HAL_DBGMCU_EnableDBGStopMode();
    HAL_DBGMCU_EnableDBGStandbyMode();
    __HAL_DBGMCU_FREEZE_IWDG();  // 核心暂停时冻结IWDG

    // 冻结窗口看门狗(WWDG) - 使用专用寄存器
    __HAL_DBGMCU_FREEZE_WWDG();



关键说明:




  1. 执行位置



    • 必须在初始化看门狗(HAL_IWDG_Start()之前调用

    • 建议在main()的开头或SystemClock_Config()之后立即调用




  2. 寄存器映射



    • IWDG通过DBGMCU_APB1_FZ1寄存器的DBG_IWDG_STOP位控制

    • WWDG通过DBGMCU_APB1_FZ2寄存器的DBG_WWDG_STOP位控制

    • 上述HAL宏已封装这些寄存器操作




  3. 低功耗模式支持


    HAL_DBGMCU_EnableDBGSleepMode();
    HAL_DBGMCU_EnableDBGStopMode();
    HAL_DBGMCU_EnableDBGStandbyMode();

    这些调用确保调试器连接时看门狗在低功耗模式下仍被冻结




  4. CubeMX配置(可选):



    • Pinout & ConfigurationSystem CoreDEBUG中勾选:
      [x] Enable IWDG freeze in Debug
      [x] Enable WWDG freeze in Debug




工作原理:


当微控制器被调试器暂停(如断点、单步执行)时:



  1. IWDG/WWDG计数器自动冻结

  2. 看门狗超时计数器停止递增

  3. 恢复运行时计数器继续工作


完整代码示例:


#include "stm32l4xx_hal.h"

int main(void) {
  HAL_Init();

  // 启用调试冻结功能
  HAL_DBGMCU_EnableDBGSleepMode();
  HAL_DBGMCU_EnableDBGStopMode();
  HAL_DBGMCU_EnableDBGStandbyMode();

  // 冻结看门狗计数器
  __HAL_DBGMCU_FREEZE_IWDG();
  __HAL_DBGMCU_FREEZE_WWDG();

  // 后续初始化(时钟、外设等)
  SystemClock_Config();

  // 此处初始化看门狗(在冻结配置之后!)
  // HAL_IWDG_Init(...);

  while (1) {
    // 喂狗操作
    // HAL_IWDG_Refresh(&hiwdg);
  }
}


注意:此配置仅影响调试暂停时的行为,正常运行时看门狗仍会工作。务必在真实环境中测试看门狗功能是否正常。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分