38
|
1 /**
|
|
2 ******************************************************************************
|
|
3 * @file stm32f4xx_hal_wwdg.c
|
|
4 * @author MCD Application Team
|
|
5 * @version V1.2.0
|
|
6 * @date 26-December-2014
|
|
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>© COPYRIGHT(c) 2014 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 "stm32f4xx_hal.h"
|
|
102
|
|
103 /** @addtogroup STM32F4xx_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 */
|
|
150 HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
|
|
151 {
|
|
152 /* Check the WWDG handle allocation */
|
|
153 if(hwwdg == NULL)
|
|
154 {
|
|
155 return HAL_ERROR;
|
|
156 }
|
|
157
|
|
158 /* Check the parameters */
|
|
159 assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
|
|
160 assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler));
|
|
161 assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window));
|
|
162 assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter));
|
|
163
|
|
164 if(hwwdg->State == HAL_WWDG_STATE_RESET)
|
|
165 {
|
|
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 */
|
|
191 HAL_StatusTypeDef HAL_WWDG_DeInit(WWDG_HandleTypeDef *hwwdg)
|
|
192 {
|
|
193 /* Check the WWDG handle allocation */
|
|
194 if(hwwdg == NULL)
|
|
195 {
|
|
196 return HAL_ERROR;
|
|
197 }
|
|
198
|
|
199 /* Check the parameters */
|
|
200 assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
|
|
201
|
|
202 /* Change WWDG peripheral state */
|
|
203 hwwdg->State = HAL_WWDG_STATE_BUSY;
|
|
204
|
|
205 /* DeInit the low level hardware */
|
|
206 HAL_WWDG_MspDeInit(hwwdg);
|
|
207
|
|
208 /* Reset WWDG Control register */
|
|
209 hwwdg->Instance->CR = (uint32_t)0x0000007F;
|
|
210
|
|
211 /* Reset WWDG Configuration register */
|
|
212 hwwdg->Instance->CFR = (uint32_t)0x0000007F;
|
|
213
|
|
214 /* Reset WWDG Status register */
|
|
215 hwwdg->Instance->SR = 0;
|
|
216
|
|
217 /* Change WWDG peripheral state */
|
|
218 hwwdg->State = HAL_WWDG_STATE_RESET;
|
|
219
|
|
220 /* Release Lock */
|
|
221 __HAL_UNLOCK(hwwdg);
|
|
222
|
|
223 /* Return function status */
|
|
224 return HAL_OK;
|
|
225 }
|
|
226
|
|
227 /**
|
|
228 * @brief Initializes the WWDG MSP.
|
|
229 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
230 * the configuration information for the specified WWDG module.
|
|
231 * @retval None
|
|
232 */
|
|
233 __weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
|
|
234 {
|
|
235 /* NOTE: This function Should not be modified, when the callback is needed,
|
|
236 the HAL_WWDG_MspInit could be implemented in the user file
|
|
237 */
|
|
238 }
|
|
239
|
|
240 /**
|
|
241 * @brief DeInitializes the WWDG MSP.
|
|
242 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
243 * the configuration information for the specified WWDG module.
|
|
244 * @retval None
|
|
245 */
|
|
246 __weak void HAL_WWDG_MspDeInit(WWDG_HandleTypeDef *hwwdg)
|
|
247 {
|
|
248 /* NOTE: This function Should not be modified, when the callback is needed,
|
|
249 the HAL_WWDG_MspDeInit could be implemented in the user file
|
|
250 */
|
|
251 }
|
|
252
|
|
253 /**
|
|
254 * @}
|
|
255 */
|
|
256
|
|
257 /** @defgroup WWDG_Exported_Functions_Group2 IO operation functions
|
|
258 * @brief IO operation functions
|
|
259 *
|
|
260 @verbatim
|
|
261 ==============================================================================
|
|
262 ##### IO operation functions #####
|
|
263 ==============================================================================
|
|
264 [..]
|
|
265 This section provides functions allowing to:
|
|
266 (+) Start the WWDG.
|
|
267 (+) Refresh the WWDG.
|
|
268 (+) Handle WWDG interrupt request.
|
|
269
|
|
270 @endverbatim
|
|
271 * @{
|
|
272 */
|
|
273
|
|
274 /**
|
|
275 * @brief Starts the WWDG.
|
|
276 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
277 * the configuration information for the specified WWDG module.
|
|
278 * @retval HAL status
|
|
279 */
|
|
280 HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg)
|
|
281 {
|
|
282 /* Process Locked */
|
|
283 __HAL_LOCK(hwwdg);
|
|
284
|
|
285 /* Change WWDG peripheral state */
|
|
286 hwwdg->State = HAL_WWDG_STATE_BUSY;
|
|
287
|
|
288 /* Enable the peripheral */
|
|
289 __HAL_WWDG_ENABLE(hwwdg);
|
|
290
|
|
291 /* Change WWDG peripheral state */
|
|
292 hwwdg->State = HAL_WWDG_STATE_READY;
|
|
293
|
|
294 /* Process Unlocked */
|
|
295 __HAL_UNLOCK(hwwdg);
|
|
296
|
|
297 /* Return function status */
|
|
298 return HAL_OK;
|
|
299 }
|
|
300
|
|
301 /**
|
|
302 * @brief Starts the WWDG with interrupt enabled.
|
|
303 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
304 * the configuration information for the specified WWDG module.
|
|
305 * @retval HAL status
|
|
306 */
|
|
307 HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg)
|
|
308 {
|
|
309 /* Process Locked */
|
|
310 __HAL_LOCK(hwwdg);
|
|
311
|
|
312 /* Change WWDG peripheral state */
|
|
313 hwwdg->State = HAL_WWDG_STATE_BUSY;
|
|
314
|
|
315 /* Enable the Early Wakeup Interrupt */
|
|
316 __HAL_WWDG_ENABLE_IT(hwwdg, WWDG_IT_EWI);
|
|
317
|
|
318 /* Enable the peripheral */
|
|
319 __HAL_WWDG_ENABLE(hwwdg);
|
|
320
|
|
321 /* Return function status */
|
|
322 return HAL_OK;
|
|
323 }
|
|
324
|
|
325 /**
|
|
326 * @brief Refreshes the WWDG.
|
|
327 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
328 * the configuration information for the specified WWDG module.
|
|
329 * @param Counter: value of counter to put in WWDG counter
|
|
330 * @retval HAL status
|
|
331 */
|
|
332 HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter)
|
|
333 {
|
|
334 /* Process Locked */
|
|
335 __HAL_LOCK(hwwdg);
|
|
336
|
|
337 /* Change WWDG peripheral state */
|
|
338 hwwdg->State = HAL_WWDG_STATE_BUSY;
|
|
339
|
|
340 /* Check the parameters */
|
|
341 assert_param(IS_WWDG_COUNTER(Counter));
|
|
342
|
|
343 /* Write to WWDG CR the WWDG Counter value to refresh with */
|
|
344 MODIFY_REG(hwwdg->Instance->CR, (uint32_t)WWDG_CR_T, Counter);
|
|
345
|
|
346 /* Change WWDG peripheral state */
|
|
347 hwwdg->State = HAL_WWDG_STATE_READY;
|
|
348
|
|
349 /* Process Unlocked */
|
|
350 __HAL_UNLOCK(hwwdg);
|
|
351
|
|
352 /* Return function status */
|
|
353 return HAL_OK;
|
|
354 }
|
|
355
|
|
356 /**
|
|
357 * @brief Handles WWDG interrupt request.
|
|
358 * @note The Early Wakeup Interrupt (EWI) can be used if specific safety operations
|
|
359 * or data logging must be performed before the actual reset is generated.
|
|
360 * The EWI interrupt is enabled using __HAL_WWDG_ENABLE_IT() macro.
|
|
361 * When the downcounter reaches the value 0x40, and EWI interrupt is
|
|
362 * generated and the corresponding Interrupt Service Routine (ISR) can
|
|
363 * be used to trigger specific actions (such as communications or data
|
|
364 * logging), before resetting the device.
|
|
365 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
366 * the configuration information for the specified WWDG module.
|
|
367 * @retval None
|
|
368 */
|
|
369 void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
|
|
370 {
|
|
371 /* Check if Early Wakeup Interrupt is enable */
|
|
372 if(__HAL_WWDG_GET_IT_SOURCE(hwwdg, WWDG_IT_EWI) != RESET)
|
|
373 {
|
|
374 /* Check if WWDG Early Wakeup Interrupt occurred */
|
|
375 if(__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET)
|
|
376 {
|
|
377 /* Early Wakeup callback */
|
|
378 HAL_WWDG_WakeupCallback(hwwdg);
|
|
379
|
|
380 /* Change WWDG peripheral state */
|
|
381 hwwdg->State = HAL_WWDG_STATE_READY;
|
|
382
|
|
383 /* Clear the WWDG Early Wakeup flag */
|
|
384 __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);
|
|
385
|
|
386 /* Process Unlocked */
|
|
387 __HAL_UNLOCK(hwwdg);
|
|
388 }
|
|
389 }
|
|
390 }
|
|
391
|
|
392 /**
|
|
393 * @brief Early Wakeup WWDG callback.
|
|
394 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
395 * the configuration information for the specified WWDG module.
|
|
396 * @retval None
|
|
397 */
|
|
398 __weak void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
|
|
399 {
|
|
400 /* NOTE: This function Should not be modified, when the callback is needed,
|
|
401 the HAL_WWDG_WakeupCallback could be implemented in the user file
|
|
402 */
|
|
403 }
|
|
404
|
|
405 /**
|
|
406 * @}
|
|
407 */
|
|
408
|
|
409 /** @defgroup WWDG_Exported_Functions_Group3 Peripheral State functions
|
|
410 * @brief Peripheral State functions.
|
|
411 *
|
|
412 @verbatim
|
|
413 ==============================================================================
|
|
414 ##### Peripheral State functions #####
|
|
415 ==============================================================================
|
|
416 [..]
|
|
417 This subsection permits to get in run-time the status of the peripheral
|
|
418 and the data flow.
|
|
419
|
|
420 @endverbatim
|
|
421 * @{
|
|
422 */
|
|
423
|
|
424 /**
|
|
425 * @brief Returns the WWDG state.
|
|
426 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
|
|
427 * the configuration information for the specified WWDG module.
|
|
428 * @retval HAL state
|
|
429 */
|
|
430 HAL_WWDG_StateTypeDef HAL_WWDG_GetState(WWDG_HandleTypeDef *hwwdg)
|
|
431 {
|
|
432 return hwwdg->State;
|
|
433 }
|
|
434
|
|
435 /**
|
|
436 * @}
|
|
437 */
|
|
438
|
|
439 /**
|
|
440 * @}
|
|
441 */
|
|
442
|
|
443 #endif /* HAL_WWDG_MODULE_ENABLED */
|
|
444 /**
|
|
445 * @}
|
|
446 */
|
|
447
|
|
448 /**
|
|
449 * @}
|
|
450 */
|
|
451
|
|
452 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|