/********************************** (C) COPYRIGHT *******************************
 * File Name          : RTC.c
 * Author             : WCH
 * Version            : V1.2
 * Date               : 2022/01/18
 * Description        : RTC configuration and its initialization
 *********************************************************************************
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * Attention: This software (modified or not) and binary are used for 
 * microcontroller manufactured by Nanjing Qinheng Microelectronics.
 *******************************************************************************/

/******************************************************************************/
/* Header file contains */
#include "HAL.h"

/*********************************************************************
 * CONSTANTS
 */
#define RTC_INIT_TIME_HOUR      0
#define RTC_INIT_TIME_MINUTE    0
#define RTC_INIT_TIME_SECEND    0

/***************************************************
 * Global variables
 */
volatile uint32_t RTCTigFlag;

/*******************************************************************************
 * @fn      RTC_SetTignTime
 *
 * @brief   Configure RTC trigger time
 *
 * @param   time    - Trigger time.
 *
 * @return  None.
 */
void RTC_SetTignTime(uint32_t time)
{
    RTC_WaitForLastTask();
    RTC_SetAlarm(time);
    RTC_WaitForLastTask();
    RTCTigFlag = 0;
}

/*******************************************************************************
 * @fn      HAL_Time0Init
 *
 * @brief   System timer initialization
 *
 * @param   None.
 *
 * @return  None.
 */
void HAL_TimeInit(void)
{
    uint16_t temp=0;
    uint8_t state=0;
    bleClockConfig_t  conf={0};

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);
#if( CLK_OSC32K )
    RCC_LSICmd(ENABLE);
    RCC_LSEConfig(RCC_LSE_OFF);
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
#else
    RCC_LSEConfig(RCC_LSE_ON);
    /* Check the specified RCC logo position settings or not, 
     * wait for the low-speed crystal oscillator to be ready */
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) 
    {
        temp++;
        Delay_Ms(10);
    }
    if(temp>=250)
    {
        printf("time error..\n");
    }
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
#endif
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForLastTask();
    RTC_WaitForLastTask();
    RTC_SetPrescaler(1);
    RTC_WaitForLastTask();
    RTC_SetCounter(0);
    RTC_WaitForLastTask();
#if( CLK_OSC32K )
    Lib_Calibration_LSI();
#endif
    conf.ClockAccuracy = CLK_OSC32K?1000:100;
    conf.ClockFrequency = CAB_LSIFQ/2;
    conf.ClockMaxCount = 0xFFFFFFFF;
    conf.getClockValue = RTC_GetCounter;
    state = TMOS_TimerInit( &conf );
    if(state)
    {
        PRINT("TMOS_TimerInit err %x\n",state);
    }
}


__attribute__((interrupt("WCH-Interrupt-fast")))
void RTCAlarm_IRQHandler(void)
{
    RTCTigFlag = 1;
    EXTI_ClearITPendingBit(EXTI_Line17);
    RTC_ClearITPendingBit(RTC_IT_ALR);
    RTC_WaitForLastTask();
}

/******************************** endfile @ time ******************************/
