Mercurial > public > ostc4
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>© 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****/ |