Merge pull request #93 from zyp/master
[fw/stlink] / example / libs_stm / src / stm32l1xx / stm32l1xx_iwdg.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32l1xx_iwdg.c\r
4   * @author  MCD Application Team\r
5   * @version V1.0.0\r
6   * @date    31-December-2010\r
7   * @brief   This file provides firmware functions to manage the following \r
8   *          functionalities of the Independent watchdog (IWDG) peripheral:           \r
9   *           - Prescaler and Counter configuration\r
10   *           - IWDG activation\r
11   *           - Flag management\r
12   *\r
13   *  @verbatim  \r
14   *  \r
15   *          ===================================================================\r
16   *                                     IWDG features\r
17   *          ===================================================================\r
18   *    \r
19   *          The IWDG can be started by either software or hardware (configurable\r
20   *          through option byte).\r
21   *            \r
22   *          The IWDG is clocked by its own dedicated low-speed clock (LSI) and\r
23   *          thus stays active even if the main clock fails.\r
24   *          Once the IWDG is started, the LSI is forced ON and cannot be disabled\r
25   *          (LSI cannot be disabled too), and the counter starts counting down from \r
26   *          the reset value of 0xFFF. When it reaches the end of count value (0x000)\r
27   *          a system reset is generated.\r
28   *          The IWDG counter should be reloaded at regular intervals to prevent\r
29   *          an MCU reset.\r
30   *                           \r
31   *          The IWDG is implemented in the VDD voltage domain that is still functional\r
32   *          in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY)          \r
33   *            \r
34   *          IWDGRST flag in RCC_CSR register can be used to inform when a IWDG\r
35   *          reset occurs\r
36   *            \r
37   *          Min-max timeout value @37KHz (LSI): ~108us / ~28.3s\r
38   *          The IWDG timeout may vary due to LSI frequency dispersion. STM32L1xx\r
39   *          devices provide the capability to measure the LSI frequency (LSI clock\r
40   *          connected internally to TIM10 CH1 input capture). The measured value\r
41   *          can be used to have an IWDG timeout with an acceptable accuracy. \r
42   *          For more information, please refer to the STM32L1xx Reference manual\r
43   *          \r
44   *                            \r
45   *          ===================================================================\r
46   *                                 How to use this driver\r
47   *          ===================================================================\r
48   *          1. Enable write access to IWDG_PR and IWDG_RLR registers using\r
49   *             IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function\r
50   *               \r
51   *          2. Configure the IWDG prescaler using IWDG_SetPrescaler() function\r
52   *            \r
53   *          3. Configure the IWDG counter value using IWDG_SetReload() function.\r
54   *             This value will be loaded in the IWDG counter each time the counter\r
55   *             is reloaded, then the IWDG will start counting down from this value.\r
56   *            \r
57   *          4. Start the IWDG using IWDG_Enable() function, when the IWDG is used\r
58   *             in software mode (no need to enable the LSI, it will be enabled\r
59   *             by hardware)\r
60   *             \r
61   *          5. Then the application program must reload the IWDG counter at regular\r
62   *             intervals during normal operation to prevent an MCU reset, using\r
63   *             IWDG_ReloadCounter() function.      \r
64   *          \r
65   *  @endverbatim\r
66   *    \r
67   ******************************************************************************\r
68   * @attention\r
69   *\r
70   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
71   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
72   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
73   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
74   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
75   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
76   *\r
77   * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
78   ******************************************************************************  \r
79   */ \r
80 \r
81 /* Includes ------------------------------------------------------------------*/\r
82 #include "stm32l1xx_iwdg.h"\r
83 \r
84 /** @addtogroup STM32L1xx_StdPeriph_Driver\r
85   * @{\r
86   */\r
87 \r
88 /** @defgroup IWDG \r
89   * @brief IWDG driver modules\r
90   * @{\r
91   */ \r
92 \r
93 /* Private typedef -----------------------------------------------------------*/\r
94 /* Private define ------------------------------------------------------------*/\r
95 /* ---------------------- IWDG registers bit mask ----------------------------*/\r
96 /* KR register bit mask */\r
97 #define KR_KEY_RELOAD    ((uint16_t)0xAAAA)\r
98 #define KR_KEY_ENABLE    ((uint16_t)0xCCCC)\r
99 \r
100 /* Private macro -------------------------------------------------------------*/\r
101 /* Private variables ---------------------------------------------------------*/\r
102 /* Private function prototypes -----------------------------------------------*/\r
103 /* Private functions ---------------------------------------------------------*/\r
104 \r
105 /** @defgroup IWDG_Private_Functions\r
106   * @{\r
107   */\r
108 \r
109 /** @defgroup IWDG_Group1 Prescaler and Counter configuration functions\r
110  *  @brief   Prescaler and Counter configuration functions\r
111  *\r
112 @verbatim   \r
113  ===============================================================================\r
114                   Prescaler and Counter configuration functions\r
115  ===============================================================================  \r
116 \r
117 @endverbatim\r
118   * @{\r
119   */\r
120 \r
121 /**\r
122   * @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.\r
123   * @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.\r
124   *   This parameter can be one of the following values:\r
125   *     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers\r
126   *     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers\r
127   * @retval None\r
128   */\r
129 void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)\r
130 {\r
131   /* Check the parameters */\r
132   assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));\r
133   IWDG->KR = IWDG_WriteAccess;\r
134 }\r
135 \r
136 /**\r
137   * @brief  Sets IWDG Prescaler value.\r
138   * @param  IWDG_Prescaler: specifies the IWDG Prescaler value.\r
139   *   This parameter can be one of the following values:\r
140   *     @arg IWDG_Prescaler_4: IWDG prescaler set to 4\r
141   *     @arg IWDG_Prescaler_8: IWDG prescaler set to 8\r
142   *     @arg IWDG_Prescaler_16: IWDG prescaler set to 16\r
143   *     @arg IWDG_Prescaler_32: IWDG prescaler set to 32\r
144   *     @arg IWDG_Prescaler_64: IWDG prescaler set to 64\r
145   *     @arg IWDG_Prescaler_128: IWDG prescaler set to 128\r
146   *     @arg IWDG_Prescaler_256: IWDG prescaler set to 256\r
147   * @retval None\r
148   */\r
149 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)\r
150 {\r
151   /* Check the parameters */\r
152   assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler));\r
153   IWDG->PR = IWDG_Prescaler;\r
154 }\r
155 \r
156 /**\r
157   * @brief  Sets IWDG Reload value.\r
158   * @param  Reload: specifies the IWDG Reload value.\r
159   *   This parameter must be a number between 0 and 0x0FFF.\r
160   * @retval None\r
161   */\r
162 void IWDG_SetReload(uint16_t Reload)\r
163 {\r
164   /* Check the parameters */\r
165   assert_param(IS_IWDG_RELOAD(Reload));\r
166   IWDG->RLR = Reload;\r
167 }\r
168 \r
169 /**\r
170   * @brief  Reloads IWDG counter with value defined in the reload register\r
171   *   (write access to IWDG_PR and IWDG_RLR registers disabled).\r
172   * @param  None\r
173   * @retval None\r
174   */\r
175 void IWDG_ReloadCounter(void)\r
176 {\r
177   IWDG->KR = KR_KEY_RELOAD;\r
178 }\r
179 \r
180 /**\r
181   * @}\r
182   */\r
183 \r
184 /** @defgroup IWDG_Group2 IWDG activation function\r
185  *  @brief   IWDG activation function \r
186  *\r
187 @verbatim   \r
188  ===============================================================================\r
189                           IWDG activation function\r
190  ===============================================================================  \r
191 \r
192 @endverbatim\r
193   * @{\r
194   */\r
195 \r
196 /**\r
197   * @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled).\r
198   * @param  None\r
199   * @retval None\r
200   */\r
201 void IWDG_Enable(void)\r
202 {\r
203   IWDG->KR = KR_KEY_ENABLE;\r
204 }\r
205 \r
206 /**\r
207   * @}\r
208   */\r
209 \r
210 /** @defgroup IWDG_Group3 Flag management function \r
211  *  @brief  Flag management function  \r
212  *\r
213 @verbatim   \r
214  ===============================================================================\r
215                             Flag management function \r
216  ===============================================================================  \r
217 \r
218 @endverbatim\r
219   * @{\r
220   */\r
221 \r
222 /**\r
223   * @brief  Checks whether the specified IWDG flag is set or not.\r
224   * @param  IWDG_FLAG: specifies the flag to check.\r
225   *   This parameter can be one of the following values:\r
226   *     @arg IWDG_FLAG_PVU: Prescaler Value Update on going\r
227   *     @arg IWDG_FLAG_RVU: Reload Value Update on going\r
228   * @retval The new state of IWDG_FLAG (SET or RESET).\r
229   */\r
230 FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)\r
231 {\r
232   FlagStatus bitstatus = RESET;\r
233   /* Check the parameters */\r
234   assert_param(IS_IWDG_FLAG(IWDG_FLAG));\r
235   if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET)\r
236   {\r
237     bitstatus = SET;\r
238   }\r
239   else\r
240   {\r
241     bitstatus = RESET;\r
242   }\r
243   /* Return the flag status */\r
244   return bitstatus;\r
245 }\r
246 \r
247 /**\r
248   * @}\r
249   */\r
250 \r
251 /**\r
252   * @}\r
253   */\r
254 \r
255 /**\r
256   * @}\r
257   */\r
258 \r
259 /**\r
260   * @}\r
261   */\r
262 \r
263 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r