Files
ch32v20x-examples/EVT/EXAM/BLE/HAL/SLEEP.c
T
2023-09-06 10:08:11 +08:00

108 lines
3.2 KiB
C

/********************************** (C) COPYRIGHT *******************************
* File Name : SLEEP.c
* Author : WCH
* Version : V1.2
* Date : 2022/01/18
* Description : Sleep 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"
#define US_TO_TICK(us) (uint32_t)((us) / (1000000 / ((CAB_LSIFQ / 2))))
#define SLEEP_PERIOD_MIN_US 200
#define SLEEP_PERIOD_MAX_TICK 0xFFD2393F
#define SLEEP_PERIOD_MIN_TICK US_TO_TICK(SLEEP_PERIOD_MIN_US)
#define HESREADY_TICK US_TO_TICK(WAKE_UP_MAX_TIME_US)
/*******************************************************************************
* @fn BLE_LowPower
*
* @brief 启动睡眠
*
* @param time - 唤醒的时间点(RTC绝对值)
*
* @return state.
*/
uint32_t BLE_LowPower(uint32_t time)
{
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
uint32_t current_time;
uint32_t sleep_period;
uint32_t wake_time;
wake_time = time - HESREADY_TICK;
__disable_irq();
current_time = RTC_GetCounter();
sleep_period = wake_time - current_time;
if((sleep_period < SLEEP_PERIOD_MIN_TICK) || (sleep_period > SLEEP_PERIOD_MAX_TICK))
{
__enable_irq();
return 2;
}
RTC_SetTignTime(wake_time);
__enable_irq();
#if(DEBUG == DEBUG_UART1) // To use other serial ports to output printing information, you need to modify this line of code
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
__NOP();
}
#endif
// LOW POWER-sleep
if(!RTCTigFlag)
{
PWR_EnterSTOPMode_RAM_LV(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
SystemInit();
}
else
{
return 3;
}
#endif
return 0;
}
/*******************************************************************************
* @fn HAL_SleepInit
*
* @brief Configure sleep Wake-up source - RTC wake up, trigger mode
*
* @param None.
*
* @return None.
*/
void HAL_SleepInit(void)
{
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR, ENABLE);
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
}