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