1 /**
2 *********************************************************************************
3 *
4 * @file ald_pmu.c
5 * @brief PMU module driver.
6 *
7 * @version V1.0
8 * @date 04 Dec 2017
9 * @author AE Team
10 * @note
11 *
12 * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
13 *
14 * SPDX-License-Identifier: Apache-2.0
15 *
16 * Licensed under the Apache License, Version 2.0 (the License); you may
17 * not use this file except in compliance with the License.
18 * You may obtain a copy of the License at
19 *
20 * www.apache.org/licenses/LICENSE-2.0
21 *
22 * Unless required by applicable law or agreed to in writing, software
23 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
24 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25 * See the License for the specific language governing permissions and
26 * limitations under the License.
27 *
28 *********************************************************************************
29 */
30
31 #include "ald_pmu.h"
32
33
34 /** @addtogroup ES32FXXX_ALD
35 * @{
36 */
37
38 /** @defgroup PMU PMU
39 * @brief PMU module driver
40 * @{
41 */
42 #ifdef ALD_PMU
43
44
45 /** @defgroup PMU_Private_Functions PMU Private Functions
46 * @{
47 */
48
49 /**
50 * @brief PMU module interrupt handler
51 * @retval None
52 */
ald_lvd_irq_handler(void)53 void ald_lvd_irq_handler(void)
54 {
55 SYSCFG_UNLOCK();
56 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDCIF_MSK);
57 SYSCFG_LOCK();
58
59 return;
60 }
61 /**
62 * @}
63 */
64
65 /** @defgroup PMU_Public_Functions PMU Public Functions
66 * @{
67 */
68
69 /** @addtogroup PMU_Public_Functions_Group1 Low Power Mode
70 * @brief Low power mode select functions
71 *
72 * @verbatim
73 ==============================================================================
74 ##### Low power mode select functions #####
75 ==============================================================================
76 [..] This section provides functions allowing to:
77 (+) Enter stop1 mode.
78 (+) Enter stop2 mode.
79 (+) Enter standby mode.
80 (+) Get wakeup status.
81 (+) Clear wakeup status.
82
83 @endverbatim
84 * @{
85 */
86
87 /**
88 * @brief Enter stop1 mode
89 * @retval None
90 */
ald_pmu_stop1_enter(void)91 void ald_pmu_stop1_enter(void)
92 {
93 SYSCFG_UNLOCK();
94 MODIFY_REG(PMU->CR, PMU_CR_LPM_MSK, PMU_LP_STOP1 << PMU_CR_LPM_POSS);
95 SYSCFG_LOCK();
96
97 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
98 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
99 __WFI();
100 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
101
102 return;
103 }
104
105 /**
106 * @brief Enter stop2 mode
107 * @retval None
108 */
ald_pmu_stop2_enter(void)109 void ald_pmu_stop2_enter(void)
110 {
111 SYSCFG_UNLOCK();
112 SET_BIT(PMU->CR, PMU_CR_LPSTOP_MSK);
113 MODIFY_REG(PMU->CR, PMU_CR_LPM_MSK, PMU_LP_STOP2 << PMU_CR_LPM_POSS);
114 SYSCFG_LOCK();
115
116 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
117 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
118 __WFI();
119 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
120
121 return;
122 }
123
124 /**
125 * @brief Enter standby mode
126 * @param port: The port whick wake up the standby mode.
127 * @param level: Wakeup level.
128 * @retval None
129 */
ald_pmu_standby_enter(bkpc_wakeup_port_t port,bkpc_wakeup_level_t level)130 void ald_pmu_standby_enter(bkpc_wakeup_port_t port, bkpc_wakeup_level_t level)
131 {
132 ald_bkpc_standby_wakeup_config(port, level);
133
134 SYSCFG_UNLOCK();
135 SET_BIT(PMU->CR, PMU_CR_LPSTOP_MSK);
136 MODIFY_REG(PMU->CR, PMU_CR_LPM_MSK, PMU_LP_STANDBY << PMU_CR_LPM_POSS);
137 SYSCFG_LOCK();
138
139 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
140 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
141 __WFI();
142 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
143
144 return;
145 }
146
147 /**
148 * @brief Get wakup status.
149 * @param sr: Status bit.
150 * @retval Status.
151 */
ald_pmu_get_status(pmu_status_t sr)152 flag_status_t ald_pmu_get_status(pmu_status_t sr)
153 {
154 assert_param(IS_PMU_STATUS(sr));
155
156 if (READ_BIT(PMU->SR, sr))
157 return SET;
158
159 return RESET;
160 }
161
162 /**
163 * @brief Clear wakup status.
164 * @param sr: Status bit.
165 * @retval None
166 */
ald_pmu_clear_status(pmu_status_t sr)167 void ald_pmu_clear_status(pmu_status_t sr)
168 {
169 assert_param(IS_PMU_STATUS(sr));
170 SYSCFG_UNLOCK();
171
172 if (sr == PMU_SR_WUF)
173 SET_BIT(PMU->CR, PMU_CR_CWUF_MSK);
174 else
175 SET_BIT(PMU->CR, PMU_CR_CSTANDBYF_MSK);
176
177 SYSCFG_LOCK();
178 return;
179 }
180 /**
181 * @}
182 */
183
184 /** @addtogroup PMU_Public_Functions_Group2 LVD Configure
185 * @brief LVD configure functions
186 *
187 * @verbatim
188 ==============================================================================
189 ##### LVD configure functions #####
190 ==============================================================================
191 [..] This section provides functions allowing to:
192 (+) Configure lvd parameters.
193 (+) Interrupt callback function.
194
195 @endverbatim
196 * @{
197 */
198
199 /**
200 * @brief Configure lvd using specified parameters.
201 * @param sel: LVD threshold voltage.
202 * @param mode: LVD trigger mode.
203 * @param state: New state, ENABLE/DISABLE;
204 * @retval None
205 */
ald_pmu_lvd_config(pmu_lvd_voltage_sel_t sel,pmu_lvd_trigger_mode_t mode,type_func_t state)206 void ald_pmu_lvd_config(pmu_lvd_voltage_sel_t sel, pmu_lvd_trigger_mode_t mode, type_func_t state)
207 {
208 assert_param(IS_FUNC_STATE(state));
209 SYSCFG_UNLOCK();
210
211 if (state) {
212 assert_param(IS_PMU_LVD_VOL_SEL(sel));
213 assert_param(IS_PMU_LVD_TRIGGER_MODE(mode));
214
215 MODIFY_REG(PMU->LVDCR, PMU_LVDCR_LVDS_MSK, sel << PMU_LVDCR_LVDS_POSS);
216 MODIFY_REG(PMU->LVDCR, PMU_LVDCR_LVIFS_MSK, mode << PMU_LVDCR_LVIFS_POSS);
217 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDFLT_MSK);
218 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDCIF_MSK);
219 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDIE_MSK);
220 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDEN_MSK);
221 }
222 else {
223 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDCIF_MSK);
224 CLEAR_BIT(PMU->LVDCR, PMU_LVDCR_LVDIE_MSK);
225 CLEAR_BIT(PMU->LVDCR, PMU_LVDCR_LVDEN_MSK);
226 }
227
228 SYSCFG_LOCK();
229 return;
230 }
231 /**
232 * @}
233 */
234 /**
235 * @}
236 */
237 #endif /* ALD_PMU */
238 /**
239 * @}
240 */
241 /**
242 * @}
243 */
244