口天土立口 发表于 2025-9-6 20:00

APM32E030的WWDT驱动

本帖最后由 口天土立口 于 2025-9-7 18:35 编辑



APM32E030拥有一个窗口看门狗,此看门狗的喂狗时间必须在设计的窗口期内,早于窗口期或者晚于窗口期都将产生复位。

驱动代码如下:
/*
* @brief       WWDT初始化
*
* @param       is_debug_stop: 调试是否停止
*
* @retval      None
*
*/
void bsp_wwdt_init(uint8_t is_debug_stop)
{
    /* 调试时看门狗计数器是否停止工作 */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_DBGMCU);
    if (is_debug_stop != 0) {
      DBG_EnableAPB1Periph(DBG_APB1_PER_WWDT_STOP);
    } else {
      DBG_DisableAPB1Periph(DBG_APB1_PER_WWDT_STOP);
    }
   
    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_WWDT);
    WWDT_SetTimebase(WWDT_DIV_1);
    WWDT_ConfigWindowValue(0x7F);
    WWDT_EnableEWI();
    WWDT_Enable(0xFF);   
   
    NVIC_EnableIRQ(WWDT_IRQn);
    NVIC_SetPriority(WWDT_IRQn, 0);
}/*
* @brief       WWDT喂狗
*
* @param       None
*
* @retval      None
*
*/
void bsp_wwdt_feed(void)
{
    WWDT_ConfigCounter(0xFF);
}

void WWDT_IRQHandler(void)
{
    if (WWDT_ReadStatusFlag()) {
      bsp_wwdt_feed();
      WWDT_ClearStatusFlag();
    }
}

测试代码如下:
// 应用初始化
void app_init(void)
{
    bsp_wwdt_init(1);
}

// 应用任务
void app_task(void)
{
}

详细代码,请查看附件!

幻影书记 发表于 2025-9-8 14:17

帖子的内容上看窗口看门狗要求很严格,但代码上看和IWDT几乎一样

口天土立口 发表于 2025-9-8 19:36

幻影书记 发表于 2025-9-8 14:17
帖子的内容上看窗口看门狗要求很严格,但代码上看和IWDT几乎一样

主要是喂狗上要求更严格,同时时钟源不一样

暖心小太阳 发表于 2025-9-12 20:39

如果喂狗失败,系统会如何响应?

幻影书记 发表于 2025-9-23 23:38

时钟源的事情还真没有注意到。
谢谢楼主

破晓战神 发表于 2025-9-28 20:33

我注意到你设置了窗口值为0x7F,这个值是如何确定的?是基于什么考虑?

彩虹捕手 发表于 2025-9-30 21:05

喂狗函数`bsp_wwdt_feed`的实现很简洁,直接重置了看门狗的计数器
页: [1]
查看完整版本: APM32E030的WWDT驱动