/** | |
****************************************************************************** | |
* @file stm32l4xx_hal_iwdg.c | |
* @author MCD Application Team | |
* @version V1.6.0 | |
* @date 28-October-2016 | |
* @brief IWDG HAL module driver. | |
* This file provides firmware functions to manage the following | |
* functionalities of the Independent Watchdog (IWDG) peripheral: | |
* + Initialization and Start functions | |
* + IO operation functions | |
* | |
@verbatim | |
============================================================================== | |
##### IWDG Generic features ##### | |
============================================================================== | |
[..] | |
(+) The IWDG can be started by either software or hardware (configurable | |
through option byte). | |
(+) The IWDG is clocked by Low-Speed clock (LSI) and thus stays active even | |
if the main clock fails. | |
(+) Once the IWDG is started, the LSI is forced ON and both can not be | |
disabled. The counter starts counting down from the reset value (0xFFF). | |
When it reaches the end of count value (0x000) a reset signal is | |
generated (IWDG reset). | |
(+) Whenever the key value 0x0000 AAAA is written in the IWDG_KR register, | |
the IWDG_RLR value is reloaded in the counter and the watchdog reset is | |
prevented. | |
(+) The IWDG is implemented in the VDD voltage domain that is still functional | |
in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY). | |
IWDGRST flag in RCC_CSR register can be used to inform when an IWDG | |
reset occurs. | |
(+) Debug mode : When the microcontroller enters debug mode (core halted), | |
the IWDG counter either continues to work normally or stops, depending | |
on DBG_IWDG_STOP configuration bit in DBG module, accessible through | |
__HAL_DBGMCU_FREEZE_IWDG() and __HAL_DBGMCU_UNFREEZE_IWDG() macros | |
[..] Min-max timeout value @32KHz (LSI): ~125us / ~32.7s | |
The IWDG timeout may vary due to LSI frequency dispersion. STM32L4xx | |
devices provide the capability to measure the LSI frequency (LSI clock | |
connected internally to TIM16 CH1 input capture). The measured value | |
can be used to have an IWDG timeout with an acceptable accuracy. | |
##### How to use this driver ##### | |
============================================================================== | |
[..] | |
(#) Use IWDG using HAL_IWDG_Init() function to : | |
(++) Enable instance by writing Start keyword in IWDG_KEY register. LSI | |
clock is forced ON and IWDG counter starts downcounting. | |
(++) Enable write access to configuration register: IWDG_PR, IWDG_RLR & | |
IWDG_WINR. | |
(++) Configure the IWDG prescaler and counter reload value. This reload | |
value will be loaded in the IWDG counter each time the watchdog is | |
reloaded, then the IWDG will start counting down from this value. | |
(++) Wait for status flags to be reset | |
(++) Depending on window parameter: | |
(+++) If Window Init parameter is same as Window register value, | |
nothing more is done but reload counter value in order to exit | |
function withy exact time base. | |
(+++) Else modify Window register. This will automatically reload | |
watchdog counter. | |
(#) Then the application program must refresh the IWDG counter at regular | |
intervals during normal operation to prevent an MCU reset, using | |
HAL_IWDG_Refresh() function. | |
*** IWDG HAL driver macros list *** | |
==================================== | |
[..] | |
Below the list of most used macros in IWDG HAL driver: | |
(+) __HAL_IWDG_START: Enable the IWDG peripheral | |
(+) __HAL_IWDG_RELOAD_COUNTER: Reloads IWDG counter with value defined in | |
the reload register | |
@endverbatim | |
****************************************************************************** | |
* @attention | |
* | |
* <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | |
* | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |
* may be used to endorse or promote products derived from this software | |
* without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
****************************************************************************** | |
*/ | |
/* Includes ------------------------------------------------------------------*/ | |
#include "stm32l4xx_hal.h" | |
/** @addtogroup STM32L4xx_HAL_Driver | |
* @{ | |
*/ | |
#ifdef HAL_IWDG_MODULE_ENABLED | |
/** @addtogroup IWDG | |
* @brief IWDG HAL module driver. | |
* @{ | |
*/ | |
/* Private typedef -----------------------------------------------------------*/ | |
/* Private define ------------------------------------------------------------*/ | |
/** @defgroup IWDG_Private_Defines IWDG Private Defines | |
* @{ | |
*/ | |
/* Status register need 5 RC LSI divided by prescaler clock to be updated. With | |
higher prescaler (256), and according to HSI variation, we need to wait at | |
least 6 cycles so 48 ms. */ | |
#define HAL_IWDG_DEFAULT_TIMEOUT 48u | |
/** | |
* @} | |
*/ | |
/* Private macro -------------------------------------------------------------*/ | |
/* Private variables ---------------------------------------------------------*/ | |
/* Private function prototypes -----------------------------------------------*/ | |
/* Exported functions --------------------------------------------------------*/ | |
/** @addtogroup IWDG_Exported_Functions | |
* @{ | |
*/ | |
/** @addtogroup IWDG_Exported_Functions_Group1 | |
* @brief Initialization and Start functions. | |
* | |
@verbatim | |
=============================================================================== | |
##### Initialization and Start functions ##### | |
=============================================================================== | |
[..] This section provides functions allowing to: | |
(+) Initialize the IWDG according to the specified parameters in the | |
IWDG_InitTypeDef of associated handle. | |
(+) Manage Window option. | |
(+) Once initialization is performed in HAL_IWDG_Init function, Watchdog | |
is reloaded in order to exit function with correct time base. | |
@endverbatim | |
* @{ | |
*/ | |
/** | |
* @brief Initialize the IWDG according to the specified parameters in the | |
* IWDG_InitTypeDef and start watchdog. Before exiting function, | |
* watchdog is refreshed in order to have correct time base. | |
* @param hiwdg pointer to a IWDG_HandleTypeDef structure that contains | |
* the configuration information for the specified IWDG module. | |
* @retval HAL status | |
*/ | |
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg) | |
{ | |
uint32_t tickstart; | |
/* Check the IWDG handle allocation */ | |
if(hiwdg == NULL) | |
{ | |
return HAL_ERROR; | |
} | |
/* Check the parameters */ | |
assert_param(IS_IWDG_ALL_INSTANCE(hiwdg->Instance)); | |
assert_param(IS_IWDG_PRESCALER(hiwdg->Init.Prescaler)); | |
assert_param(IS_IWDG_RELOAD(hiwdg->Init.Reload)); | |
assert_param(IS_IWDG_WINDOW(hiwdg->Init.Window)); | |
/* Enable IWDG. LSI is turned on automaticaly */ | |
__HAL_IWDG_START(hiwdg); | |
/* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers by writing | |
0x5555 in KR */ | |
IWDG_ENABLE_WRITE_ACCESS(hiwdg); | |
/* Write to IWDG registers the Prescaler & Reload values to work with */ | |
hiwdg->Instance->PR = hiwdg->Init.Prescaler; | |
hiwdg->Instance->RLR = hiwdg->Init.Reload; | |
/* Check pending flag, if previous update not done, return timeout */ | |
tickstart = HAL_GetTick(); | |
/* Wait for register to be updated */ | |
while(hiwdg->Instance->SR != RESET) | |
{ | |
if((HAL_GetTick() - tickstart ) > HAL_IWDG_DEFAULT_TIMEOUT) | |
{ | |
return HAL_TIMEOUT; | |
} | |
} | |
/* If window parameter is different than current value, modify window | |
register */ | |
if(hiwdg->Instance->WINR != hiwdg->Init.Window) | |
{ | |
/* Write to IWDG WINR the IWDG_Window value to compare with. In any case, | |
even if window feature is disabled, Watchdog will be reloaded by writing | |
windows register */ | |
hiwdg->Instance->WINR = hiwdg->Init.Window; | |
} | |
else | |
{ | |
/* Reload IWDG counter with value defined in the reload register */ | |
__HAL_IWDG_RELOAD_COUNTER(hiwdg); | |
} | |
/* Return function status */ | |
return HAL_OK; | |
} | |
/** | |
* @} | |
*/ | |
/** @addtogroup IWDG_Exported_Functions_Group2 | |
* @brief IO operation functions | |
* | |
@verbatim | |
=============================================================================== | |
##### IO operation functions ##### | |
=============================================================================== | |
[..] This section provides functions allowing to: | |
(+) Refresh the IWDG. | |
@endverbatim | |
* @{ | |
*/ | |
/** | |
* @brief Refresh the IWDG. | |
* @param hiwdg pointer to a IWDG_HandleTypeDef structure that contains | |
* the configuration information for the specified IWDG module. | |
* @retval HAL status | |
*/ | |
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg) | |
{ | |
/* Reload IWDG counter with value defined in the reload register */ | |
__HAL_IWDG_RELOAD_COUNTER(hiwdg); | |
/* Return function status */ | |
return HAL_OK; | |
} | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
#endif /* HAL_IWDG_MODULE_ENABLED */ | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |