0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MM32F0140学习笔记——窗口看门狗(WWDG)

jf_pJlTbmA9 来源:灵动MM32MCU 作者:灵动MM32MCU 2023-10-27 09:45 次阅读

1、WWDG简介

窗口看门狗(WWDG)是喂狗时间有上下限范围的看门狗,主要用于检测由外部干扰和不可预测的逻辑条件导致程序跑飞了所引起的软件问题,根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗或滞后刷新看门狗,可以用于检测出程序是否按照正常的路径运行或者是非正常的跳过某些程序段的情况。

复位

当WWDG计数器的值大于设定的上限窗口值时喂狗,将产生复位;当计数器的值从下限固定值0x40变成0x3F时,低于窗口看门狗的下限,也会产生复位。

计数器时钟

WWDG计数器时钟由CK计时器时钟经过预分频器分频得到,预分频器的时基由配置寄存器(WWDG_CFGR)的WDGTB位配置,如图1所示,CK计时器时钟=PCLK1/4096,可将CK计时器时钟进行2分频/4分频/8分频/不分频。

“图1.WWDG计数器时钟配置
图1.WWDG计数器时钟配置

计数器

WWDG的计数器是一个递减计数器,每4096x2WDGTB个PCLK1周期减1,WDGTB的值如图1所示。控制寄存器(WWDG_CR)的T位用于存储看门狗的7位计数器值,如图2所示,计数器所有位置1时为最大值0x7F,其下限固定值为0x40,当计数器值从0x40下降到0x3F时,产生看门狗复位。WWDG的喂狗操作必须在计数器值小于窗口寄存器值时操作,只有该情况下喂狗不会产生复位。

“图2.WWDG计数器位
图2.WWDG计数器位

窗口值

如图3所示,WWDG的上限窗口值由配置寄存器(WWDG_CFGR)的W位控制,为保证窗口的价值,上限窗口值必须大于0x40且小于等于0x7F。

“图3.WWDG上限窗口值
图3.WWDG上限窗口值

提前唤醒中断

利用提前唤醒中断(EWI) 可以避免复位并且重载计数器。操作配置寄存器(WWDG_CFGR)中的EWI位开启中断,当计数器递减到0x40时,产生提前唤醒中断,可以在中断处理函数中向控制寄存器(WWDG_CR)重载计数器的值来达到喂狗的目的,从而防止复位。

2、实验

本实验配置WWDG计数器时钟的预分频系数为8分频,配置重载计数器窗口的上限值为0x7F,时钟初始化后,串口打印"wwdg_basic example.",初始化WWDG后使能提前唤醒中断(EWI),在中断处理函数中判断是否已经重装载计数器到指定次数,若未达到则重装载一次WWDG计数器,并记录重装载次数,达到指定次数则不再重装载计数器。

初始化WWDG后进入死循环,每经过一段延时,串口打印一个".",表示CPU仍在工作,直到WWDG复位,串口再次打印"wwdg_basic example."。

启用WWDG外设时钟 enable_clock()

实验使用WWDG,串口打印输出结果,串口使用引脚属于GPIOA组,因此需要启用WWDG、UART1及GPIOA的外设时钟。

void enable_clock()
{
    /* Enable WWDG clock. */
    RCC->APB1ENR |= RCC_APB1_PERIPH_WWDG;
    /* Enable GPIOA clock. */
    RCC->AHB1ENR |= RCC_AHB1_PERIPH_GPIOA;
    /* Enable UART1 clock. */
    RCC->APB2ENR |= RCC_APB2_PERIPH_UART1;
}

配置引脚 pin_init()

由于实验现象通过串口显示,故配置UART的TX(PA9)与RX(PA10)引脚。

void pin_init()
{
    /* PA9 - UART_TX. */
    GPIOA->CRH  = ~GPIO_CRH_MODE9_MASK;
    GPIOA->CRH  = ~GPIO_CRH_CNF9_MASK;
    GPIOA->CRH |= GPIO_CRH_MODE9(GPIO_Speed_50MHz);
    GPIOA->CRH |= GPIO_CRH_CNF9(GPIO_PinMode_AF_PushPull);
    GPIOA->AFRH  = ~GPIO_AFRH_AFR_MASK;
    GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE9_SHIFT);

    /* PA10 - UART_RX. */
    GPIOA->CRH  = ~GPIO_CRH_MODE10_MASK;
    GPIOA->CRH  = ~GPIO_CRH_CNF10_MASK;
    GPIOA->CRH |= GPIO_CRH_CNF10(GPIO_PinMode_In_Floating);
    GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE10_SHIFT);
}

UART初始化 uart_init()

初始化UART,配置时钟频率、波特率、数据长度、停止位、传输模式及是否使用校验。

void uart_init()
{
    /* Clear the corresponding bit to be used. */
    UART1->CCR  = ~( UART_CCR_PEN_MASK | UART_CCR_PSEL_MASK | UART_CCR_SPB0_MASK | UART_CCR_SPB1_MASK | UART_CCR_CHAR_MASK );
    UART1->GCR  = ~( UART_GCR_AUTOFLOWEN_MASK | UART_GCR_RXEN_MASK | UART_GCR_TXEN_MASK );
    /* WordLength. */
    UART1->CCR |= UART_CCR_CHAR_MASK;
    /* XferMode. */
    UART1->GCR |= (UART_XferMode_RxTx << UART_GCR_RXEN_SHIFT);
    /* Setup baudrate, BOARD_DEBUG_UART_FREQ = 48000000u, BOARD_DEBUG_UART_BAUDRATE = 9600u. */
    UART1->BRR = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) / 16u;
    UART1->FRA = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) % 16u;
    /* Enable UART1. */
    UART1->GCR |= UART_GCR_UARTEN_MASK;
}

WWDG初始化 wwdg_init()

操作配置寄存器(WWDG_CFGR)的WDGPB位配置预分频系数为8分频,W位配置重载计数器窗口的上限值为0x7F,EWI位置1使能提前唤醒中断,操作控制寄存器(WWDG_CR)的WDGA位置1,启动看门狗。

void wwdg_init()
{
    WWDG->CFGR = WWDG_CFGR_WDGTB(WWDG_Prescaler_8) | WWDG_CFGR_W(WWDG_UPPER_LIMIT);  /* WWDG_UPPER_LIMIT = 0x7F, WWDG_Prescaler_8 = 3u. */
    NVIC_EnableIRQ(WWDG_IWDG_IRQn);
    WWDG->CFGR |= WWDG_CFGR_EWI_MASK;
    WWDG->CR |=  WWDG_CR_WDGA_MASK;
}

中断服务程序 WWDG_IWDG_IRQHandler()

中断服务程序中判断是否已经重装载计数器到指定次数,若未达到则重装载一次WWDG计数器,并记录重装载次数,若达到则不再重装载计数器。向状态寄存器(WWDG_SR)的EWIF位写0,清除提前唤醒中断标志。

void WWDG_IWDG_IRQHandler(void)
{
    uint32_t status = WWDG->SR;
    if ( 0 != (WWDG_SR_EWIF_MASK   status) )
    {
        WWDG->SR  = ~WWDG_SR_EWIF_MASK;;
    }

    /* Stop reload WWDG counter aftert reload WWDG counter BOARD_WWDG_RELOAD_TIMES times. */
    if (100u > reload_times)    /* uint32_t reload_times = 0u. */
    {
        reload_times++;
        WWDG->CR = (WWDG->CR   ~WWDG_CR_T_MASK) | WWDG_CR_T(WWDG_RELOAD_VALUE);  /* WWDG_RELOAD_VALUE = 0x7f. */
    }
}

延时 soft_delay()

本实验设置初始化后进入while循环,循环中隔一段延时进行一次串口打印,表示当前CPU仍在工作,故编写软件延时。

void soft_delay(uint32_t delay)
{
    for(uint32_t i = 0u; i < delay; i++)
    {
        for(uint32_t j = 0u; j < 10000u; j++)
        {
            __NOP();
        }
    }
}

main()函数

main()函数结合上述操作,串口打印"wwdg_basic example.",初始化WWDG并使能提前唤醒中断后进入死循环,循环中每经过一段延时串口将打印一个 “.” ,表示CPU仍在工作,直到WWDG复位,实验现象如图4所示。

void main()
{
    enable_clock();
    pin_init();
    uart_init();
    printf("rnwwdg_basic example.rn");
    wwdg_init();
    while (1)
    {
        printf(".");
        soft_delay(100u);
    }
}

“图4.实验现象
图4.实验现象

来源:灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 看门狗
    +关注

    关注

    10

    文章

    559

    浏览量

    70732
收藏 人收藏

    评论

    相关推荐

    MM32之窗口看门狗WWDG

    来源 灵动MM32一、WWDG 简介窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6 位变成 0前被刷新
    发表于 05-10 17:57

    如何去使用Stm32F103的窗口看门狗WWDG

    Stm32F103的看门狗分为哪几种?独立看门狗IWDG的主要性能有哪些?窗口看门狗WWDG的主
    发表于 08-19 06:46

    基于MM32F0140开发板的独立看门狗(IWDG)设计笔记

    1、MM32F0140学习笔记——独立看门狗(IWDG)  独立看门狗(IWDG)的设计初衷是为了检测和解决由软件错误所引起的故障,与
    发表于 09-15 16:43

    STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG

    stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG看门狗主要作用是可用来检测
    发表于 11-09 17:17 8410次阅读
    STM32<b class='flag-5'>看门狗</b>配置(独立<b class='flag-5'>看门狗</b>IWDG和<b class='flag-5'>窗口</b><b class='flag-5'>看门狗</b><b class='flag-5'>WWDG</b>)

    【MCU】基于STM32CubeMX 实现窗口看门狗 WWDG

    基于STM32CubeMX 实现窗口看门狗 WWDG第一部分 基础理论基础理论部分主要参考 STM32F10X 参考手册1. WWDG 简介
    发表于 11-01 16:24 10次下载
    【MCU】基于STM32CubeMX 实现<b class='flag-5'>窗口</b><b class='flag-5'>看门狗</b> <b class='flag-5'>WWDG</b>

    MCU学习笔记_WWDG窗口看门狗

    MCU学习笔记WWDG窗口看门狗1. WWDG窗口
    发表于 12-08 17:51 7次下载
    MCU<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>_<b class='flag-5'>WWDG</b><b class='flag-5'>窗口</b><b class='flag-5'>看门狗</b>

    STM32L051使用HAL库操作实例(7)-(WWDG)窗口看门狗实验

    要求更加严格。必须在限定的时间窗口内刷新计数器。。窗口看门狗WWDG)激活后,满足以下条件会产生复位。1.递减计数器的值小于0x40时(即从0x40滚到0x3
    发表于 12-09 16:51 11次下载
    STM32L051使用HAL库操作实例(7)-(<b class='flag-5'>WWDG</b>)<b class='flag-5'>窗口</b><b class='flag-5'>看门狗</b>实验

    详解MM32F0140的独立看门狗

    独立看门狗(IWDG)的设计初衷是为了检测和解决由软件错误所引起的故障,与窗口看门狗的主要区别在于独立看门狗可以作为一个处于主程序之外,由内部低速时钟(LSI)驱动,能够完全独立工作的
    的头像 发表于 07-15 10:30 1524次阅读

    STM32窗口看门狗(WWDG)开源

    电子发烧友网站提供《STM32窗口看门狗(WWDG)开源.zip》资料免费下载
    发表于 11-14 09:26 29次下载
    STM32<b class='flag-5'>窗口</b><b class='flag-5'>看门狗</b>(<b class='flag-5'>WWDG</b>)开源

    基于MM32F0140的UDS Bootloader学习笔记

    基于MM32F0140的UDS Bootloader学习笔记
    的头像 发表于 10-30 17:11 712次阅读
    基于<b class='flag-5'>MM32F0140</b>的UDS Bootloader<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    MM32F0140学习笔记——CRC

    MM32F0140学习笔记——CRC
    的头像 发表于 11-10 18:27 569次阅读
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——CRC

    MM32F0140 SPI学习笔记

    MM32F0140 SPI学习笔记
    的头像 发表于 09-26 16:51 566次阅读
    <b class='flag-5'>MM32F0140</b> SPI<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    MM32F0140 DMA学习笔记

    MM32F0140 DMA 学习笔记
    的头像 发表于 09-18 16:57 680次阅读
    <b class='flag-5'>MM32F0140</b> DMA<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    MM32F0140 UART学习笔记

    MM32F0140 UART学习笔记
    的头像 发表于 09-26 16:45 732次阅读
    <b class='flag-5'>MM32F0140</b> UART<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    MM32F0140 GPIO学习笔记

    MM32F0140 GPIO学习笔记
    的头像 发表于 09-26 16:42 524次阅读
    <b class='flag-5'>MM32F0140</b> GPIO<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>