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)20void 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)52void 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)83void 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)115void 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)140void 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)170void 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)182void 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