123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- /********************************** (C) COPYRIGHT *******************************
- * File Name : CH57x_pwr.c
- * Author : WCH
- * Version : V1.0
- * Date : 2018/12/15
- * Description
- *******************************************************************************/
- #include "CH57x_common.h"
- /*******************************************************************************
- * Function Name : PWR_DCDCCfg
- * Description : 启用内部DC/DC电源,用于节约系统功耗
- * Input : s:
- ENABLE - 打开DCDC电源
- DISABLE - 关闭DCDC电源
- * Return : None
- *******************************************************************************/
- void PWR_DCDCCfg( UINT8 s )
- {
- if(s == DISABLE)
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R16_POWER_PLAN &= ~(RB_PWR_DCDC_EN|RB_PWR_DCDC_PRE); // 旁路 DC/DC
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;
- }
- else
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R16_POWER_PLAN |= RB_PWR_DCDC_PRE;
- DelayUs(10);
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R16_POWER_PLAN |= RB_PWR_DCDC_EN;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;
- }
- }
- /*******************************************************************************
- * Function Name : PWR_UnitModCfg
- * Description : 可控单元模块的电源控制
- * Input : s:
- ENABLE - 打开
- DISABLE - 关闭
- unit:
- please refer to unit of controllable power supply
- * Return : None
- *******************************************************************************/
- void PWR_UnitModCfg( UINT8 s, UINT8 unit )
- {
- if(s == DISABLE) //关闭
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- if(unit&UNIT_ETH_PHY) R8_SLP_POWER_CTRL |= RB_SLP_ETH_PWR_DN;
- R8_HFCK_PWR_CTRL &= ~(unit&0x1c);
- R8_CK32K_CONFIG &= ~(unit&0x03);
- }
- else //打开
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- if(unit&UNIT_ETH_PHY) R8_SLP_POWER_CTRL &= ~RB_SLP_ETH_PWR_DN;
- R8_HFCK_PWR_CTRL |= (unit&0x1c);
- R8_CK32K_CONFIG |= (unit&0x03);
- }
- R8_SAFE_ACCESS_SIG = 0;
- }
- /*******************************************************************************
- * Function Name : PWR_PeriphClkCfg
- * Description : 外设时钟控制位
- * Input : s:
- ENABLE - 打开外设时钟
- DISABLE - 关闭外设时钟
- perph:
- please refer to Peripher CLK control bit define
- * Return : None
- *******************************************************************************/
- void PWR_PeriphClkCfg( UINT8 s, UINT16 perph )
- {
- if( s == DISABLE )
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R32_SLEEP_CONTROL |= perph;
- }
- else
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R32_SLEEP_CONTROL &= ~perph;
- }
- R8_SAFE_ACCESS_SIG = 0;
- }
- /*******************************************************************************
- * Function Name : PWR_PeriphWakeUpCfg
- * Description : 睡眠唤醒源配置
- * Input : s:
- ENABLE - 打开此外设睡眠唤醒功能
- DISABLE - 关闭此外设睡眠唤醒功能
- perph:
- RB_SLP_USB_WAKE - USB 为唤醒源
- RB_SLP_ETH_WAKE - ETH 为唤醒源
- RB_SLP_RTC_WAKE - RTC 为唤醒源
- RB_SLP_GPIO_WAKE - GPIO 为唤醒源
- RB_SLP_BAT_WAKE - BAT 为唤醒源
- ALL - 以上所有
- * Return : None
- *******************************************************************************/
- void PWR_PeriphWakeUpCfg( UINT8 s, UINT16 perph )
- {
- if( s == DISABLE )
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R8_SLP_WAKE_CTRL &= ~perph;
- }
- else
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R8_SLP_WAKE_CTRL |= perph;
- }
- R8_SAFE_ACCESS_SIG = 0;
- }
- /*******************************************************************************
- * Function Name : PowerMonitor
- * Description : 电源监控
- * Input : s:
- ENABLE - 打开此功能
- DISABLE - 关闭此功能
- * Return : None
- *******************************************************************************/
- void PowerMonitor( UINT8 s )
- {
- if( s == DISABLE )
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R8_BAT_DET_CTRL = 0;
- R8_SAFE_ACCESS_SIG = 0;
- }
- else
- {
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R8_BAT_DET_CFG = 1; // 2.05V - 2.33V
- R8_BAT_DET_CTRL = RB_BAT_DET_EN;
- R8_SAFE_ACCESS_SIG = 0;
- mDelayuS(1);
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R8_BAT_DET_CTRL = RB_BAT_LOW_IE|RB_BAT_LOWER_IE|RB_BAT_DET_EN;
- R8_SAFE_ACCESS_SIG = 0;
- }
- }
- /*******************************************************************************
- * Function Name : LowPower_Idle
- * Description : 低功耗-Idle模式
- * Input : None
- * Return : None
- *******************************************************************************/
- void LowPower_Idle( void )
- {
- SCB -> SCR &= ~SCB_SCR_SLEEPDEEP_Msk; // sleep
- __WFI();
- }
- /*******************************************************************************
- * Function Name : EnterCodeUpgrade
- * Description : 跳入BOOT程序,准备代码升级
- * Input : None
- * Return : None
- *******************************************************************************/
- void EnterCodeUpgrade( void )
- {
- /* RTC wakeup */
- UINT32 t;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE;
- R16_POWER_PLAN = RB_PWR_PLAN_EN \
- |RB_PWR_MUST_0010;
- R8_SAFE_ACCESS_SIG = 0;
- do{
- t = R32_RTC_CNT_32K;
- }while( t != R32_RTC_CNT_32K );
- t = t + 10;
- if( t>0xA8C00000 ) t -= 0xA8C00000;
- if( t&0xFFFF ) t = t+0x10000;
- R8_RTC_FLAG_CTRL = RB_RTC_TRIG_CLR|RB_RTC_TMR_CLR;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R32_RTC_TRIG = t;
- R8_RTC_MODE_CTRL = 0x2f; // 进入boot下载必要条件
- R8_SAFE_ACCESS_SIG = 0;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
- R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
- R16_CLK_SYS_CFG = 5; // 降频 HSI/5=6.4M
- R8_SAFE_ACCESS_SIG = 0;
- /* ready to BOOT */
- __SEV();
- __WFE();
- __WFE();
- while(1);
- }
|