• stm32——hal库学习笔记(WWDG)


    一、WWDG简介(了解)

    在这里插入图片描述
    WWDG有什么作用?
    在这里插入图片描述

    二、WWDG工作原理(熟悉)

    在这里插入图片描述

    三、WWDG框图(熟悉)

    在这里插入图片描述

    四、WWDG寄存器(熟悉)

    控制寄存器 (WWDG_CR)
    在这里插入图片描述
    配置寄存器 (WWDG_CFR)
    在这里插入图片描述
    状态寄存器 (WWDG_SR)
    在这里插入图片描述

    五、WWDG超时时间计算(掌握)

    在这里插入图片描述
    WWDG最短最长超时时间(F1为例)
    在这里插入图片描述

    六、WWDG配置步骤(掌握)

    在这里插入图片描述

    HAL_WWDG_Init()
    
    • 1

    在这里插入图片描述

    HAL_WWDG_MspInit()    //配置NVIC、CLOCK等
    
    • 1

    在这里插入图片描述

    HAL_NVIC_SetPriority()HAL_NVIC_EnableIRQ()
    
    • 1

    在这里插入图片描述

    WWDG_IRQHandler() 、HAL_WWDG_IRQHandler
    
    • 1

    在这里插入图片描述

    HAL_WWDG_EarlyWakeupCallback()
    
    • 1

    在这里插入图片描述

    HAL_WWDG_Refresh()
    
    • 1

    相关HAL库函数介绍
    在这里插入图片描述

    七、编程实战:验证窗口看门狗功能(掌握)

    在这里插入图片描述
    wdg.c

    #include "./BSP/WDG/wdg.h"
    #include "./BSP/LED/led.h"
    /************************以下是窗口看门狗代码********************************/
    WWDG_HandleTypeDef g_wwdg_handle;  /* WWDG句柄 */
    
    /**
     * @brief       初始化窗口看门狗
     * @param       tr: T[6:0],计数器值
     * @param       tw: W[6:0],窗口值
     * @param       fprer:分频系数(WDGTB),范围:WWDG_PRESCALER_1~WWDG_PRESCALER_8,表示2^WDGTB分频
     *              Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=36Mhz
                    最大-最小超时时间参考 RM0008或者《STM32F10xxx参考手册》P321
     * @retval      无
     */
    void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer)
    {
        g_wwdg_handle.Instance = WWDG;
        g_wwdg_handle.Init.Prescaler = fprer;         /* 设置分频系数 */
        g_wwdg_handle.Init.Window = wr;               /* 设置窗口值 */
        g_wwdg_handle.Init.Counter = tr;              /* 设置计数器值 */
        g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE; /* 使能窗口看门狗提前唤醒中断 */
        HAL_WWDG_Init(&g_wwdg_handle);                /* 初始化WWDG */
    }
    
    /**
     * @brief       WWDG MSP回调
     * @param       WWDG句柄
     * @note        此函数会被HAL_WWDG_Init()调用
     * @retval      无
     */
    void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
    {
        __HAL_RCC_WWDG_CLK_ENABLE();            /* 使能窗口看门狗时钟 */
    
        HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);  /* 抢占优先级2,子优先级为3 */
        HAL_NVIC_EnableIRQ(WWDG_IRQn);          /* 使能窗口看门狗中断 */
    }
    
    /**
     * @brief       窗口看门狗中断服务程序
     * @param       无
     * @retval      无
     */
    void WWDG_IRQHandler(void)
    {
        HAL_WWDG_IRQHandler(&g_wwdg_handle);  /* 调用WWDG共用中断处理函数 */
    }
    
    /**
     * @brief       窗口看门狗喂狗提醒中断服务回调函数
     * @param       wwdg句柄
     * @note        此函数会被HAL_WWDG_IRQHandler()调用
     * @retval      无
     */
    void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    {
        HAL_WWDG_Refresh(&g_wwdg_handle); /* 更新窗口看门狗值 */
        LED1_TOGGLE();                    /* LED1闪烁 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    wdg.h

    #ifndef __WDG_H
    #define __WDG_H
    
    #include "./SYSTEM/sys/sys.h"
    
    void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer);
    
    #endif
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    main.c

    #include "./SYSTEM/sys/sys.h"
    #include "./SYSTEM/usart/usart.h"
    #include "./SYSTEM/delay/delay.h"
    #include "./BSP/LED/led.h"
    #include "./BSP/WDG/wdg.h"
    
    
    int main(void)
    {
        HAL_Init();                             /* 初始化HAL库 */
        sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
        delay_init(72);                         /* 延时初始化 */
        usart_init(115200);                     /* 串口初始化为115200 */
        led_init();                             /* 初始化LED */
        LED0(0);                                /* 点亮LED0 红灯 */
        delay_ms(300);                          /* 延时300ms再初始化看门狗,LED0的变化"可见" */
        wwdg_init(0X7F, 0X5F, WWDG_PRESCALER_8);/* 计数器值为7f,窗口寄存器为5f,分频数为8 */
    
        while (1)
        {
            LED0(1);                            /* 关闭红灯 */
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    八、IWDG和WWDG的主要区别(熟悉)

  • 相关阅读:
    数据结构与算法 | 图(Graph)
    【机器学习】线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降
    【Spring使用三级缓存解决循环依赖的过程】
    C++ Primer Plus第五版笔记(p51-100)
    Go Web——template标准库
    浅谈化工生产制造企业软件系统的选择
    2022面试相关- web浏览器相关知识
    Verilog学习(1)
    “磁性蝴蝶”:创新结构纳米石墨烯能更精确控制自旋磁行为
    [附源码]Python计算机毕业设计Django公共台账管理系统
  • 原文地址:https://blog.csdn.net/wozhihecha/article/details/136157427