]> git.gir.st - tmk_keyboard.git/blob - tool/mbed/mbed-sdk/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32L1/stm32l1xx_hal_wwdg.c
Squashed 'tmk_core/' changes from 7967731..b9e0ea0
[tmk_keyboard.git] / tool / mbed / mbed-sdk / libraries / mbed / targets / cmsis / TARGET_STM / TARGET_STM32L1 / stm32l1xx_hal_wwdg.c
1 /**
2 ******************************************************************************
3 * @file stm32l1xx_hal_wwdg.c
4 * @author MCD Application Team
5 * @version V1.0.0
6 * @date 5-September-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 \96 Window) / WWDG clock
35 (++) max time (mS) = 1000 * (Counter \96 0x40) / WWDG clock
36
37 (+) Min-max timeout value at @32MHz (PCLK1): ~128us / ~65.6ms.
38
39
40 ##### How to use this driver #####
41 ==============================================================================
42 [..]
43 (+) Enable WWDG APB1 clock using __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 wakeup 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 "stm32l1xx_hal.h"
102
103 /** @addtogroup STM32L1xx_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 /* Private functions ---------------------------------------------------------*/
120
121 /** @defgroup WWDG_Exported_Functions WWDG Exported Functions
122 * @{
123 */
124
125 /** @defgroup WWDG_Exported_Functions_Group1 Initialization and de-initialization functions
126 * @brief Initialization and Configuration functions.
127 *
128 @verbatim
129 ==============================================================================
130 ##### Initialization and de-initialization functions #####
131 ==============================================================================
132 [..]
133 This section provides functions allowing to:
134 (+) Initialize the WWDG according to the specified parameters
135 in the WWDG_InitTypeDef and create the associated handle
136 (+) DeInitialize the WWDG peripheral
137 (+) Initialize the WWDG MSP
138 (+) DeInitialize the WWDG MSP
139
140 @endverbatim
141 * @{
142 */
143
144 /**
145 * @brief Initializes the WWDG according to the specified
146 * parameters in the WWDG_InitTypeDef and creates the associated handle.
147 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
148 * the configuration information for the specified WWDG module.
149 * @retval HAL status
150 */
151 HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
152 {
153 /* Check the WWDG handle allocation */
154 if(hwwdg == HAL_NULL)
155 {
156 return HAL_ERROR;
157 }
158
159 /* Check the parameters */
160 assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
161 assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler));
162 assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window));
163 assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter));
164
165 if(hwwdg->State == HAL_WWDG_STATE_RESET)
166 {
167 /* Init the low level hardware */
168 HAL_WWDG_MspInit(hwwdg);
169 }
170
171 /* Change WWDG peripheral state */
172 hwwdg->State = HAL_WWDG_STATE_BUSY;
173
174 /* Set WWDG Prescaler and Window */
175 MODIFY_REG(hwwdg->Instance->CFR, (WWDG_CFR_WDGTB | WWDG_CFR_W), (hwwdg->Init.Prescaler | hwwdg->Init.Window));
176
177 /* Set WWDG Counter */
178 MODIFY_REG(hwwdg->Instance->CR, WWDG_CR_T, hwwdg->Init.Counter);
179
180 /* Change WWDG peripheral state */
181 hwwdg->State = HAL_WWDG_STATE_READY;
182
183 /* Return function status */
184 return HAL_OK;
185 }
186
187 /**
188 * @brief DeInitializes the WWDG peripheral.
189 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
190 * the configuration information for the specified WWDG module.
191 * @retval HAL status
192 */
193 HAL_StatusTypeDef HAL_WWDG_DeInit(WWDG_HandleTypeDef *hwwdg)
194 {
195 /* Check the parameters */
196 assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
197
198 /* Change WWDG peripheral state */
199 hwwdg->State = HAL_WWDG_STATE_BUSY;
200
201 /* DeInit the low level hardware */
202 HAL_WWDG_MspDeInit(hwwdg);
203
204 /* Reset WWDG Control register */
205 hwwdg->Instance->CR = (uint32_t)0x0000007F;
206
207 /* Reset WWDG Configuration register */
208 hwwdg->Instance->CFR = (uint32_t)0x0000007F;
209
210 /* Reset WWDG Status register */
211 hwwdg->Instance->SR = 0;
212
213 /* Change WWDG peripheral state */
214 hwwdg->State = HAL_WWDG_STATE_RESET;
215
216 /* Release Lock */
217 __HAL_UNLOCK(hwwdg);
218
219 /* Return function status */
220 return HAL_OK;
221 }
222
223 /**
224 * @brief Initializes the WWDG MSP.
225 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
226 * the configuration information for the specified WWDG module.
227 * @retval None
228 */
229 __weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
230 {
231 /* NOTE: This function Should not be modified, when the callback is needed,
232 the HAL_WWDG_MspInit could be implemented in the user file
233 */
234 }
235
236 /**
237 * @brief DeInitializes the WWDG MSP.
238 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
239 * the configuration information for the specified WWDG module.
240 * @retval None
241 */
242 __weak void HAL_WWDG_MspDeInit(WWDG_HandleTypeDef *hwwdg)
243 {
244 /* NOTE: This function Should not be modified, when the callback is needed,
245 the HAL_WWDG_MspDeInit could be implemented in the user file
246 */
247 }
248
249 /**
250 * @}
251 */
252
253 /** @defgroup WWDG_Exported_Functions_Group2 IO operation functions
254 * @brief IO operation functions
255 *
256 @verbatim
257 ==============================================================================
258 ##### IO operation functions #####
259 ==============================================================================
260 [..]
261 This section provides functions allowing to:
262 (+) Start the WWDG.
263 (+) Refresh the WWDG.
264 (+) Handle WWDG interrupt request.
265
266 @endverbatim
267 * @{
268 */
269
270 /**
271 * @brief Starts the WWDG.
272 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
273 * the configuration information for the specified WWDG module.
274 * @retval HAL status
275 */
276 HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg)
277 {
278 /* Process Locked */
279 __HAL_LOCK(hwwdg);
280
281 /* Change WWDG peripheral state */
282 hwwdg->State = HAL_WWDG_STATE_BUSY;
283
284 /* Enable the peripheral */
285 __HAL_WWDG_ENABLE(hwwdg);
286
287 /* Change WWDG peripheral state */
288 hwwdg->State = HAL_WWDG_STATE_READY;
289
290 /* Process Unlocked */
291 __HAL_UNLOCK(hwwdg);
292
293 /* Return function status */
294 return HAL_OK;
295 }
296
297 /**
298 * @brief Starts the WWDG with interrupt enabled.
299 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
300 * the configuration information for the specified WWDG module.
301 * @retval HAL status
302 */
303 HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg)
304 {
305 /* Process Locked */
306 __HAL_LOCK(hwwdg);
307
308 /* Change WWDG peripheral state */
309 hwwdg->State = HAL_WWDG_STATE_BUSY;
310
311 /* Enable the Early Wakeup Interrupt */
312 __HAL_WWDG_ENABLE_IT(WWDG_IT_EWI);
313
314 /* Enable the peripheral */
315 __HAL_WWDG_ENABLE(hwwdg);
316
317 /* Return function status */
318 return HAL_OK;
319 }
320
321 /**
322 * @brief Refreshes the WWDG.
323 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
324 * the configuration information for the specified WWDG module.
325 * @param Counter: value of counter to put in WWDG counter
326 * @retval HAL status
327 */
328 HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter)
329 {
330 /* Process Locked */
331 __HAL_LOCK(hwwdg);
332
333 /* Change WWDG peripheral state */
334 hwwdg->State = HAL_WWDG_STATE_BUSY;
335
336 /* Check the parameters */
337 assert_param(IS_WWDG_COUNTER(Counter));
338
339 /* Write to WWDG CR the WWDG Counter value to refresh with */
340 MODIFY_REG(hwwdg->Instance->CR, (uint32_t)WWDG_CR_T, Counter);
341
342 /* Change WWDG peripheral state */
343 hwwdg->State = HAL_WWDG_STATE_READY;
344
345 /* Process Unlocked */
346 __HAL_UNLOCK(hwwdg);
347
348 /* Return function status */
349 return HAL_OK;
350 }
351
352 /**
353 * @brief Handles WWDG interrupt request.
354 * @note The Early Wakeup Interrupt (EWI) can be used if specific safety operations
355 * or data logging must be performed before the actual reset is generated.
356 * The EWI interrupt is enabled using __HAL_WWDG_ENABLE_IT() macro.
357 * When the downcounter reaches the value 0x40, and EWI interrupt is
358 * generated and the corresponding Interrupt Service Routine (ISR) can
359 * be used to trigger specific actions (such as communications or data
360 * logging), before resetting the device.
361 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
362 * the configuration information for the specified WWDG module.
363 * @retval None
364 */
365 void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
366 {
367 /* WWDG Early Wakeup Interrupt occurred */
368 if(__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET)
369 {
370 /* Early Wakeup callback */
371 HAL_WWDG_WakeupCallback(hwwdg);
372
373 /* Change WWDG peripheral state */
374 hwwdg->State = HAL_WWDG_STATE_READY;
375
376 /* Clear the WWDG Data Ready flag */
377 __HAL_WWDG_CLEAR_IT(hwwdg, WWDG_FLAG_EWIF);
378
379 /* Process Unlocked */
380 __HAL_UNLOCK(hwwdg);
381 }
382 }
383
384 /**
385 * @brief Early Wakeup WWDG callback.
386 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
387 * the configuration information for the specified WWDG module.
388 * @retval None
389 */
390 __weak void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
391 {
392 /* NOTE: This function Should not be modified, when the callback is needed,
393 the HAL_WWDG_WakeupCallback could be implemented in the user file
394 */
395 }
396
397 /**
398 * @}
399 */
400
401 /** @defgroup WWDG_Exported_Functions_Group3 Peripheral State functions
402 * @brief Peripheral State functions.
403 *
404 @verbatim
405 ==============================================================================
406 ##### Peripheral State functions #####
407 ==============================================================================
408 [..]
409 This subsection permits to get in run-time the status of the peripheral
410 and the data flow.
411
412 @endverbatim
413 * @{
414 */
415
416 /**
417 * @brief Returns the WWDG state.
418 * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
419 * the configuration information for the specified WWDG module.
420 * @retval HAL state
421 */
422 HAL_WWDG_StateTypeDef HAL_WWDG_GetState(WWDG_HandleTypeDef *hwwdg)
423 {
424 return hwwdg->State;
425 }
426
427 /**
428 * @}
429 */
430
431 /**
432 * @}
433 */
434
435 #endif /* HAL_WWDG_MODULE_ENABLED */
436 /**
437 * @}
438 */
439
440 /**
441 * @}
442 */
443
444 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Imprint / Impressum