DSO138_SourceCodes_v037.rar
[DSO138] / Libraries / STM32F10x_StdPeriph_Driver / src / stm32f10x_pwr.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32f10x_pwr.c\r
4   * @author  MCD Application Team\r
5   * @version V3.3.0\r
6   * @date    04/16/2010\r
7   * @brief   This file provides all the PWR firmware functions.\r
8   ******************************************************************************\r
9   * @copy\r
10   *\r
11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
17   *\r
18   * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
19   */ \r
20 \r
21 /* Includes ------------------------------------------------------------------*/\r
22 #include "stm32f10x_pwr.h"\r
23 #include "stm32f10x_rcc.h"\r
24 \r
25 /** @addtogroup STM32F10x_StdPeriph_Driver\r
26   * @{\r
27   */\r
28 \r
29 /** @defgroup PWR \r
30   * @brief PWR driver modules\r
31   * @{\r
32   */ \r
33 \r
34 /** @defgroup PWR_Private_TypesDefinitions\r
35   * @{\r
36   */\r
37 \r
38 /**\r
39   * @}\r
40   */\r
41 \r
42 /** @defgroup PWR_Private_Defines\r
43   * @{\r
44   */\r
45 \r
46 /* --------- PWR registers bit address in the alias region ---------- */\r
47 #define PWR_OFFSET               (PWR_BASE - PERIPH_BASE)\r
48 \r
49 /* --- CR Register ---*/\r
50 \r
51 /* Alias word address of DBP bit */\r
52 #define CR_OFFSET                (PWR_OFFSET + 0x00)\r
53 #define DBP_BitNumber            0x08\r
54 #define CR_DBP_BB                (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4))\r
55 \r
56 /* Alias word address of PVDE bit */\r
57 #define PVDE_BitNumber           0x04\r
58 #define CR_PVDE_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4))\r
59 \r
60 /* --- CSR Register ---*/\r
61 \r
62 /* Alias word address of EWUP bit */\r
63 #define CSR_OFFSET               (PWR_OFFSET + 0x04)\r
64 #define EWUP_BitNumber           0x08\r
65 #define CSR_EWUP_BB              (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4))\r
66 \r
67 /* ------------------ PWR registers bit mask ------------------------ */\r
68 \r
69 /* CR register bit mask */\r
70 #define CR_PDDS_Set              ((uint32_t)0x00000002)\r
71 #define CR_DS_Mask               ((uint32_t)0xFFFFFFFC)\r
72 #define CR_CWUF_Set              ((uint32_t)0x00000004)\r
73 #define CR_PLS_Mask              ((uint32_t)0xFFFFFF1F)\r
74 \r
75 /* --------- Cortex System Control register bit mask ---------------- */\r
76 \r
77 /* Cortex System Control register address */\r
78 #define SCB_SysCtrl              ((uint32_t)0xE000ED10)\r
79 \r
80 /* SLEEPDEEP bit mask */\r
81 #define SysCtrl_SLEEPDEEP_Set    ((uint32_t)0x00000004)\r
82 #define SysCtrl_SLEEPDEEP_Reset  ((uint32_t)0xFFFFFFFB)\r
83 \r
84 /**\r
85   * @}\r
86   */\r
87 \r
88 /** @defgroup PWR_Private_Macros\r
89   * @{\r
90   */\r
91 \r
92 /**\r
93   * @}\r
94   */\r
95 \r
96 /** @defgroup PWR_Private_Variables\r
97   * @{\r
98   */\r
99 \r
100 /**\r
101   * @}\r
102   */\r
103 \r
104 /** @defgroup PWR_Private_FunctionPrototypes\r
105   * @{\r
106   */\r
107 \r
108 /**\r
109   * @}\r
110   */\r
111 \r
112 /** @defgroup PWR_Private_Functions\r
113   * @{\r
114   */\r
115 \r
116 /**\r
117   * @brief  Deinitializes the PWR peripheral registers to their default reset values.\r
118   * @param  None\r
119   * @retval None\r
120   */\r
121 void PWR_DeInit(void)\r
122 {\r
123   RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);\r
124   RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE);\r
125 }\r
126 \r
127 /**\r
128   * @brief  Enables or disables access to the RTC and backup registers.\r
129   * @param  NewState: new state of the access to the RTC and backup registers.\r
130   *   This parameter can be: ENABLE or DISABLE.\r
131   * @retval None\r
132   */\r
133 void PWR_BackupAccessCmd(FunctionalState NewState)\r
134 {\r
135   /* Check the parameters */\r
136   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
137   *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;\r
138 }\r
139 \r
140 /**\r
141   * @brief  Enables or disables the Power Voltage Detector(PVD).\r
142   * @param  NewState: new state of the PVD.\r
143   *   This parameter can be: ENABLE or DISABLE.\r
144   * @retval None\r
145   */\r
146 void PWR_PVDCmd(FunctionalState NewState)\r
147 {\r
148   /* Check the parameters */\r
149   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
150   *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState;\r
151 }\r
152 \r
153 /**\r
154   * @brief  Configures the voltage threshold detected by the Power Voltage Detector(PVD).\r
155   * @param  PWR_PVDLevel: specifies the PVD detection level\r
156   *   This parameter can be one of the following values:\r
157   *     @arg PWR_PVDLevel_2V2: PVD detection level set to 2.2V\r
158   *     @arg PWR_PVDLevel_2V3: PVD detection level set to 2.3V\r
159   *     @arg PWR_PVDLevel_2V4: PVD detection level set to 2.4V\r
160   *     @arg PWR_PVDLevel_2V5: PVD detection level set to 2.5V\r
161   *     @arg PWR_PVDLevel_2V6: PVD detection level set to 2.6V\r
162   *     @arg PWR_PVDLevel_2V7: PVD detection level set to 2.7V\r
163   *     @arg PWR_PVDLevel_2V8: PVD detection level set to 2.8V\r
164   *     @arg PWR_PVDLevel_2V9: PVD detection level set to 2.9V\r
165   * @retval None\r
166   */\r
167 void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)\r
168 {\r
169   uint32_t tmpreg = 0;\r
170   /* Check the parameters */\r
171   assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel));\r
172   tmpreg = PWR->CR;\r
173   /* Clear PLS[7:5] bits */\r
174   tmpreg &= CR_PLS_Mask;\r
175   /* Set PLS[7:5] bits according to PWR_PVDLevel value */\r
176   tmpreg |= PWR_PVDLevel;\r
177   /* Store the new value */\r
178   PWR->CR = tmpreg;\r
179 }\r
180 \r
181 /**\r
182   * @brief  Enables or disables the WakeUp Pin functionality.\r
183   * @param  NewState: new state of the WakeUp Pin functionality.\r
184   *   This parameter can be: ENABLE or DISABLE.\r
185   * @retval None\r
186   */\r
187 void PWR_WakeUpPinCmd(FunctionalState NewState)\r
188 {\r
189   /* Check the parameters */\r
190   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
191   *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState;\r
192 }\r
193 \r
194 /**\r
195   * @brief  Enters STOP mode.\r
196   * @param  PWR_Regulator: specifies the regulator state in STOP mode.\r
197   *   This parameter can be one of the following values:\r
198   *     @arg PWR_Regulator_ON: STOP mode with regulator ON\r
199   *     @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode\r
200   * @param  PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction.\r
201   *   This parameter can be one of the following values:\r
202   *     @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction\r
203   *     @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction\r
204   * @retval None\r
205   */\r
206 void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)\r
207 {\r
208   uint32_t tmpreg = 0;\r
209   /* Check the parameters */\r
210   assert_param(IS_PWR_REGULATOR(PWR_Regulator));\r
211   assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));\r
212   \r
213   /* Select the regulator state in STOP mode ---------------------------------*/\r
214   tmpreg = PWR->CR;\r
215   /* Clear PDDS and LPDS bits */\r
216   tmpreg &= CR_DS_Mask;\r
217   /* Set LPDS bit according to PWR_Regulator value */\r
218   tmpreg |= PWR_Regulator;\r
219   /* Store the new value */\r
220   PWR->CR = tmpreg;\r
221   /* Set SLEEPDEEP bit of Cortex System Control Register */\r
222   *(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;\r
223   \r
224   /* Select STOP mode entry --------------------------------------------------*/\r
225   if(PWR_STOPEntry == PWR_STOPEntry_WFI)\r
226   {   \r
227     /* Request Wait For Interrupt */\r
228     __WFI();\r
229   }\r
230   else\r
231   {\r
232     /* Request Wait For Event */\r
233     __WFE();\r
234   }\r
235   \r
236   /* Reset SLEEPDEEP bit of Cortex System Control Register */\r
237   *(__IO uint32_t *) SCB_SysCtrl &= SysCtrl_SLEEPDEEP_Reset;  \r
238 }\r
239 \r
240 /**\r
241   * @brief  Enters STANDBY mode.\r
242   * @param  None\r
243   * @retval None\r
244   */\r
245 void PWR_EnterSTANDBYMode(void)\r
246 {\r
247   /* Clear Wake-up flag */\r
248   PWR->CR |= CR_CWUF_Set;\r
249   /* Select STANDBY mode */\r
250   PWR->CR |= CR_PDDS_Set;\r
251   /* Set SLEEPDEEP bit of Cortex System Control Register */\r
252   *(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;\r
253 /* This option is used to ensure that store operations are completed */\r
254 #if defined ( __CC_ARM   )\r
255   __force_stores();\r
256 #endif\r
257   /* Request Wait For Interrupt */\r
258   __WFI();\r
259 }\r
260 \r
261 /**\r
262   * @brief  Checks whether the specified PWR flag is set or not.\r
263   * @param  PWR_FLAG: specifies the flag to check.\r
264   *   This parameter can be one of the following values:\r
265   *     @arg PWR_FLAG_WU: Wake Up flag\r
266   *     @arg PWR_FLAG_SB: StandBy flag\r
267   *     @arg PWR_FLAG_PVDO: PVD Output\r
268   * @retval The new state of PWR_FLAG (SET or RESET).\r
269   */\r
270 FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)\r
271 {\r
272   FlagStatus bitstatus = RESET;\r
273   /* Check the parameters */\r
274   assert_param(IS_PWR_GET_FLAG(PWR_FLAG));\r
275   \r
276   if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET)\r
277   {\r
278     bitstatus = SET;\r
279   }\r
280   else\r
281   {\r
282     bitstatus = RESET;\r
283   }\r
284   /* Return the flag status */\r
285   return bitstatus;\r
286 }\r
287 \r
288 /**\r
289   * @brief  Clears the PWR's pending flags.\r
290   * @param  PWR_FLAG: specifies the flag to clear.\r
291   *   This parameter can be one of the following values:\r
292   *     @arg PWR_FLAG_WU: Wake Up flag\r
293   *     @arg PWR_FLAG_SB: StandBy flag\r
294   * @retval None\r
295   */\r
296 void PWR_ClearFlag(uint32_t PWR_FLAG)\r
297 {\r
298   /* Check the parameters */\r
299   assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG));\r
300          \r
301   PWR->CR |=  PWR_FLAG << 2;\r
302 }\r
303 \r
304 /**\r
305   * @}\r
306   */\r
307 \r
308 /**\r
309   * @}\r
310   */\r
311 \r
312 /**\r
313   * @}\r
314   */\r
315 \r
316 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r