1 /**
2 *********************************************************************************
3 *
4 * @file ald_pmu.c
5 * @brief PMU module driver.
6 *
7 * @version V1.0
8 * @date 08 Mar. 2023
9 * @author AE Team
10 * @note
11 * Change Logs:
12 * Date Author Notes
13 * 08 Mar. 2023 Lisq The first version
14 *
15 * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
16 *
17 * SPDX-License-Identifier: Apache-2.0
18 *
19 * Licensed under the Apache License, Version 2.0 (the License); you may
20 * not use this file except in compliance with the License.
21 * You may obtain a copy of the License at
22 *
23 * www.apache.org/licenses/LICENSE-2.0
24 *
25 * Unless required by applicable law or agreed to in writing, software
26 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
27 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28 * See the License for the specific language governing permissions and
29 * limitations under the License.
30 **********************************************************************************
31 */
32
33 #include "ald_pmu.h"
34
35 /** @addtogroup ES32VF2264_ALD
36 * @{
37 */
38
39 /** @defgroup PMU PMU
40 * @brief PMU module driver
41 * @{
42 */
43 /** @defgroup PMU_Private_Functions PMU Private Functions
44 * @{
45 */
46
47 /**
48 * @brief PMU module interrupt handler
49 * @retval None
50 */
ald_lvd_irq_handler(void)51 void ald_lvd_irq_handler(void)
52 {
53 SYSCFG_UNLOCK();
54 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDCIF_MSK);
55 SYSCFG_LOCK();
56
57 return;
58 }
59 /**
60 * @}
61 */
62
63 /** @defgroup PMU_Public_Functions PMU Public Functions
64 * @{
65 */
66
67 /** @addtogroup PMU_Public_Functions_Group1 Low Power Mode
68 * @brief Low power mode select functions
69 *
70 * @verbatim
71 ==============================================================================
72 ##### Low power mode select functions #####
73 ==============================================================================
74 [..] This section provides functions allowing to:
75 (+) Get wakeup status.
76 (+) Clear wakeup status.
77
78 @endverbatim
79 * @{
80 */
81
82 /**
83 * @brief Get wakup status.
84 * @param sr: Status bit.
85 * @retval Status.
86 */
ald_pmu_get_status(ald_pmu_status_t sr)87 flag_status_t ald_pmu_get_status(ald_pmu_status_t sr)
88 {
89 assert_param(IS_PMU_STATUS(sr));
90
91 if (READ_BIT(PMU->SR, sr))
92 return SET;
93
94 return RESET;
95 }
96
97 /**
98 * @brief Clear wakup status.
99 * @param sr: Status bit.
100 * @retval None
101 */
ald_pmu_clear_status(ald_pmu_status_t sr)102 void ald_pmu_clear_status(ald_pmu_status_t sr)
103 {
104 assert_param(IS_PMU_STATUS(sr));
105 SYSCFG_UNLOCK();
106
107 if (sr == ALD_PMU_SR_WUF)
108 SET_BIT(PMU->CR, PMU_CR_CWUF_MSK);
109 else
110 ;/* do nothing */
111
112 SYSCFG_LOCK();
113 return;
114 }
115
116 /**
117 * @}
118 */
119
120 /**
121 * @brief Enter stop mode
122 * @retval None
123 */
ald_pmu_stop_enter(void)124 void ald_pmu_stop_enter(void)
125 {
126 SYSCFG_UNLOCK();
127 MODIFY_REG(PMU->CR, PMU_CR_LPM_MSK, ALD_PMU_LP_STOP << PMU_CR_LPM_POSS);
128 CLEAR_BIT(PMU->CR, PMU_CR_VROSCEN_MSK);
129 MODIFY_REG(PMU->CR, PMU_CR_LPSTOP_MSK | PMU_CR_BGSTOP_MSK | \
130 PMU_CR_STPRTNEN_MSK | PMU_CR_FSTOP_MSK, \
131 1 << PMU_CR_LPSTOP_POS | 1 << PMU_CR_BGSTOP_POS \
132 | 1 << PMU_CR_STPRTNEN_POS | 1 << PMU_CR_FSTOP_POS);
133 /* WKEVNSEL is only for testing, and user should set it to be 0x10. */
134 MODIFY_REG(PMU->CR, PMU_CR_WKEVNSEL_MSK, (0x10 << PMU_CR_WKEVNSEL_POSS));
135 SYSCFG_LOCK();
136
137 csi_cpu_sleep_wfi(MEXSTATUS_SLEEP_DEEP);
138
139 __WFI();
140 }
141
142 /**
143 * @brief Enter sleep mode
144 * @retval None
145 */
ald_pmu_sleep_enter(void)146 void ald_pmu_sleep_enter(void)
147 {
148 SYSCFG_UNLOCK();
149 MODIFY_REG(PMU->CR, PMU_CR_LPM_MSK, ALD_PMU_LP_STOP << PMU_CR_LPM_POSS);
150 /* WKEVNSEL is only for testing, and user should set it to be 0x10. */
151 MODIFY_REG(PMU->CR, PMU_CR_WKEVNSEL_MSK, (0x10 << PMU_CR_WKEVNSEL_POSS));
152 SYSCFG_LOCK();
153
154 csi_cpu_sleep_wfi(MEXSTATUS_SLEEP_LIGHT);
155
156 __WFI();
157 }
158
159 /** @addtogroup PMU_Public_Functions_Group2 LVD Configure
160 * @brief LVD configure functions
161 *
162 * @verbatim
163 ==============================================================================
164 ##### LVD configure functions #####
165 ==============================================================================
166 [..] This section provides functions allowing to:
167 (+) Configure lvd parameters.
168
169 @endverbatim
170 * @{
171 */
172
173 /**
174 * @brief Configure lvd using specified parameters.
175 * @param sel: LVD threshold voltage.
176 * @param mode: LVD trigger mode.
177 * @param state: New state, ENABLE/DISABLE;
178 * @retval None
179 */
ald_pmu_lvd_config(ald_pmu_lvd_voltage_sel_t sel,ald_pmu_lvd_trigger_mode_t mode,type_func_t state)180 void ald_pmu_lvd_config(ald_pmu_lvd_voltage_sel_t sel, ald_pmu_lvd_trigger_mode_t mode, type_func_t state)
181 {
182 assert_param(IS_FUNC_STATE(state));
183 SYSCFG_UNLOCK();
184
185 if (state) {
186 assert_param(IS_PMU_LVD_VOL_SEL(sel));
187 assert_param(IS_PMU_LVD_TRIGGER_MODE(mode));
188
189 MODIFY_REG(PMU->LVDCR, PMU_LVDCR_LVDS_MSK, sel << PMU_LVDCR_LVDS_POSS);
190 MODIFY_REG(PMU->LVDCR, PMU_LVDCR_LVDIFS_MSK, mode << PMU_LVDCR_LVDIFS_POSS);
191 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDFLT_MSK);
192 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDCIF_MSK);
193 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDIE_MSK);
194 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDEN_MSK);
195 }
196 else {
197 SET_BIT(PMU->LVDCR, PMU_LVDCR_LVDCIF_MSK);
198 CLEAR_BIT(PMU->LVDCR, PMU_LVDCR_LVDIE_MSK);
199 CLEAR_BIT(PMU->LVDCR, PMU_LVDCR_LVDEN_MSK);
200 }
201
202 SYSCFG_LOCK();
203 return;
204 }
205 /**
206 * @}
207 */
208
209
210 /**
211 * @}
212 */
213 /**
214 * @}
215 */
216
217 /**
218 * @}
219 */
220