comparison Common/Drivers/STM32F4xx_HAL_DRIVER_v120/Src/stm32f4xx_hal_wwdg.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children
comparison
equal deleted inserted replaced
37:ccc45c0e1ea2 38:5f11787b4f42
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>&copy; 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****/