]> git.friedersdorff.com Git - max/tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/stm32f4xx_hal_wwdg.c
Merge commit '22b6e15a179031afb7c3534cf7b109b0668b602c'
[max/tmk_keyboard.git] / tmk_core / tool / mbed / mbed-sdk / libraries / mbed / targets / cmsis / TARGET_STM / TARGET_STM32F4 / stm32f4xx_hal_wwdg.c
1 /**
2   ******************************************************************************
3   * @file    stm32f4xx_hal_wwdg.c
4   * @author  MCD Application Team
5   * @version V1.1.0
6   * @date    19-June-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 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 __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 "stm32f4xx_hal.h"
102
103 /** @addtogroup STM32F4xx_HAL_Driver
104   * @{
105   */
106
107 /** @defgroup 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_Private_Functions
122   * @{
123   */
124
125 /** @defgroup WWDG_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   /* Set WWDG Counter */
177   MODIFY_REG(hwwdg->Instance->CR, WWDG_CR_T, hwwdg->Init.Counter);
178
179   /* Change WWDG peripheral state */
180   hwwdg->State = HAL_WWDG_STATE_READY;
181   
182   /* Return function status */
183   return HAL_OK;
184 }
185
186 /**
187   * @brief  DeInitializes the WWDG peripheral. 
188   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
189   *              the configuration information for the specified WWDG module.
190   * @retval HAL status
191   */
192 HAL_StatusTypeDef HAL_WWDG_DeInit(WWDG_HandleTypeDef *hwwdg)
193
194   /* Check the WWDG handle allocation */
195   if(hwwdg == HAL_NULL)
196   {
197     return HAL_ERROR;
198   }
199
200   /* Check the parameters */
201   assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
202
203   /* Change WWDG peripheral state */  
204   hwwdg->State = HAL_WWDG_STATE_BUSY;
205   
206   /* DeInit the low level hardware */
207   HAL_WWDG_MspDeInit(hwwdg);
208   
209   /* Reset WWDG Control register */
210   hwwdg->Instance->CR  = (uint32_t)0x0000007F;
211   
212   /* Reset WWDG Configuration register */
213   hwwdg->Instance->CFR = (uint32_t)0x0000007F;
214   
215   /* Reset WWDG Status register */
216   hwwdg->Instance->SR  = 0; 
217   
218   /* Change WWDG peripheral state */    
219   hwwdg->State = HAL_WWDG_STATE_RESET; 
220
221   /* Release Lock */
222   __HAL_UNLOCK(hwwdg);
223
224   /* Return function status */
225   return HAL_OK;
226 }
227
228 /**
229   * @brief  Initializes the WWDG MSP.
230   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
231   *              the configuration information for the specified WWDG module.
232   * @retval None
233   */
234 __weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
235 {
236   /* NOTE: This function Should not be modified, when the callback is needed,
237            the HAL_WWDG_MspInit could be implemented in the user file
238    */
239 }
240
241 /**
242   * @brief  DeInitializes the WWDG MSP.
243   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
244   *              the configuration information for the specified WWDG module.
245   * @retval None
246   */
247 __weak void HAL_WWDG_MspDeInit(WWDG_HandleTypeDef *hwwdg)
248 {
249   /* NOTE: This function Should not be modified, when the callback is needed,
250            the HAL_WWDG_MspDeInit could be implemented in the user file
251    */
252 }
253
254 /**
255   * @}
256   */
257
258 /** @defgroup WWDG_Group2 IO operation functions 
259  *  @brief    IO operation functions 
260  *
261 @verbatim   
262   ==============================================================================
263                        ##### IO operation functions #####
264   ==============================================================================  
265   [..]  
266     This section provides functions allowing to:
267     (+) Start the WWDG.
268     (+) Refresh the WWDG.
269     (+) Handle WWDG interrupt request. 
270
271 @endverbatim
272   * @{
273   */
274
275 /**
276   * @brief  Starts the WWDG.
277   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
278   *              the configuration information for the specified WWDG module.
279   * @retval HAL status
280   */
281 HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg)
282 {
283   /* Process Locked */
284   __HAL_LOCK(hwwdg); 
285   
286   /* Change WWDG peripheral state */  
287   hwwdg->State = HAL_WWDG_STATE_BUSY;
288
289   /* Enable the peripheral */
290   __HAL_WWDG_ENABLE(hwwdg);  
291   
292   /* Change WWDG peripheral state */    
293   hwwdg->State = HAL_WWDG_STATE_READY; 
294   
295   /* Process Unlocked */
296   __HAL_UNLOCK(hwwdg);
297   
298   /* Return function status */
299   return HAL_OK;
300 }
301
302 /**
303   * @brief  Starts the WWDG with interrupt enabled.
304   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
305   *              the configuration information for the specified WWDG module.
306   * @retval HAL status
307   */
308 HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg)
309 {
310   /* Process Locked */
311   __HAL_LOCK(hwwdg); 
312
313   /* Change WWDG peripheral state */  
314   hwwdg->State = HAL_WWDG_STATE_BUSY;
315
316   /* Enable the Early Wakeup Interrupt */ 
317   __HAL_WWDG_ENABLE_IT(WWDG_IT_EWI);
318
319   /* Enable the peripheral */
320   __HAL_WWDG_ENABLE(hwwdg);  
321
322   /* Return function status */
323   return HAL_OK;
324 }
325
326 /**
327   * @brief  Refreshes the WWDG.
328   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
329   *              the configuration information for the specified WWDG module.
330   * @param  Counter: value of counter to put in WWDG counter
331   * @retval HAL status
332   */
333 HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter)
334 {
335   /* Process Locked */
336   __HAL_LOCK(hwwdg); 
337   
338   /* Change WWDG peripheral state */  
339   hwwdg->State = HAL_WWDG_STATE_BUSY;
340   
341   /* Check the parameters */
342   assert_param(IS_WWDG_COUNTER(Counter));
343   
344   /* Write to WWDG CR the WWDG Counter value to refresh with */
345   MODIFY_REG(hwwdg->Instance->CR, (uint32_t)WWDG_CR_T, Counter);
346   
347   /* Change WWDG peripheral state */    
348   hwwdg->State = HAL_WWDG_STATE_READY; 
349   
350   /* Process Unlocked */
351   __HAL_UNLOCK(hwwdg);
352   
353   /* Return function status */
354   return HAL_OK;
355 }
356
357 /**
358   * @brief  Handles WWDG interrupt request.
359   * @note   The Early Wakeup Interrupt (EWI) can be used if specific safety operations 
360   *         or data logging must be performed before the actual reset is generated. 
361   *         The EWI interrupt is enabled using __HAL_WWDG_ENABLE_IT() macro.
362   *         When the downcounter reaches the value 0x40, and EWI interrupt is 
363   *         generated and the corresponding Interrupt Service Routine (ISR) can 
364   *         be used to trigger specific actions (such as communications or data 
365   *         logging), before resetting the device. 
366   * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
367   *              the configuration information for the specified WWDG module.
368   * @retval None
369   */
370 void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
371
372   /* WWDG Early Wakeup Interrupt occurred */   
373   if(__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET)
374   {
375     /* Early Wakeup callback */ 
376     HAL_WWDG_WakeupCallback(hwwdg);
377     
378     /* Change WWDG peripheral state */
379     hwwdg->State = HAL_WWDG_STATE_READY; 
380     
381     /* Clear the WWDG Data Ready flag */
382     __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF);
383     
384     /* Process Unlocked */
385     __HAL_UNLOCK(hwwdg);
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   */
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_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   */
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****/