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