408 lines
12 KiB
C
408 lines
12 KiB
C
/************************************************************************************************/
|
||
/**
|
||
* @file ciu32l051_std_pmu.h
|
||
* @author MCU Ecosystem Development Team
|
||
* @brief PMU STD库驱动头文件。
|
||
* 提供PMU相关STD库操作函数声明、数据类型以及常量的定义。
|
||
*
|
||
*
|
||
**************************************************************************************************
|
||
* @attention
|
||
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
|
||
*
|
||
**************************************************************************************************
|
||
*/
|
||
|
||
/* 避免头文件重复引用 */
|
||
#ifndef CIU32L051_STD_PMU_H
|
||
#define CIU32L051_STD_PMU_H
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @addtogroup CIU32L051_STD_Driver
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @defgroup PMU PMU
|
||
* @brief 电源管理单元的STD库驱动
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*------------------------------------------includes--------------------------------------------*/
|
||
#include "ciu32l051_std_common.h"
|
||
|
||
|
||
/*-----------------------------------------type define------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup PMU_Types PMU Types
|
||
* @brief PMU数据类型定义
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/**
|
||
* @brief PVD参数配置结构体定义
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint32_t level; /**< PVD 电压阈值:
|
||
@arg PMU_PVD_LEVEL_0 ... */
|
||
uint32_t alarm_type; /**< PVD 有效信号边沿报警配置:
|
||
@arg PMU_PVD_RISING ... */
|
||
uint32_t filter_enable; /**< PVD 数字滤波使能:
|
||
@arg PVD_FILTER_TIME_ENABLE
|
||
@arg PVD_FILTER_TIME_DISABLE */
|
||
uint32_t filter_time; /**< PVD 数字滤波时间配置:
|
||
@arg PVD_FILTER_TIME_2PCLK ... */
|
||
}std_pvd_init_t;
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
|
||
/*--------------------------------------------define--------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup PMU_Constants PMU Constants
|
||
* @brief PMU常量定义及宏定义
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/* 寄存器复位值定义 */
|
||
#define PMU_CR3_DEFAULT_VALUE (0x00000000UL) /**< 电源管理控制寄存器3的复位值 */
|
||
#define PMU_CLR_FLAG_VALUE (0x00001000UL) /**< 电源管理状态清除寄存器的复位值 */
|
||
|
||
|
||
/* PVD的电压阈值配置值有关定义 */
|
||
#define PMU_PVD_LEVEL_0 (0x00UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级0: 2.1/2.0V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_1 (0x01UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级1: 2.3/2.2V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_2 (0x02UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级2: 2.5/2.4V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_3 (0x03UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级3: 2.6/2.5V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_4 (0x04UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级4: 2.7/2.6V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_5 (0x05UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级5: 2.9/2.8V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_6 (0x06UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级6: 3.0/2.9V(上升/下降) */
|
||
#define PMU_PVD_LEVEL_7 (0x07UL << PMU_CR2_PVD_LEVEL_POS) /**< PVD阈值等级7: 3.1/3.0V(上升/下降) */
|
||
|
||
/* PVD中断有效信号定义 */
|
||
#define PMU_PVD_RISING (PMU_CR2_RT_EN) /**< 表示当监测电压从低于阈值到高于阈值变化时报警使能 */
|
||
#define PMU_PVD_FALLING (PMU_CR2_FT_EN) /**< 表示当监测电压从高于阈值到低于阈值变化时报警使能 */
|
||
#define PMU_PVD_LOWER_THRESHOLD (PMU_CR2_LT_EN) /**< 表示当监测电压低于阈值报警使能 */
|
||
#define PMU_PVD_HIGHER_THRESHOLD (PMU_CR2_HT_EN) /**< 表示当监测电压高于阈值报警使能 */
|
||
#define PMU_PVD_EDGE_TYPE (PMU_CR2_RT_EN | PMU_CR2_FT_EN | PMU_CR2_LT_EN | PMU_CR2_HT_EN)
|
||
|
||
/* PVD 数字滤波使能定义 */
|
||
#define PVD_FILTER_TIME_DISABLE (0x00000000UL)
|
||
#define PVD_FILTER_TIME_ENABLE (PMU_CR2_FILTER_EN)
|
||
|
||
/* PVD 数字滤波时间定义 */
|
||
#define PVD_FILTER_TIME_2PCLK (0x00UL) /**< PVD检测时信号数字滤波时间为:2*PCLK */
|
||
#define PVD_FILTER_TIME_4PCLK (0x01UL) /**< PVD检测时信号数字滤波时间为:4*PCLK */
|
||
#define PVD_FILTER_TIME_8PCLK (0x02UL) /**< PVD检测时信号数字滤波时间为:8*PCLK */
|
||
#define PVD_FILTER_TIME_16PCLK (0x03UL) /**< PVD检测时信号数字滤波时间为:16*PCLK */
|
||
#define PVD_FILTER_TIME_32PCLK (0x04UL) /**< PVD检测时信号数字滤波时间为:32*PCLK */
|
||
#define PVD_FILTER_TIME_64PCLK (0x05UL) /**< PVD检测时信号数字滤波时间为:64*PCLK */
|
||
#define PVD_FILTER_TIME_128PCLK (0x06UL) /**< PVD检测时信号数字滤波时间为:128*PCLK */
|
||
#define PVD_FILTER_TIME_256PCLK (0x07UL) /**< PVD检测时信号数字滤波时间为:256*PCLK */
|
||
|
||
/* 低功耗进入方式定义 */
|
||
#define PMU_ENTRY_LOWPOWER_MODE_WFI (0x00UL) /**< WFI方式进入低功耗模式 */
|
||
#define PMU_ENTRY_LOWPOWER_MODE_WFE (0x01UL) /**< WFE方式进入低功耗模式 */
|
||
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*-------------------------------------------functions------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup PMU_External_Functions PMU External Functions
|
||
* @brief PMU对外函数
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief 使能BGR
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_bgr_enable(void)
|
||
{
|
||
PMU->CR1 |= PMU_CR1_BGR_EN;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 禁止BGR
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_bgr_disable(void)
|
||
{
|
||
PMU->CR1 &= (~PMU_CR1_BGR_EN);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 获取BGR Ready状态
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true:表示BGR已稳定
|
||
* @arg false:表示BGR未稳定
|
||
*/
|
||
__STATIC_INLINE bool std_pmu_get_bgr_status(void)
|
||
{
|
||
return ((PMU->SR & (PMU_SR_BGR_READY)) == (PMU_SR_BGR_READY));
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 使能VCORE_AON域的写操作
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_vaon_write_enable(void)
|
||
{
|
||
PMU->CR1 |= PMU_CR1_VAON_WEN;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 禁止VCORE_AON域的写操作
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_vaon_write_disable(void)
|
||
{
|
||
PMU->CR1 &= (~PMU_CR1_VAON_WEN);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 使能PVD数字过滤
|
||
* @note 进入Stop模式前,应禁止PVD数字滤波功能
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_filter_enable(void)
|
||
{
|
||
PMU->CR2 |= PMU_CR2_FILTER_EN;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止PVD数字过滤
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_filter_disable(void)
|
||
{
|
||
PMU->CR2 &= (~PMU_CR2_FILTER_EN);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 配置PVD监测信号数字滤波时间
|
||
* @param filter_value 数字滤波时间参数
|
||
* @arg PVD_FILTER_TIME_2PCLK
|
||
* @arg PVD_FILTER_TIME_4PCLK
|
||
* @arg ...
|
||
* @arg PVD_FILTER_TIME_256PCLK
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_filter_config(uint32_t filter_value)
|
||
{
|
||
MODIFY_REG(PMU->CR2, PMU_CR2_FILTER_TIME, (filter_value << PMU_CR2_FILTER_TIME_POS));
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 配置PVD阈值等级
|
||
* @param pvd_level PVD阈值等级选择
|
||
* @arg PMU_PVD_LEVEL_0
|
||
* @arg PMU_PVD_LEVEL_1
|
||
* @arg ...
|
||
* @arg PMU_PVD_LEVEL_7
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_level_config(uint32_t pvd_level)
|
||
{
|
||
MODIFY_REG(PMU->CR2, PMU_CR2_PVD_LEVEL, pvd_level);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 使能PVD
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_enable(void)
|
||
{
|
||
PMU->CR2 |= PMU_CR2_PVD_EN;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止PVD
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_disable(void)
|
||
{
|
||
PMU->CR2 &= (~PMU_CR2_PVD_EN);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 获取PVD状态标志
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true: 表示监测电压低于PVD阈值
|
||
* @arg false:表示监测电压高于PVD阈值
|
||
*/
|
||
__STATIC_INLINE bool std_pmu_get_pvd_status(void)
|
||
{
|
||
return ((PMU->SR & (PMU_SR_PVD_STATUS)) == (PMU_SR_PVD_STATUS));
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 使能PVD中断
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_interrupt_enable(void)
|
||
{
|
||
PMU->CR2 |= PMU_CR2_PVD_IE;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止PVD中断
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_interrupt_disable(void)
|
||
{
|
||
PMU->CR2 &= (~PMU_CR2_PVD_IE);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 检查PVD中断状态
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true:表示PVD中断状态置位
|
||
* @arg false:表示PVD中断状态未置位
|
||
*/
|
||
__STATIC_INLINE bool std_pmu_get_pvd_interrupt_flag(void)
|
||
{
|
||
return ((PMU->SR & (PMU_SR_PVD_INTF)) == (PMU_SR_PVD_INTF));
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* @brief 清除PVD中断标志
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_clear_pvd_interrupt_flag(void)
|
||
{
|
||
PMU->CLR = PMU_CLR_PVD_INTF_CLR;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 使能监测电压报警功能
|
||
* @param alarm_mode 监测电压报警类型
|
||
* @arg PMU_PVD_RISING
|
||
* @arg PMU_PVD_FALLING
|
||
* @arg PMU_PVD_LOWER_THRESHOLD
|
||
* @arg PMU_PVD_HIGHER_THRESHOLD
|
||
* @arg PMU_PVD_EDGE_TYPE
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_alarm_enable(uint32_t alarm_mode)
|
||
{
|
||
PMU->CR2 |= (alarm_mode);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 禁止监测电压报警功能
|
||
* @param alarm_mode 监测电压报警类型
|
||
* @arg PMU_PVD_RISING
|
||
* @arg PMU_PVD_FALLING
|
||
* @arg PMU_PVD_LOWER_THRESHOLD
|
||
* @arg PMU_PVD_HIGHER_THRESHOLD
|
||
* @arg PMU_PVD_EDGE_TYPE
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_pvd_alarm_disable(uint32_t alarm_mode)
|
||
{
|
||
PMU->CR2 &= (~(alarm_mode));
|
||
}
|
||
|
||
/**
|
||
* @brief 获取监测电压报警状态
|
||
* @param flag 监测电压报警类型
|
||
* @arg PMU_PVD_RISING
|
||
* @arg PMU_PVD_FALLING
|
||
* @arg PMU_PVD_LOWER_THRESHOLD
|
||
* @arg PMU_PVD_HIGHER_THRESHOLD
|
||
* @arg PMU_PVD_EDGE_TYPE
|
||
* @retval bool 返回标志的状态
|
||
* @arg true: 当前标志为置起状态
|
||
* @arg false:当前标志为清除状态
|
||
*/
|
||
__STATIC_INLINE bool std_pmu_get_pvd_alarm_flag(uint32_t flag)
|
||
{
|
||
return ((PMU->CR2 &(flag)) == (flag));
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 使能超低功耗配置
|
||
* @note 在Stop和Standby模式下,使能PDR/BOR周期性采样,从而降低功耗
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_ultra_lowpower_enable(void)
|
||
{
|
||
PMU->CR3 |= PMU_CR3_ULP_EN;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止超低功耗配置
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_pmu_ultra_lowpower_disable(void)
|
||
{
|
||
PMU->CR3 &= (~PMU_CR3_ULP_EN);
|
||
}
|
||
|
||
|
||
|
||
/* PMU寄存器复位函数 */
|
||
void std_pmu_reg_reset(void);
|
||
|
||
/* PVD初始化函数 */
|
||
void std_pmu_pvd_init(std_pvd_init_t *pvd_init_param);
|
||
void std_pmu_struct_init(std_pvd_init_t *pvd_init_struct);
|
||
|
||
/* PMU低功耗模式相关函数 */
|
||
void std_pmu_enter_sleep(uint32_t mode_entry);
|
||
void std_pmu_enter_stop(uint32_t mode_entry);
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* CIU32L051_STD_PMU_H */
|
||
|