/*
  ******************************************************************************
  * Copyright (c)  2008 - 2022, Shanghai AisinoChip Co.,Ltd .
  * @file    APP.c 
  * @version V1.0.0
  * @date    2022
  * @author  Aisinochip Firmware Team  
  * @brief   Standby Mode demo source code.
  ******************************************************************************        
*/
#include "APP.h"

GPIO_InitTypeDef GPIOA_Handle;


void GPIO_Turn()  /* 翻转PA1，起到延时作用 */
{
    uint32_t i;
    GPIOA_Handle.Pin       = GPIO_PIN_1 ;
    GPIOA_Handle.Mode      = GPIO_MODE_OUTPUT_PP;
    GPIOA_Handle.Pull      = GPIO_PULLUP;
    GPIOA_Handle.Alternate = GPIO_FUNCTION_0;

    HAL_GPIO_Init(GPIOA, &GPIOA_Handle);

    for(i = 0; i < 100 * 5000; i++)
    {   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1 , GPIO_PIN_SET);

        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1 , GPIO_PIN_CLEAR);
    }
}

/*********************************************************************************
* 函数名 :  Enter_LowPower_Standby
* 功  能 :  Standby & 模拟模块各IP 功耗
* 说  明 :  
* 入  参 :  
* 返  回 :  
**********************************************************************************/
void Enter_LowPower_Standby(void)
{
    HAL_RTC_PCLK_ENABLE();
	/*----------------进standy模式前设置-------------*/
    /* 所有IO配置位模拟 */
    SCU->PABADS= 0xFFFFFFFF;
    SCU->PCDADS  = 0xFFFFFFFF;

	/*时钟切换到RC*/
	SCU->CCR1 =SYS_CLK_SRC_RCH;
    /* 关闭XTH、XTL、RC4M、32K 时钟  */
    SCU->RCHCR&= ~(1 << 16);    // RC4M Disable
    SCU->XTHCR &= ~(1 <<  0);    // XTH  Disable

    SCU->STOPCFG   |=  (1 << 0);    // RTC域写使能
    PMU->ANACR &= ~(1 << 0);    // XTL   Disable
    PMU->ANACR &= ~(1 << 8);    // RC32K Disable

    /* RTCCLK Disable */
    PMU->CR1 &= ~(1 << 5);

    /* 进入Standby模式 */
    SCU->STOPCFG |= (1 << 11);//PDDS  DeepSleep 下进入 STANDBY 模式，主区断电
    /* 清标志，允许进入Standby */
    PMU->CR1  |= (6 << 9) | (1 << 8) | (1 << 0);
	
    /* PC13唤醒 */
    PMU->CR1 |= 1 << 17;//WKUP6~2 管脚唤醒功能使能 
    PMU->CR1 |= 1 <<  1;//1：清除唤醒标志

    /* 默认下拉，上升沿唤醒 */ 
	PMU->IOCR  &= ~(1 << 6);   //配置为数字接口
    PMU->IOCR  &= ~(1 << 0);
    PMU->IOCR  |= 1 << 1;
 
    /* LVD Disable */
    SCU->LVDCFG &= ~(1 << 0);

    /* All Clock Disable */
    SCU->CLKOCR &= ~(1ul << 31);    // Buzzer2 Disable
    SCU->CLKOCR &= ~(1ul << 23);    // Buzzer1 Disable
	
	/*-----------进standy模式,等待唤醒--------*/
	System_Enter_Standby_Mode();

}
/*********************************************************************************
* Function    : APP_Power_Standby_Test
* Description : 
* Input       : None
* Output      : None
**********************************************************************************/
void APP_Power_Standby_Test(void)
{
    GPIO_Turn();   //IO翻转，相当于延时(唤醒后会重新运行)
    
    printfS("MCU enter standby mode, MCU will wakeup by PC13 rising edge!\n");
    
    Enter_LowPower_Standby();
      
}
