12 changed files with 964 additions and 66 deletions
-
50.mxproject
-
52Core/Inc/iwdg.h
-
2Core/Inc/stm32f4xx_hal_conf.h
-
55Core/Src/iwdg.c
-
4Core/Src/main.c
-
220Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h
-
302Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_iwdg.h
-
262Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c
-
28LWIP/Target/ethernetif.c
-
4usrc/main.cpp
-
2usrc/project_configs.h
-
49xsync_stm32.ioc
50
.mxproject
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,52 @@ |
|||
/* USER CODE BEGIN Header */ |
|||
/** |
|||
****************************************************************************** |
|||
* @file iwdg.h |
|||
* @brief This file contains all the function prototypes for |
|||
* the iwdg.c file |
|||
****************************************************************************** |
|||
* @attention |
|||
* |
|||
* Copyright (c) 2024 STMicroelectronics. |
|||
* All rights reserved. |
|||
* |
|||
* This software is licensed under terms that can be found in the LICENSE file |
|||
* in the root directory of this software component. |
|||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|||
* |
|||
****************************************************************************** |
|||
*/ |
|||
/* USER CODE END Header */ |
|||
/* Define to prevent recursive inclusion -------------------------------------*/ |
|||
#ifndef __IWDG_H__ |
|||
#define __IWDG_H__ |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
/* Includes ------------------------------------------------------------------*/ |
|||
#include "main.h" |
|||
|
|||
/* USER CODE BEGIN Includes */ |
|||
|
|||
/* USER CODE END Includes */ |
|||
|
|||
extern IWDG_HandleTypeDef hiwdg; |
|||
|
|||
/* USER CODE BEGIN Private defines */ |
|||
|
|||
/* USER CODE END Private defines */ |
|||
|
|||
void MX_IWDG_Init(void); |
|||
|
|||
/* USER CODE BEGIN Prototypes */ |
|||
|
|||
/* USER CODE END Prototypes */ |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* __IWDG_H__ */ |
|||
|
@ -0,0 +1,55 @@ |
|||
/* USER CODE BEGIN Header */ |
|||
/** |
|||
****************************************************************************** |
|||
* @file iwdg.c |
|||
* @brief This file provides code for the configuration |
|||
* of the IWDG instances. |
|||
****************************************************************************** |
|||
* @attention |
|||
* |
|||
* Copyright (c) 2024 STMicroelectronics. |
|||
* All rights reserved. |
|||
* |
|||
* This software is licensed under terms that can be found in the LICENSE file |
|||
* in the root directory of this software component. |
|||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|||
* |
|||
****************************************************************************** |
|||
*/ |
|||
/* USER CODE END Header */ |
|||
/* Includes ------------------------------------------------------------------*/ |
|||
#include "iwdg.h" |
|||
|
|||
/* USER CODE BEGIN 0 */ |
|||
|
|||
/* USER CODE END 0 */ |
|||
|
|||
IWDG_HandleTypeDef hiwdg; |
|||
|
|||
/* IWDG init function */ |
|||
void MX_IWDG_Init(void) |
|||
{ |
|||
|
|||
/* USER CODE BEGIN IWDG_Init 0 */ |
|||
|
|||
/* USER CODE END IWDG_Init 0 */ |
|||
|
|||
/* USER CODE BEGIN IWDG_Init 1 */ |
|||
|
|||
/* USER CODE END IWDG_Init 1 */ |
|||
hiwdg.Instance = IWDG; |
|||
hiwdg.Init.Prescaler = IWDG_PRESCALER_4; |
|||
hiwdg.Init.Reload = 1000; |
|||
if (HAL_IWDG_Init(&hiwdg) != HAL_OK) |
|||
{ |
|||
Error_Handler(); |
|||
} |
|||
/* USER CODE BEGIN IWDG_Init 2 */ |
|||
|
|||
/* USER CODE END IWDG_Init 2 */ |
|||
|
|||
} |
|||
|
|||
/* USER CODE BEGIN 1 */ |
|||
|
|||
/* USER CODE END 1 */ |
@ -0,0 +1,220 @@ |
|||
/** |
|||
****************************************************************************** |
|||
* @file stm32f4xx_hal_iwdg.h |
|||
* @author MCD Application Team |
|||
* @brief Header file of IWDG HAL module. |
|||
****************************************************************************** |
|||
* @attention |
|||
* |
|||
* Copyright (c) 2016 STMicroelectronics. |
|||
* All rights reserved. |
|||
* |
|||
* This software is licensed under terms that can be found in the LICENSE file |
|||
* in the root directory of this software component. |
|||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|||
* |
|||
****************************************************************************** |
|||
*/ |
|||
|
|||
/* Define to prevent recursive inclusion -------------------------------------*/ |
|||
#ifndef STM32F4xx_HAL_IWDG_H |
|||
#define STM32F4xx_HAL_IWDG_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
/* Includes ------------------------------------------------------------------*/ |
|||
#include "stm32f4xx_hal_def.h" |
|||
|
|||
/** @addtogroup STM32F4xx_HAL_Driver |
|||
* @{ |
|||
*/ |
|||
|
|||
/** @defgroup IWDG IWDG |
|||
* @{ |
|||
*/ |
|||
|
|||
/* Exported types ------------------------------------------------------------*/ |
|||
/** @defgroup IWDG_Exported_Types IWDG Exported Types |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief IWDG Init structure definition |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
uint32_t Prescaler; /*!< Select the prescaler of the IWDG. |
|||
This parameter can be a value of @ref IWDG_Prescaler */ |
|||
|
|||
uint32_t Reload; /*!< Specifies the IWDG down-counter reload value. |
|||
This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */ |
|||
|
|||
} IWDG_InitTypeDef; |
|||
|
|||
/** |
|||
* @brief IWDG Handle Structure definition |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
IWDG_TypeDef *Instance; /*!< Register base address */ |
|||
|
|||
IWDG_InitTypeDef Init; /*!< IWDG required parameters */ |
|||
} IWDG_HandleTypeDef; |
|||
|
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Exported constants --------------------------------------------------------*/ |
|||
/** @defgroup IWDG_Exported_Constants IWDG Exported Constants |
|||
* @{ |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_Prescaler IWDG Prescaler |
|||
* @{ |
|||
*/ |
|||
#define IWDG_PRESCALER_4 0x00000000u /*!< IWDG prescaler set to 4 */ |
|||
#define IWDG_PRESCALER_8 IWDG_PR_PR_0 /*!< IWDG prescaler set to 8 */ |
|||
#define IWDG_PRESCALER_16 IWDG_PR_PR_1 /*!< IWDG prescaler set to 16 */ |
|||
#define IWDG_PRESCALER_32 (IWDG_PR_PR_1 | IWDG_PR_PR_0) /*!< IWDG prescaler set to 32 */ |
|||
#define IWDG_PRESCALER_64 IWDG_PR_PR_2 /*!< IWDG prescaler set to 64 */ |
|||
#define IWDG_PRESCALER_128 (IWDG_PR_PR_2 | IWDG_PR_PR_0) /*!< IWDG prescaler set to 128 */ |
|||
#define IWDG_PRESCALER_256 (IWDG_PR_PR_2 | IWDG_PR_PR_1) /*!< IWDG prescaler set to 256 */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Exported macros -----------------------------------------------------------*/ |
|||
/** @defgroup IWDG_Exported_Macros IWDG Exported Macros |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief Enable the IWDG peripheral. |
|||
* @param __HANDLE__ IWDG handle |
|||
* @retval None |
|||
*/ |
|||
#define __HAL_IWDG_START(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE) |
|||
|
|||
/** |
|||
* @brief Reload IWDG counter with value defined in the reload register |
|||
* (write access to IWDG_PR and IWDG_RLR registers disabled). |
|||
* @param __HANDLE__ IWDG handle |
|||
* @retval None |
|||
*/ |
|||
#define __HAL_IWDG_RELOAD_COUNTER(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_RELOAD) |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Exported functions --------------------------------------------------------*/ |
|||
/** @defgroup IWDG_Exported_Functions IWDG Exported Functions |
|||
* @{ |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_Exported_Functions_Group1 Initialization and Start functions |
|||
* @{ |
|||
*/ |
|||
/* Initialization/Start functions ********************************************/ |
|||
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg); |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_Exported_Functions_Group2 IO operation functions |
|||
* @{ |
|||
*/ |
|||
/* I/O operation functions ****************************************************/ |
|||
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg); |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Private constants ---------------------------------------------------------*/ |
|||
/** @defgroup IWDG_Private_Constants IWDG Private Constants |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief IWDG Key Register BitMask |
|||
*/ |
|||
#define IWDG_KEY_RELOAD 0x0000AAAAu /*!< IWDG Reload Counter Enable */ |
|||
#define IWDG_KEY_ENABLE 0x0000CCCCu /*!< IWDG Peripheral Enable */ |
|||
#define IWDG_KEY_WRITE_ACCESS_ENABLE 0x00005555u /*!< IWDG KR Write Access Enable */ |
|||
#define IWDG_KEY_WRITE_ACCESS_DISABLE 0x00000000u /*!< IWDG KR Write Access Disable */ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Private macros ------------------------------------------------------------*/ |
|||
/** @defgroup IWDG_Private_Macros IWDG Private Macros |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief Enable write access to IWDG_PR and IWDG_RLR registers. |
|||
* @param __HANDLE__ IWDG handle |
|||
* @retval None |
|||
*/ |
|||
#define IWDG_ENABLE_WRITE_ACCESS(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_WRITE_ACCESS_ENABLE) |
|||
|
|||
/** |
|||
* @brief Disable write access to IWDG_PR and IWDG_RLR registers. |
|||
* @param __HANDLE__ IWDG handle |
|||
* @retval None |
|||
*/ |
|||
#define IWDG_DISABLE_WRITE_ACCESS(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_WRITE_ACCESS_DISABLE) |
|||
|
|||
/** |
|||
* @brief Check IWDG prescaler value. |
|||
* @param __PRESCALER__ IWDG prescaler value |
|||
* @retval None |
|||
*/ |
|||
#define IS_IWDG_PRESCALER(__PRESCALER__) (((__PRESCALER__) == IWDG_PRESCALER_4) || \ |
|||
((__PRESCALER__) == IWDG_PRESCALER_8) || \ |
|||
((__PRESCALER__) == IWDG_PRESCALER_16) || \ |
|||
((__PRESCALER__) == IWDG_PRESCALER_32) || \ |
|||
((__PRESCALER__) == IWDG_PRESCALER_64) || \ |
|||
((__PRESCALER__) == IWDG_PRESCALER_128)|| \ |
|||
((__PRESCALER__) == IWDG_PRESCALER_256)) |
|||
|
|||
/** |
|||
* @brief Check IWDG reload value. |
|||
* @param __RELOAD__ IWDG reload value |
|||
* @retval None |
|||
*/ |
|||
#define IS_IWDG_RELOAD(__RELOAD__) ((__RELOAD__) <= IWDG_RLR_RL) |
|||
|
|||
|
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* STM32F4xx_HAL_IWDG_H */ |
@ -0,0 +1,302 @@ |
|||
/** |
|||
****************************************************************************** |
|||
* @file stm32f4xx_ll_iwdg.h |
|||
* @author MCD Application Team |
|||
* @brief Header file of IWDG LL module. |
|||
****************************************************************************** |
|||
* @attention |
|||
* |
|||
* Copyright (c) 2016 STMicroelectronics. |
|||
* All rights reserved. |
|||
* |
|||
* This software is licensed under terms that can be found in the LICENSE file |
|||
* in the root directory of this software component. |
|||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|||
* |
|||
****************************************************************************** |
|||
*/ |
|||
|
|||
/* Define to prevent recursive inclusion -------------------------------------*/ |
|||
#ifndef STM32F4xx_LL_IWDG_H |
|||
#define STM32F4xx_LL_IWDG_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
/* Includes ------------------------------------------------------------------*/ |
|||
#include "stm32f4xx.h" |
|||
|
|||
/** @addtogroup STM32F4xx_LL_Driver |
|||
* @{ |
|||
*/ |
|||
|
|||
#if defined(IWDG) |
|||
|
|||
/** @defgroup IWDG_LL IWDG |
|||
* @{ |
|||
*/ |
|||
|
|||
/* Private types -------------------------------------------------------------*/ |
|||
/* Private variables ---------------------------------------------------------*/ |
|||
|
|||
/* Private constants ---------------------------------------------------------*/ |
|||
/** @defgroup IWDG_LL_Private_Constants IWDG Private Constants |
|||
* @{ |
|||
*/ |
|||
#define LL_IWDG_KEY_RELOAD 0x0000AAAAU /*!< IWDG Reload Counter Enable */ |
|||
#define LL_IWDG_KEY_ENABLE 0x0000CCCCU /*!< IWDG Peripheral Enable */ |
|||
#define LL_IWDG_KEY_WR_ACCESS_ENABLE 0x00005555U /*!< IWDG KR Write Access Enable */ |
|||
#define LL_IWDG_KEY_WR_ACCESS_DISABLE 0x00000000U /*!< IWDG KR Write Access Disable */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Private macros ------------------------------------------------------------*/ |
|||
|
|||
/* Exported types ------------------------------------------------------------*/ |
|||
/* Exported constants --------------------------------------------------------*/ |
|||
/** @defgroup IWDG_LL_Exported_Constants IWDG Exported Constants |
|||
* @{ |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_LL_EC_GET_FLAG Get Flags Defines |
|||
* @brief Flags defines which can be used with LL_IWDG_ReadReg function |
|||
* @{ |
|||
*/ |
|||
#define LL_IWDG_SR_PVU IWDG_SR_PVU /*!< Watchdog prescaler value update */ |
|||
#define LL_IWDG_SR_RVU IWDG_SR_RVU /*!< Watchdog counter reload value update */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_LL_EC_PRESCALER Prescaler Divider |
|||
* @{ |
|||
*/ |
|||
#define LL_IWDG_PRESCALER_4 0x00000000U /*!< Divider by 4 */ |
|||
#define LL_IWDG_PRESCALER_8 (IWDG_PR_PR_0) /*!< Divider by 8 */ |
|||
#define LL_IWDG_PRESCALER_16 (IWDG_PR_PR_1) /*!< Divider by 16 */ |
|||
#define LL_IWDG_PRESCALER_32 (IWDG_PR_PR_1 | IWDG_PR_PR_0) /*!< Divider by 32 */ |
|||
#define LL_IWDG_PRESCALER_64 (IWDG_PR_PR_2) /*!< Divider by 64 */ |
|||
#define LL_IWDG_PRESCALER_128 (IWDG_PR_PR_2 | IWDG_PR_PR_0) /*!< Divider by 128 */ |
|||
#define LL_IWDG_PRESCALER_256 (IWDG_PR_PR_2 | IWDG_PR_PR_1) /*!< Divider by 256 */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Exported macro ------------------------------------------------------------*/ |
|||
/** @defgroup IWDG_LL_Exported_Macros IWDG Exported Macros |
|||
* @{ |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_LL_EM_WRITE_READ Common Write and read registers Macros |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief Write a value in IWDG register |
|||
* @param __INSTANCE__ IWDG Instance |
|||
* @param __REG__ Register to be written |
|||
* @param __VALUE__ Value to be written in the register |
|||
* @retval None |
|||
*/ |
|||
#define LL_IWDG_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) |
|||
|
|||
/** |
|||
* @brief Read a value in IWDG register |
|||
* @param __INSTANCE__ IWDG Instance |
|||
* @param __REG__ Register to be read |
|||
* @retval Register value |
|||
*/ |
|||
#define LL_IWDG_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
|
|||
/* Exported functions --------------------------------------------------------*/ |
|||
/** @defgroup IWDG_LL_Exported_Functions IWDG Exported Functions |
|||
* @{ |
|||
*/ |
|||
/** @defgroup IWDG_LL_EF_Configuration Configuration |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief Start the Independent Watchdog |
|||
* @note Except if the hardware watchdog option is selected |
|||
* @rmtoll KR KEY LL_IWDG_Enable |
|||
* @param IWDGx IWDG Instance |
|||
* @retval None |
|||
*/ |
|||
__STATIC_INLINE void LL_IWDG_Enable(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
WRITE_REG(IWDGx->KR, LL_IWDG_KEY_ENABLE); |
|||
} |
|||
|
|||
/** |
|||
* @brief Reloads IWDG counter with value defined in the reload register |
|||
* @rmtoll KR KEY LL_IWDG_ReloadCounter |
|||
* @param IWDGx IWDG Instance |
|||
* @retval None |
|||
*/ |
|||
__STATIC_INLINE void LL_IWDG_ReloadCounter(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
WRITE_REG(IWDGx->KR, LL_IWDG_KEY_RELOAD); |
|||
} |
|||
|
|||
/** |
|||
* @brief Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers |
|||
* @rmtoll KR KEY LL_IWDG_EnableWriteAccess |
|||
* @param IWDGx IWDG Instance |
|||
* @retval None |
|||
*/ |
|||
__STATIC_INLINE void LL_IWDG_EnableWriteAccess(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
WRITE_REG(IWDGx->KR, LL_IWDG_KEY_WR_ACCESS_ENABLE); |
|||
} |
|||
|
|||
/** |
|||
* @brief Disable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers |
|||
* @rmtoll KR KEY LL_IWDG_DisableWriteAccess |
|||
* @param IWDGx IWDG Instance |
|||
* @retval None |
|||
*/ |
|||
__STATIC_INLINE void LL_IWDG_DisableWriteAccess(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
WRITE_REG(IWDGx->KR, LL_IWDG_KEY_WR_ACCESS_DISABLE); |
|||
} |
|||
|
|||
/** |
|||
* @brief Select the prescaler of the IWDG |
|||
* @rmtoll PR PR LL_IWDG_SetPrescaler |
|||
* @param IWDGx IWDG Instance |
|||
* @param Prescaler This parameter can be one of the following values: |
|||
* @arg @ref LL_IWDG_PRESCALER_4 |
|||
* @arg @ref LL_IWDG_PRESCALER_8 |
|||
* @arg @ref LL_IWDG_PRESCALER_16 |
|||
* @arg @ref LL_IWDG_PRESCALER_32 |
|||
* @arg @ref LL_IWDG_PRESCALER_64 |
|||
* @arg @ref LL_IWDG_PRESCALER_128 |
|||
* @arg @ref LL_IWDG_PRESCALER_256 |
|||
* @retval None |
|||
*/ |
|||
__STATIC_INLINE void LL_IWDG_SetPrescaler(IWDG_TypeDef *IWDGx, uint32_t Prescaler) |
|||
{ |
|||
WRITE_REG(IWDGx->PR, IWDG_PR_PR & Prescaler); |
|||
} |
|||
|
|||
/** |
|||
* @brief Get the selected prescaler of the IWDG |
|||
* @rmtoll PR PR LL_IWDG_GetPrescaler |
|||
* @param IWDGx IWDG Instance |
|||
* @retval Returned value can be one of the following values: |
|||
* @arg @ref LL_IWDG_PRESCALER_4 |
|||
* @arg @ref LL_IWDG_PRESCALER_8 |
|||
* @arg @ref LL_IWDG_PRESCALER_16 |
|||
* @arg @ref LL_IWDG_PRESCALER_32 |
|||
* @arg @ref LL_IWDG_PRESCALER_64 |
|||
* @arg @ref LL_IWDG_PRESCALER_128 |
|||
* @arg @ref LL_IWDG_PRESCALER_256 |
|||
*/ |
|||
__STATIC_INLINE uint32_t LL_IWDG_GetPrescaler(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
return (READ_REG(IWDGx->PR)); |
|||
} |
|||
|
|||
/** |
|||
* @brief Specify the IWDG down-counter reload value |
|||
* @rmtoll RLR RL LL_IWDG_SetReloadCounter |
|||
* @param IWDGx IWDG Instance |
|||
* @param Counter Value between Min_Data=0 and Max_Data=0x0FFF |
|||
* @retval None |
|||
*/ |
|||
__STATIC_INLINE void LL_IWDG_SetReloadCounter(IWDG_TypeDef *IWDGx, uint32_t Counter) |
|||
{ |
|||
WRITE_REG(IWDGx->RLR, IWDG_RLR_RL & Counter); |
|||
} |
|||
|
|||
/** |
|||
* @brief Get the specified IWDG down-counter reload value |
|||
* @rmtoll RLR RL LL_IWDG_GetReloadCounter |
|||
* @param IWDGx IWDG Instance |
|||
* @retval Value between Min_Data=0 and Max_Data=0x0FFF |
|||
*/ |
|||
__STATIC_INLINE uint32_t LL_IWDG_GetReloadCounter(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
return (READ_REG(IWDGx->RLR)); |
|||
} |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @defgroup IWDG_LL_EF_FLAG_Management FLAG_Management |
|||
* @{ |
|||
*/ |
|||
|
|||
/** |
|||
* @brief Check if flag Prescaler Value Update is set or not |
|||
* @rmtoll SR PVU LL_IWDG_IsActiveFlag_PVU |
|||
* @param IWDGx IWDG Instance |
|||
* @retval State of bit (1 or 0). |
|||
*/ |
|||
__STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_PVU(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
return ((READ_BIT(IWDGx->SR, IWDG_SR_PVU) == (IWDG_SR_PVU)) ? 1UL : 0UL); |
|||
} |
|||
|
|||
/** |
|||
* @brief Check if flag Reload Value Update is set or not |
|||
* @rmtoll SR RVU LL_IWDG_IsActiveFlag_RVU |
|||
* @param IWDGx IWDG Instance |
|||
* @retval State of bit (1 or 0). |
|||
*/ |
|||
__STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_RVU(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
return ((READ_BIT(IWDGx->SR, IWDG_SR_RVU) == (IWDG_SR_RVU)) ? 1UL : 0UL); |
|||
} |
|||
|
|||
/** |
|||
* @brief Check if flags Prescaler & Reload Value Update are reset or not |
|||
* @rmtoll SR PVU LL_IWDG_IsReady\n |
|||
* SR RVU LL_IWDG_IsReady |
|||
* @param IWDGx IWDG Instance |
|||
* @retval State of bits (1 or 0). |
|||
*/ |
|||
__STATIC_INLINE uint32_t LL_IWDG_IsReady(IWDG_TypeDef *IWDGx) |
|||
{ |
|||
return ((READ_BIT(IWDGx->SR, IWDG_SR_PVU | IWDG_SR_RVU) == 0U) ? 1UL : 0UL); |
|||
} |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
#endif /* IWDG */ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* STM32F4xx_LL_IWDG_H */ |
@ -0,0 +1,262 @@ |
|||
/** |
|||
****************************************************************************** |
|||
* @file stm32f4xx_hal_iwdg.c |
|||
* @author MCD Application Team |
|||
* @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 |
|||
* |
|||
****************************************************************************** |
|||
* @attention |
|||
* |
|||
* Copyright (c) 2016 STMicroelectronics. |
|||
* All rights reserved. |
|||
* |
|||
* This software is licensed under terms that can be found in the LICENSE file |
|||
* in the root directory of this software component. |
|||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|||
* |
|||
****************************************************************************** |
|||
@verbatim |
|||
============================================================================== |
|||
##### IWDG Generic features ##### |
|||
============================================================================== |
|||
[..] |
|||
(+) The IWDG can be started by either software or hardware (configurable |
|||
through option byte). |
|||
|
|||
(+) The IWDG is clocked by the Low-Speed Internal clock (LSI) and thus stays |
|||
active even if the main clock fails. |
|||
|
|||
(+) Once the IWDG is started, the LSI is forced ON and both cannot 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 into 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 the CPU 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 clock frequency dispersion. |
|||
STM32F4xx devices provide the capability to measure the LSI clock |
|||
frequency (LSI clock is internally connected to TIM5 CH4 input capture). |
|||
The measured value can be used to have an IWDG timeout with an |
|||
acceptable accuracy. |
|||
|
|||
[..] Default timeout value (necessary for IWDG_SR status register update): |
|||
Constant LSI_VALUE is defined based on the nominal LSI clock frequency. |
|||
This frequency being subject to variations as mentioned above, the |
|||
default timeout value (defined through constant HAL_IWDG_DEFAULT_TIMEOUT |
|||
below) may become too short or too long. |
|||
In such cases, this default timeout value can be tuned by redefining |
|||
the constant LSI_VALUE at user-application level (based, for instance, |
|||
on the measured LSI clock frequency as explained above). |
|||
|
|||
##### 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 counting down. |
|||
(++) Enable write access to configuration registers: |
|||
IWDG_PR and IWDG_RLR. |
|||
(++) 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. |
|||
|
|||
(#) 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 |
|||
*/ |
|||
|
|||
/* Includes ------------------------------------------------------------------*/ |
|||
#include "stm32f4xx_hal.h" |
|||
|
|||
/** @addtogroup STM32F4xx_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 needs up to 5 LSI clock periods divided by the clock |
|||
prescaler to be updated. The number of LSI clock periods is upper-rounded to |
|||
6 for the timeout value calculation. |
|||
The timeout value is calculated using the highest prescaler (256) and |
|||
the LSI_VALUE constant. The value of this constant can be changed by the user |
|||
to take into account possible LSI clock period variations. |
|||
The timeout value is multiplied by 1000 to be converted in milliseconds. |
|||
LSI startup time is also considered here by adding LSI_STARTUP_TIME |
|||
converted in milliseconds. */ |
|||
#define HAL_IWDG_DEFAULT_TIMEOUT (((6UL * 256UL * 1000UL) / LSI_VALUE) + ((LSI_STARTUP_TIME / 1000UL) + 1UL)) |
|||
#define IWDG_KERNEL_UPDATE_FLAGS (IWDG_SR_RVU | IWDG_SR_PVU) |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* 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. |
|||
(+) 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)); |
|||
|
|||
/* Enable IWDG. LSI is turned on automatically */ |
|||
__HAL_IWDG_START(hiwdg); |
|||
|
|||
/* Enable write access to IWDG_PR and IWDG_RLR 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 & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u) |
|||
{ |
|||
if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT) |
|||
{ |
|||
if ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u) |
|||
{ |
|||
return HAL_TIMEOUT; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* 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 */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue