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)18void 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)58void 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)94void 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)144void 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)199void 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