STM32G474xx HAL用户手册
stm32g4xx_hal_wwdg.c
跳转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_wwdg.c
00004   * @author  MCD Application Team
00005   * @brief   WWDG HAL模块驱动程序。
00006   *          本文件提供固件功能以管理窗口看门狗(WWDG)外设的以下功能:
00007   *           + 初始化和配置函数
00008   *           + IO操作函数
00009   ******************************************************************************
00010   * @attention
00011   *
00012   * Copyright (c) 2019 STMicroelectronics.
00013   * All rights reserved.
00014   *
00016   * This software is licensed under terms that can be found in the LICENSE file
00017   * in the root directory of this software component.
00018   * If no LICENSE file comes with this software, it is provided AS-IS.
00019   *
00020   ******************************************************************************
00021   @verbatim
00022   ==============================================================================
00023                       ##### WWDG特定功能 #####
00024   ==============================================================================
00025   [..]
00026     一旦启用,WWDG会在编程的时间周期到期时产生系统复位,除非程序在计数器
00027     (T[6;0]下计数器)达到0x3F值之前刷新计数器(即当计数器值从0x40向下滚动
00028     到0x3F时产生复位)。
00029 
00030     (+) 如果在计数器达到刷新窗口值之前刷新计数器值,也会产生MCU复位。
00031         这意味着计数器必须在有限的时间窗口内刷新。
00033     (+) 一旦启用,除非通过系统复位,否则无法禁用WWDG。
00034     (+) 如果应用程序需要,可以触发早期唤醒中断,以便在WWDG到期之前获得警告。
00036         早期唤醒中断(EWI)可用于在生成实际复位之前执行特定的安全操作或数据记录。
00037         当下计数器达到0x40时,会发生中断。此机制需要在NVIC中启用WWDG中断线。
00038         一旦启用,除非通过系统复位,否则无法禁用EWI中断。
00040     (+) RCC CSR寄存器中的WWDG RST标志可用于指示何时发生WWDG复位。
00041     (+) WWDG计数器输入时钟源自APB时钟除以可编程预分频器。
00043     (+) WWDG时钟(Hz) = PCLK1 / (4096 * 预分频器)
00045     (+) WWDG超时(mS) = 1000 * (T[5;0] + 1) / WWDG时钟(Hz)
00047         其中T[5;0]是计数器的最低6位。
00048     (+) WWDG计数器刷新允许在以下限制范围内:
00049         (++) 最小时间(mS) = 1000 * (计数器 - 窗口) / WWDG时钟
00050         (++) 最大时间(mS) = 1000 * (计数器 - 0x40) / WWDG时钟
00051     (+) 典型值:
00052         (++) 计数器最小(T[5;0] = 0x00),在170MHz(PCLK1)下,预分频器为1:
00053              复位前的最大超时:约24.09us
00054         (++) 计数器最大(T[5;0] = 0x3F),在170MHz(PCLK1)下,预分频器
00056              分频比为128:
00057              复位前的最大超时:约197.38ms
00058 
00059                      ##### 如何使用此驱动程序 #####
00060   ==============================================================================
00061 
00062     *** 通用驱动程序使用方法 ***
00063     ===========================
00065 
00066   [..]
00067     (+) 使用__HAL_RCC_WWDG_CLK_ENABLE()启用WWDG APB1时钟。
00068     (+) 使用HAL_WWDG_Init()函数配置WWDG预分频器、刷新窗口值、计数器值和早期
00069         中断状态。这将自动启用WWDG并启动其下计数器。时间参考可以从
        函数返回时获取。必须注意提供大于0x40的计数器值以防止立即产生复位。
00071     (+) 如果启用了早期唤醒中断(EWI)功能,当计数器达到0x40时会触发中断。
00073         当中断服务程序触发HAL_WWDG_IRQHandler时,标志将被自动
00075         清除,并将执行HAL_WWDG_WakeupCallback用户回调。用户可以
00076         通过自定义回调HAL_WWDG_WakeupCallback来添加自己的代码。
00077     (+) 然后应用程序必须在正常操作期间定期刷新WWDG计数器以防止MCU复位,
00078         使用HAL_WWDG_Refresh()函数。此操作只能在计数器值低于
        已编程的刷新窗口值时执行。
00080 
00081     *** 回调注册 ***
00082     =============================

00084   [..]
00085     当编译定义USE_HAL_WWDG_REGISTER_CALLBACKS设置为1时,允许
00087     用户动态配置驱动程序回调。使用函数HAL_WWDG_RegisterCallback()
00088     注册用户回调。
00089 
00090     (+) 函数HAL_WWDG_RegisterCallback()允许注册以下
00091         回调:
00092         (++) EwiCallback:早期唤醒中断的回调。
00093         (++) MspInitCallback:WWDG MspInit。
00094     此函数需要以下参数:HAL外设句柄、回调ID和指向用户回调函数的指针。
00095 
00096     (+) 使用函数HAL_WWDG_UnRegisterCallback()将回调重置为
00097     默认弱函数。HAL_WWDG_UnRegisterCallback()
00098     需要以下参数:HAL外设句柄和回调ID。
    此函数允许重置以下回调:
00100         (++) EwiCallback:早期唤醒中断的回调。
00101         (++) MspInitCallback:WWDG MspInit。
00102 
00103     [..]
00104     调用HAL_WWDG_Init函数时,回调将重置为
00106     对应的旧版弱函数:
00107     HAL_WWDG_EarlyWakeupCallback()和HAL_WWDG_MspInit(),仅当它们之前未
00108     被注册过时。
00109 
00110     [..]
00111     当编译定义USE_HAL_WWDG_REGISTER_CALLBACKS设置为0或
00112     未定义时,回调注册功能不可用,
00113     并且使用弱(覆盖)回调。
00114 
00115     *** WWDG HAL驱动程序宏列表 ***
00116     ===================================
00117     [..]
00118       以下是WWDG HAL驱动程序中可用的宏列表。
00119       (+) __HAL_WWDG_ENABLE:启用WWDG外设
00120       (+) __HAL_WWDG_GET_FLAG:获取所选WWDG的标志状态
00121       (+) __HAL_WWDG_CLEAR_FLAG:清除WWDG的待处理标志
00122       (+) __HAL_WWDG_ENABLE_IT:启用WWDG早期唤醒中断
00123 
00124   @endverbatim
00125   */
00126 
00127 /* Includes ------------------------------------------------------------------*/
00128 #include "stm32g4xx_hal.h"
00129 
00130 /** @addtogroup STM32G4xx_HAL_Driver
00131   * @{
00132   */
00133 
00134 #ifdef HAL_WWDG_MODULE_ENABLED
00135 /** @defgroup WWDG WWDG
00136   * @brief WWDG HAL模块驱动程序。
00137   * @{
00138   */
00139 
00140 /* Private typedef -----------------------------------------------------------*/
00141 /* Private define ------------------------------------------------------------*/
00142 /* Private macro -------------------------------------------------------------*/
00143 /* Private variables ---------------------------------------------------------*/
00144 /* Private function prototypes -----------------------------------------------*/
00145 /* Exported functions --------------------------------------------------------*/
00146 
00147 /** @defgroup WWDG_Exported_Functions WWDG导出函数
00148   * @{
00149   */
00150 
00151 /** @defgroup WWDG_Exported_Functions_Group1 初始化和配置函数
00152   *  @brief    初始化和配置函数。
00153   *
00154 @verbatim
00155   ==============================================================================
00156           ##### 初始化和配置函数 #####
00157   ==============================================================================
00158   [..]
00159     本节提供的函数允许:
00160       (+) 根据关联句柄的WWDG_InitTypeDef中指定的参数初始化和启动WWDG
00161       (+) 初始化WWDG MSP。
00163 
00164 @endverbatim
00165   * @{
00166   */
00167 
00168 /**
00169   * @brief  根据指定参数初始化WWDG。
00170   *         参数在关联句柄的WWDG_InitTypeDef中指定。
00172   * @param  hwwdg  指向WWDG_HandleTypeDef结构的指针,该结构包含
00173   *                指定WWDG模块的配置信息。
00174   * @retval HAL状态
00175   */
00176 HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
00177 {
00178   /* 检查WWDG句柄分配 */
00179   if (hwwdg == NULL)
00180   {
00181     return HAL_ERROR;
00182   }
00183 
00184   /* 检查参数 */
00185   assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
00186   assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler));
00187   assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window));
00188   assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter));
00189   assert_param(IS_WWDG_EWI_MODE(hwwdg->Init.EWIMode));
00190 
00191 #if (USE_HAL_WWDG_REGISTER_CALLBACKS ==