1 /********************************** (C) COPYRIGHT *******************************
2 * File Name          : CH57x_int.c
3 * Author             : WCH
4 * Version            : V1.0
5 * Date               : 2020/03/18
6 * Description
7 *******************************************************************************/
8 
9 #include "CH57x_common.h"
10 
11 /*******************************************************************************
12 * Function Name  : NMI_Handler
13 * Description    : NMI中断函数
14 * Input          : None
15 * Return         : None
16 *******************************************************************************/
17 //__attribute__((section("NMICode")))
NMI_Handler(void)18 void NMI_Handler( void )
19 {
20     UINT32  i=0;
21 
22         if( (R8_HFCK_PWR_CTRL & RB_CLK_INT32M_PON) == 0 )
23         {
24             R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
25                 R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
26                 R8_HFCK_PWR_CTRL |= RB_CLK_INT32M_PON;                          // 打开内部32M
27         }
28     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
29     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
30     R16_CLK_SYS_CFG = 5;                                                                // 降频 HSI/5=6.4M
31     R16_POWER_PLAN &= ~(RB_PWR_DCDC_EN|RB_PWR_DCDC_PRE);        // 旁路 DC/DC
32         R8_HFCK_PWR_CTRL |= RB_CLK_PLL_PON;                                         // 打开PLL
33         R8_SAFE_ACCESS_SIG = 0;
34 
35     while(1)
36     {
37         if(R8_BAT_STATUS & RB_BAT_STAT_LOWER)   i = 0;
38         else i++;
39         if( i>2000 )
40                 {
41                     /* 执行系统复位 */
42                     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
43                     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
44                     R8_RST_WDOG_CTRL = RB_SOFTWARE_RESET;
45                     R8_SAFE_ACCESS_SIG = 0;
46                 }
47     }
48 }
49 
50 /*******************************************************************************
51 * Function Name  : LowPower_Halt_1
52 * Description    : 低功耗-Halt_1模式。
53                    此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
54 * Input          : None
55 * Return         : None
56 *******************************************************************************/
57 //__attribute__((section("NMICode")))
LowPower_Halt_1(void)58 void LowPower_Halt_1( void )
59 {
60     UINT8  x32Kpw, x32Mpw;
61 
62     x32Kpw = R8_XT32K_TUNE;
63     x32Mpw = R8_XT32M_TUNE;
64     x32Mpw = (x32Mpw&0xfc)|0x03;            // 150%额定电流
65     if(R16_RTC_CNT_32K>0x3fff){     // 超过500ms
66         x32Kpw = (x32Kpw&0xfc)|0x01;        // LSE驱动电流降低到额定电流
67     }
68 
69     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
70     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
71     R8_SLP_POWER_CTRL &= ~RB_SLP_ROM_PWR_DN;          // flash待机
72     R8_BAT_DET_CTRL = 0;                              // 关闭电压监控
73     R8_XT32K_TUNE = x32Kpw;
74     R8_XT32M_TUNE = x32Mpw;
75     R16_CLK_SYS_CFG = 5;                // 降频 HSI/5=6.4M
76     R8_SAFE_ACCESS_SIG = 0;
77 
78     SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk;                //deep sleep
79     __WFI();
80     R8_SAFE_ACCESS_SIG = 0;
81 
82     /* 开启电压监控 */
83     PowerMonitor( ENABLE );
84 }
85 
86 /*******************************************************************************
87 * Function Name  : LowPower_Halt_2
88 * Description    : 低功耗-Halt_2模式。
89                    此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
90 * Input          : None
91 * Return         : None
92 *******************************************************************************/
93 //__attribute__((section("NMICode")))
LowPower_Halt_2(void)94 void LowPower_Halt_2( void )
95 {
96     UINT8  x32Kpw, x32Mpw;
97 
98     x32Kpw = R8_XT32K_TUNE;
99     x32Mpw = R8_XT32M_TUNE;
100     x32Mpw = (x32Mpw&0xfc)|0x03;            // 150%额定电流
101     if(R16_RTC_CNT_32K>0x3fff){     // 超过500ms
102         x32Kpw = (x32Kpw&0xfc)|0x01;        // LSE驱动电流降低到额定电流
103     }
104 
105     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
106     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
107     R8_SLP_POWER_CTRL |= RB_SLP_ROM_PWR_DN;           // flash停机
108     R8_BAT_DET_CTRL = 0;                              // 关闭电压监控
109     R8_XT32K_TUNE = x32Kpw;
110     R8_XT32M_TUNE = x32Mpw;
111     R16_CLK_SYS_CFG = 5;                // 降频 HSI/5=6.4M
112     R8_SAFE_ACCESS_SIG = 0;
113 
114     SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk;                //deep sleep
115     __WFI();
116     R8_SAFE_ACCESS_SIG = 0;
117 
118     /* 开启电压监控 */
119         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
120         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
121         R8_BAT_DET_CFG = 1;                     // 2.05V - 2.33V
122         R8_BAT_DET_CTRL = RB_BAT_DET_EN;
123         R8_SAFE_ACCESS_SIG = 0;
124         __nop();    __nop();
125         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
126         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
127         R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
128         R8_SAFE_ACCESS_SIG = 0;
129 }
130 
131 /*******************************************************************************
132 * Function Name  : LowPower_Sleep
133 * Description    : 低功耗-Sleep模式。
134                    此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
135                    注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
136 * Input          : rm:
137                     RB_PWR_RAM2K    -   最后2K SRAM 供电
138                     RB_PWR_RAM14K   -   0x20004000 - 0x20007800 14K SRAM 供电
139                     RB_PWR_EXTEND   -   USB和RF 单元保留区域供电
140                    NULL -   以上单元都断电
141 * Return         : None
142 *******************************************************************************/
143 //__attribute__((section("NMICode")))
LowPower_Sleep(UINT8 rm)144 void LowPower_Sleep( UINT8 rm )
145 {
146     UINT8  x32Kpw, x32Mpw;
147 
148     x32Kpw = R8_XT32K_TUNE;
149     x32Mpw = R8_XT32M_TUNE;
150     x32Mpw = (x32Mpw&0xfc)|0x03;            // 150%额定电流
151     if(R16_RTC_CNT_32K>0x3fff){     // 超过500ms
152         x32Kpw = (x32Kpw&0xfc)|0x01;        // LSE驱动电流降低到额定电流
153     }
154 
155     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
156     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
157     R16_POWER_PLAN = RB_PWR_PLAN_EN         \
158                     |RB_PWR_MUST_0010       \
159                     |RB_PWR_CORE            \
160                     |rm;
161     R8_SAFE_ACCESS_SIG = 0;
162 
163     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
164     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
165     R8_BAT_DET_CTRL = 0;                // 关闭电压监控
166     R8_XT32K_TUNE = x32Kpw;
167     R8_XT32M_TUNE = x32Mpw;
168     R16_CLK_SYS_CFG = 5;                // 降频 HSI/5=6.4M
169     R8_SAFE_ACCESS_SIG = 0;
170 
171     SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk;                //deep sleep
172     __WFI();
173     R8_SAFE_ACCESS_SIG = 0;
174 
175     /* 开启电压监控 */
176         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
177         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
178         R8_BAT_DET_CFG = 1;                     // 2.05V - 2.33V
179         R8_BAT_DET_CTRL = RB_BAT_DET_EN;
180         R8_SAFE_ACCESS_SIG = 0;
181         __nop();    __nop();
182         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
183         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
184         R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
185         R8_SAFE_ACCESS_SIG = 0;
186 }
187 
188 /*******************************************************************************
189 * Function Name  : LowPower_Shutdown
190 * Description    : 低功耗-Shutdown模式。
191                    此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
192                    注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
193 * Input          : rm:
194                     RB_PWR_RAM2K    -   最后2K SRAM 供电
195                    NULL -   以上单元都断电
196 * Return         : None
197 *******************************************************************************/
198 //__attribute__((section("NMICode")))
LowPower_Shutdown(UINT8 rm)199 void LowPower_Shutdown( UINT8 rm )
200 {
201     UINT8  x32Kpw, x32Mpw;
202 
203     x32Kpw = R8_XT32K_TUNE;
204     x32Mpw = R8_XT32M_TUNE;
205     x32Mpw = (x32Mpw&0xfc)|0x03;            // 150%额定电流
206     if(R16_RTC_CNT_32K>0x3fff){     // 超过500ms
207         x32Kpw = (x32Kpw&0xfc)|0x01;        // LSE驱动电流降低到额定电流
208     }
209 
210     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
211     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
212     R16_POWER_PLAN = RB_PWR_PLAN_EN         \
213                     |RB_PWR_MUST_0010       \
214                     |rm;
215     R8_SAFE_ACCESS_SIG = 0;
216 
217     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
218     R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
219     R8_BAT_DET_CTRL = 0;                // 关闭电压监控
220     R8_XT32K_TUNE = x32Kpw;
221     R8_XT32M_TUNE = x32Mpw;
222     R16_CLK_SYS_CFG = 5;                // 降频 HSI/5=6.4M
223     R8_SAFE_ACCESS_SIG = 0;
224 
225     SCB -> SCR |= SCB_SCR_SLEEPDEEP_Msk;                //deep sleep
226     __WFI();
227     R8_SAFE_ACCESS_SIG = 0;
228 
229     /* 开启电压监控 */
230         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
231         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
232         R8_BAT_DET_CFG = 1;                     // 2.05V - 2.33V
233         R8_BAT_DET_CTRL = RB_BAT_DET_EN;
234         R8_SAFE_ACCESS_SIG = 0;
235         __nop();    __nop();
236         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
237         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
238         R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
239     R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
240         R8_SAFE_ACCESS_SIG = 0;
241 }
242 
243