1 /**
2   ******************************************************************************
3   * @file    stm32f7xx_hal_wwdg.c
4   * @author  MCD Application Team
5   * @version V1.0.1
6   * @date    25-June-2015
7   * @brief   WWDG HAL module driver.
8   *          This file provides firmware functions to manage the following
9   *          functionalities of the Window Watchdog (WWDG) peripheral:
10   *           + Initialization and de-initialization functions
11   *           + IO operation functions
12   *           + Peripheral State functions
13   @verbatim
14   ==============================================================================
15                       ##### WWDG specific features #####
16   ==============================================================================
17   [..]
18     Once enabled the WWDG generates a system reset on expiry of a programmed
19     time period, unless the program refreshes the counter (downcounter)
20     before reaching 0x3F value (i.e. a reset is generated when the counter
21     value rolls over from 0x40 to 0x3F).
22 
23     (+) An MCU reset is also generated if the counter value is refreshed
24         before the counter has reached the refresh window value. This
25         implies that the counter must be refreshed in a limited window.
26     (+) Once enabled the WWDG cannot be disabled except by a system reset.
27     (+) WWDGRST flag in RCC_CSR register can be used to inform when a WWDG
28         reset occurs.
29     (+) The WWDG counter input clock is derived from the APB clock divided
30         by a programmable prescaler.
31     (+) WWDG clock (Hz) = PCLK1 / (4096 * Prescaler)
32     (+) WWDG timeout (mS) = 1000 * Counter / WWDG clock
33     (+) WWDG Counter refresh is allowed between the following limits :
34         (++) min time (mS) = 1000 * (Counter - Window) / WWDG clock
35         (++) max time (mS) = 1000 * (Counter - 0x40) / WWDG clock
36 
37     (+) Min-max timeout value at 50 MHz(PCLK1): 81.9 us / 41.9 ms
38 
39 
40                      ##### How to use this driver #####
41   ==============================================================================
42   [..]
43     (+) Enable WWDG APB1 clock using __HAL_RCC_WWDG_CLK_ENABLE().
44     (+) Set the WWDG prescaler, refresh window and counter value
45         using HAL_WWDG_Init() function.
46     (+) Start the WWDG using HAL_WWDG_Start() function.
47         When the WWDG is enabled the counter value should be configured to
48         a value greater than 0x40 to prevent generating an immediate reset.
49     (+) Optionally you can enable the Early Wakeup Interrupt (EWI) which is
50         generated when the counter reaches 0x40, and then start the WWDG using
51         HAL_WWDG_Start_IT(). At EWI HAL_WWDG_WakeupCallback is executed and user can
52         add his own code by customization of function pointer HAL_WWDG_WakeupCallback
53         Once enabled, EWI interrupt cannot be disabled except by a system reset.
54     (+) Then the application program must refresh the WWDG counter at regular
55         intervals during normal operation to prevent an MCU reset, using
56         HAL_WWDG_Refresh() function. This operation must occur only when
57         the counter is lower than the refresh window value already programmed.
58 
59      *** WWDG HAL driver macros list ***
60      ==================================
61      [..]
62        Below the list of most used macros in WWDG HAL driver.
63 
64       (+) __HAL_WWDG_ENABLE: Enable the WWDG peripheral
65       (+) __HAL_WWDG_GET_FLAG: Get the selected WWDG's flag status
66       (+) __HAL_WWDG_CLEAR_FLAG: Clear the WWDG's pending flags
67       (+) __HAL_WWDG_ENABLE_IT:  Enables the WWDG early wake-up interrupt
68 
69   @endverbatim
70   ******************************************************************************
71   * @attention
72   *
73   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
74   *
75   * Redistribution and use in source and binary forms, with or without modification,
76   * are permitted provided that the following conditions are met:
77   *   1. Redistributions of source code must retain the above copyright notice,
78   *      this list of conditions and the following disclaimer.
79   *   2. Redistributions in binary form must reproduce the above copyright notice,
80   *      this list of conditions and the following disclaimer in the documentation
81   *      and/or other materials provided with the distribution.
82   *   3. Neither the name of STMicroelectronics nor the names of its contributors
83   *      may be used to endorse or promote products derived from this software
84   *      without specific prior written permission.
85   *
86   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
87   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
88   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
89   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
90   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
91   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
92   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
93   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
94   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
95   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
96   *
97   ******************************************************************************
98   */
99 
100 /* Includes ------------------------------------------------------------------*/
101 #include "stm32f7xx_hal.h"
102 
103 /** @addtogroup STM32F7xx_HAL_Driver
104   * @{
105   */
106 
107 /** @defgroup WWDG WWDG
108   * @brief WWDG HAL module driver.
109   * @{
110   */
111 
112 #ifdef HAL_WWDG_MODULE_ENABLED
113 
114 /* Private typedef -----------------------------------------------------------*/
115 /* Private define ------------------------------------------------------------*/
116 /* Private macro -------------------------------------------------------------*/
117 /* Private variables ---------------------------------------------------------*/
118 /* Private function prototypes -----------------------------------------------*/
119 /* Exported functions --------------------------------------------------------*/
120 /** @defgroup WWDG_Exported_Functions WWDG Exported Functions
121   * @{
122   */
123 
124 /** @defgroup WWDG_Exported_Functions_Group1 Initialization and de-initialization functions
125  *  @brief    Initialization and Configuration functions.
126  *
127 @verbatim
128   ==============================================================================
129           ##### Initialization and de-initialization functions #####
130   ==============================================================================
131   [..]
132     This section provides functions allowing to:
133     (+) Initialize the WWDG according to the specified parameters
134         in the WWDG_InitTypeDef and create the associated handle
135     (+) DeInitialize the WWDG peripheral
136     (+) Initialize the WWDG MSP
137     (+) DeInitialize the WWDG MSP
138 
139 @endverbatim
140   * @{
141   */
142 
143 /**
144   * @brief  Initializes the WWDG according to the specified
145   *         parameters in the WWDG_InitTypeDef and creates the associated handle.
146   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
147   *              the configuration information for the specified WWDG module.
148   * @retval HAL status
149   */
HAL_WWDG_Init(WWDG_HandleTypeDef * hwwdg)150 HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
151 {
152     /* Check the WWDG handle allocation */
153     if (hwwdg == NULL) {
154         return HAL_ERROR;
155     }
156 
157     /* Check the parameters */
158     assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
159     assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler));
160     assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window));
161     assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter));
162 
163     if (hwwdg->State == HAL_WWDG_STATE_RESET) {
164         /* Allocate lock resource and initialize it */
165         hwwdg->Lock = HAL_UNLOCKED;
166         /* Init the low level hardware */
167         HAL_WWDG_MspInit(hwwdg);
168     }
169 
170     /* Change WWDG peripheral state */
171     hwwdg->State = HAL_WWDG_STATE_BUSY;
172 
173     /* Set WWDG Prescaler and Window */
174     MODIFY_REG(hwwdg->Instance->CFR, (WWDG_CFR_WDGTB | WWDG_CFR_W), (hwwdg->Init.Prescaler | hwwdg->Init.Window));
175     /* Set WWDG Counter */
176     MODIFY_REG(hwwdg->Instance->CR, WWDG_CR_T, hwwdg->Init.Counter);
177 
178     /* Change WWDG peripheral state */
179     hwwdg->State = HAL_WWDG_STATE_READY;
180 
181     /* Return function status */
182     return HAL_OK;
183 }
184 
185 /**
186   * @brief  DeInitializes the WWDG peripheral.
187   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
188   *              the configuration information for the specified WWDG module.
189   * @retval HAL status
190   */
HAL_WWDG_DeInit(WWDG_HandleTypeDef * hwwdg)191 HAL_StatusTypeDef HAL_WWDG_DeInit(WWDG_HandleTypeDef *hwwdg)
192 {
193     /* Check the WWDG handle allocation */
194     if (hwwdg == NULL) {
195         return HAL_ERROR;
196     }
197 
198     /* Check the parameters */
199     assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
200 
201     /* Change WWDG peripheral state */
202     hwwdg->State = HAL_WWDG_STATE_BUSY;
203 
204     /* DeInit the low level hardware */
205     HAL_WWDG_MspDeInit(hwwdg);
206 
207     /* Reset WWDG Control register */
208     hwwdg->Instance->CR  = (uint32_t)0x0000007F;
209 
210     /* Reset WWDG Configuration register */
211     hwwdg->Instance->CFR = (uint32_t)0x0000007F;
212 
213     /* Reset WWDG Status register */
214     hwwdg->Instance->SR  = 0;
215 
216     /* Change WWDG peripheral state */
217     hwwdg->State = HAL_WWDG_STATE_RESET;
218 
219     /* Release Lock */
220     __HAL_UNLOCK(hwwdg);
221 
222     /* Return function status */
223     return HAL_OK;
224 }
225 
226 /**
227   * @brief  Initializes the WWDG MSP.
228   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
229   *              the configuration information for the specified WWDG module.
230   * @retval None
231   */
HAL_WWDG_MspInit(WWDG_HandleTypeDef * hwwdg)232 __weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
233 {
234     /* NOTE: This function Should not be modified, when the callback is needed,
235              the HAL_WWDG_MspInit could be implemented in the user file
236      */
237 }
238 
239 /**
240   * @brief  DeInitializes the WWDG MSP.
241   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
242   *              the configuration information for the specified WWDG module.
243   * @retval None
244   */
HAL_WWDG_MspDeInit(WWDG_HandleTypeDef * hwwdg)245 __weak void HAL_WWDG_MspDeInit(WWDG_HandleTypeDef *hwwdg)
246 {
247     /* NOTE: This function Should not be modified, when the callback is needed,
248              the HAL_WWDG_MspDeInit could be implemented in the user file
249      */
250 }
251 
252 /**
253   * @}
254   */
255 
256 /** @defgroup WWDG_Exported_Functions_Group2 IO operation functions
257  *  @brief    IO operation functions
258  *
259 @verbatim
260   ==============================================================================
261                        ##### IO operation functions #####
262   ==============================================================================
263   [..]
264     This section provides functions allowing to:
265     (+) Start the WWDG.
266     (+) Refresh the WWDG.
267     (+) Handle WWDG interrupt request.
268 
269 @endverbatim
270   * @{
271   */
272 
273 /**
274   * @brief  Starts the WWDG.
275   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
276   *              the configuration information for the specified WWDG module.
277   * @retval HAL status
278   */
HAL_WWDG_Start(WWDG_HandleTypeDef * hwwdg)279 HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg)
280 {
281     /* Process Locked */
282     __HAL_LOCK(hwwdg);
283 
284     /* Change WWDG peripheral state */
285     hwwdg->State = HAL_WWDG_STATE_BUSY;
286 
287     /* Enable the peripheral */
288     __HAL_WWDG_ENABLE(hwwdg);
289 
290     /* Change WWDG peripheral state */
291     hwwdg->State = HAL_WWDG_STATE_READY;
292 
293     /* Process Unlocked */
294     __HAL_UNLOCK(hwwdg);
295 
296     /* Return function status */
297     return HAL_OK;
298 }
299 
300 /**
301   * @brief  Starts the WWDG with interrupt enabled.
302   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
303   *              the configuration information for the specified WWDG module.
304   * @retval HAL status
305   */
HAL_WWDG_Start_IT(WWDG_HandleTypeDef * hwwdg)306 HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg)
307 {
308     /* Process Locked */
309     __HAL_LOCK(hwwdg);
310 
311     /* Change WWDG peripheral state */
312     hwwdg->State = HAL_WWDG_STATE_BUSY;
313 
314     /* Enable the Early Wakeup Interrupt */
315     __HAL_WWDG_ENABLE_IT(hwwdg, WWDG_IT_EWI);
316 
317     /* Enable the peripheral */
318     __HAL_WWDG_ENABLE(hwwdg);
319 
320     /* Return function status */
321     return HAL_OK;
322 }
323 
324 /**
325   * @brief  Refreshes the WWDG.
326   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
327   *              the configuration information for the specified WWDG module.
328   * @param  Counter: value of counter to put in WWDG counter
329   * @retval HAL status
330   */
HAL_WWDG_Refresh(WWDG_HandleTypeDef * hwwdg,uint32_t Counter)331 HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter)
332 {
333     /* Process Locked */
334     __HAL_LOCK(hwwdg);
335 
336     /* Change WWDG peripheral state */
337     hwwdg->State = HAL_WWDG_STATE_BUSY;
338 
339     /* Check the parameters */
340     assert_param(IS_WWDG_COUNTER(Counter));
341 
342     /* Write to WWDG CR the WWDG Counter value to refresh with */
343     MODIFY_REG(hwwdg->Instance->CR, (uint32_t)WWDG_CR_T, Counter);
344 
345     /* Change WWDG peripheral state */
346     hwwdg->State = HAL_WWDG_STATE_READY;
347 
348     /* Process Unlocked */
349     __HAL_UNLOCK(hwwdg);
350 
351     /* Return function status */
352     return HAL_OK;
353 }
354 
355 /**
356   * @brief  Handles WWDG interrupt request.
357   * @note   The Early Wakeup Interrupt (EWI) can be used if specific safety operations
358   *         or data logging must be performed before the actual reset is generated.
359   *         The EWI interrupt is enabled using __HAL_WWDG_ENABLE_IT() macro.
360   *         When the downcounter reaches the value 0x40, and EWI interrupt is
361   *         generated and the corresponding Interrupt Service Routine (ISR) can
362   *         be used to trigger specific actions (such as communications or data
363   *         logging), before resetting the device.
364   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
365   *              the configuration information for the specified WWDG module.
366   * @retval None
367   */
HAL_WWDG_IRQHandler(WWDG_HandleTypeDef * hwwdg)368 void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
369 {
370     /* Check if Early Wakeup Interrupt is enable */
371     if (__HAL_WWDG_GET_IT_SOURCE(hwwdg, WWDG_IT_EWI) != RESET) {
372         /* Check if WWDG Early Wakeup Interrupt occurred */
373         if (__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET) {
374             /* Early Wakeup callback */
375             HAL_WWDG_WakeupCallback(hwwdg);
376 
377             /* Change WWDG peripheral state */
378             hwwdg->State = HAL_WWDG_STATE_READY;
379 
380             /* Clear the WWDG Early Wakeup flag */
381             __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);
382 
383             /* Process Unlocked */
384             __HAL_UNLOCK(hwwdg);
385         }
386     }
387 }
388 
389 /**
390   * @brief  Early Wakeup WWDG callback.
391   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
392   *              the configuration information for the specified WWDG module.
393   * @retval None
394   */
HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef * hwwdg)395 __weak void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
396 {
397     /* NOTE: This function Should not be modified, when the callback is needed,
398              the HAL_WWDG_WakeupCallback could be implemented in the user file
399      */
400 }
401 
402 /**
403   * @}
404   */
405 
406 /** @defgroup WWDG_Exported_Functions_Group3 Peripheral State functions
407  *  @brief    Peripheral State functions.
408  *
409 @verbatim
410   ==============================================================================
411                         ##### Peripheral State functions #####
412   ==============================================================================
413   [..]
414     This subsection permits to get in run-time the status of the peripheral
415     and the data flow.
416 
417 @endverbatim
418   * @{
419   */
420 
421 /**
422   * @brief  Returns the WWDG state.
423   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
424   *              the configuration information for the specified WWDG module.
425   * @retval HAL state
426   */
HAL_WWDG_GetState(WWDG_HandleTypeDef * hwwdg)427 HAL_WWDG_StateTypeDef HAL_WWDG_GetState(WWDG_HandleTypeDef *hwwdg)
428 {
429     return hwwdg->State;
430 }
431 
432 /**
433   * @}
434   */
435 
436 /**
437   * @}
438   */
439 
440 #endif /* HAL_WWDG_MODULE_ENABLED */
441 /**
442   * @}
443   */
444 
445 /**
446   * @}
447   */
448 
449 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
450