1 /********************************** (C) COPYRIGHT *******************************
2 * File Name          : CH57x_pwr.c
3 * Author             : WCH
4 * Version            : V1.0
5 * Date               : 2018/12/15
6 * Description
7 *******************************************************************************/
8 
9 #include "CH57x_common.h"
10 
11 
12 /*******************************************************************************
13 * Function Name  : PWR_DCDCCfg
14 * Description    : 启用内部DC/DC电源,用于节约系统功耗
15 * Input          : s:
16                     ENABLE  - 打开DCDC电源
17                     DISABLE - 关闭DCDC电源
18 * Return         : None
19 *******************************************************************************/
PWR_DCDCCfg(UINT8 s)20 void PWR_DCDCCfg( UINT8 s )
21 {
22     if(s == DISABLE)
23     {
24         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
25         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
26         R16_POWER_PLAN &= ~(RB_PWR_DCDC_EN|RB_PWR_DCDC_PRE);        // 旁路 DC/DC
27         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;
28     }
29     else
30     {
31         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
32         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
33         R16_POWER_PLAN |= RB_PWR_DCDC_PRE;
34         DelayUs(10);
35         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
36         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
37         R16_POWER_PLAN |= RB_PWR_DCDC_EN;
38         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;
39     }
40 }
41 
42 /*******************************************************************************
43 * Function Name  : PWR_UnitModCfg
44 * Description    : 可控单元模块的电源控制
45 * Input          : s:
46                     ENABLE  - 打开
47                     DISABLE - 关闭
48                    unit:
49                     please refer to unit of controllable power supply
50 * Return         : None
51 *******************************************************************************/
PWR_UnitModCfg(UINT8 s,UINT8 unit)52 void PWR_UnitModCfg( UINT8 s, UINT8 unit )
53 {
54     if(s == DISABLE)        //关闭
55     {
56         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
57         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
58         if(unit&UNIT_ETH_PHY)       R8_SLP_POWER_CTRL |= RB_SLP_ETH_PWR_DN;
59         R8_HFCK_PWR_CTRL &= ~(unit&0x1c);
60         R8_CK32K_CONFIG &= ~(unit&0x03);
61     }
62     else                    //打开
63     {
64         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
65         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
66         if(unit&UNIT_ETH_PHY)       R8_SLP_POWER_CTRL &= ~RB_SLP_ETH_PWR_DN;
67         R8_HFCK_PWR_CTRL |= (unit&0x1c);
68         R8_CK32K_CONFIG |= (unit&0x03);
69     }
70     R8_SAFE_ACCESS_SIG = 0;
71 }
72 
73 /*******************************************************************************
74 * Function Name  : PWR_PeriphClkCfg
75 * Description    : 外设时钟控制位
76 * Input          : s:
77                     ENABLE  - 打开外设时钟
78                     DISABLE - 关闭外设时钟
79                    perph:
80                     please refer to Peripher CLK control bit define
81 * Return         : None
82 *******************************************************************************/
PWR_PeriphClkCfg(UINT8 s,UINT16 perph)83 void PWR_PeriphClkCfg( UINT8 s, UINT16 perph )
84 {
85     if( s == DISABLE )
86     {
87         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
88         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
89         R32_SLEEP_CONTROL |= perph;
90     }
91     else
92     {
93         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
94         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
95         R32_SLEEP_CONTROL &= ~perph;
96     }
97     R8_SAFE_ACCESS_SIG = 0;
98 }
99 
100 /*******************************************************************************
101 * Function Name  : PWR_PeriphWakeUpCfg
102 * Description    : 睡眠唤醒源配置
103 * Input          : s:
104                     ENABLE  - 打开此外设睡眠唤醒功能
105                     DISABLE - 关闭此外设睡眠唤醒功能
106                    perph:
107                     RB_SLP_USB_WAKE     -  USB 为唤醒源
108                     RB_SLP_ETH_WAKE     -  ETH 为唤醒源
109                     RB_SLP_RTC_WAKE     -  RTC 为唤醒源
110                     RB_SLP_GPIO_WAKE    -  GPIO 为唤醒源
111                     RB_SLP_BAT_WAKE     -  BAT 为唤醒源
112                     ALL     -  以上所有
113 * Return         : None
114 *******************************************************************************/
PWR_PeriphWakeUpCfg(UINT8 s,UINT16 perph)115 void PWR_PeriphWakeUpCfg( UINT8 s, UINT16 perph )
116 {
117     if( s == DISABLE )
118     {
119         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
120         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
121         R8_SLP_WAKE_CTRL &= ~perph;
122     }
123     else
124     {
125         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
126         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
127         R8_SLP_WAKE_CTRL |= perph;
128     }
129     R8_SAFE_ACCESS_SIG = 0;
130 }
131 
132 /*******************************************************************************
133 * Function Name  : PowerMonitor
134 * Description    : 电源监控
135 * Input          : s:
136                     ENABLE  - 打开此功能
137                     DISABLE - 关闭此功能
138 * Return         : None
139 *******************************************************************************/
PowerMonitor(UINT8 s)140 void PowerMonitor( UINT8 s )
141 {
142     if( s == DISABLE )
143     {
144         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
145         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
146         R8_BAT_DET_CTRL = 0;
147         R8_SAFE_ACCESS_SIG = 0;
148     }
149     else
150     {
151         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
152         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
153         R8_BAT_DET_CFG = 1;                     // 2.05V - 2.33V
154         R8_BAT_DET_CTRL = RB_BAT_DET_EN;
155         R8_SAFE_ACCESS_SIG = 0;
156         mDelayuS(1);
157         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
158         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
159         R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
160         R8_SAFE_ACCESS_SIG = 0;
161     }
162 }
163 
164 /*******************************************************************************
165 * Function Name  : LowPower_Idle
166 * Description    : 低功耗-Idle模式
167 * Input          : None
168 * Return         : None
169 *******************************************************************************/
LowPower_Idle(void)170 void LowPower_Idle( void )
171 {
172     SCB -> SCR &= ~SCB_SCR_SLEEPDEEP_Msk;               // sleep
173     __WFI();
174 }
175 
176 /*******************************************************************************
177 * Function Name  : EnterCodeUpgrade
178 * Description    : 跳入BOOT程序,准备代码升级
179 * Input          : None
180 * Return         : None
181 *******************************************************************************/
EnterCodeUpgrade(void)182 void EnterCodeUpgrade( void )
183 {
184 /* RTC wakeup */
185     UINT32 t;
186 
187     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
188     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
189     R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE;
190     R16_POWER_PLAN = RB_PWR_PLAN_EN         \
191                     |RB_PWR_MUST_0010;
192     R8_SAFE_ACCESS_SIG = 0;
193 
194     do{
195         t = R32_RTC_CNT_32K;
196     }while( t != R32_RTC_CNT_32K );
197 
198     t = t + 10;
199     if( t>0xA8C00000 )  t -= 0xA8C00000;
200     if( t&0xFFFF )  t = t+0x10000;
201 
202     R8_RTC_FLAG_CTRL = RB_RTC_TRIG_CLR|RB_RTC_TMR_CLR;
203     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
204     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
205     R32_RTC_TRIG = t;
206     R8_RTC_MODE_CTRL = 0x2f;    // 进入boot下载必要条件
207     R8_SAFE_ACCESS_SIG = 0;
208 
209     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
210     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
211     R16_CLK_SYS_CFG = 5;                // 降频 HSI/5=6.4M
212     R8_SAFE_ACCESS_SIG = 0;
213 
214 /* ready to BOOT */
215     __SEV();
216     __WFE();
217     __WFE();
218     while(1);
219 }
220 
221 
222 
223 
224