rt-thread-official/bsp/wch/arm/ch579m/libraries/StdPeriphDriver/CH57x_pwr.c

224 lines
7.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************** (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);
}