|
STM32G474xx HAL用户手册
|
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 ==