描述 #
该文件包含电源管理(PWR)固件库的所有函数原型、常量定义和寄存器操作接口,用于配置低功耗模式、电源电压检测(PVD)、自动唤醒(AWU)等功能。该库专为CH32V00x系列微控制器设计,通过操作PWR外设寄存器实现系统功耗优化,适用于电池供电、待机唤醒、电压监控等应用场景。所有常量均以PWR_为前缀,确保命名空间清晰,避免与其它外设冲突。
常量 #
PVD_detection_level
#
电源电压检测(PVD)阈值电平配置,用于设定当电源电压低于指定阈值时触发中断或标志的电压等级。该功能常用于系统监控,防止在电压过低时发生异常行为(如数据丢失或逻辑错误)。实际阈值对应芯片内部比较器的校准值,用户可通过宏定义直接选择标准电压点,无需手动计算寄存器位。
| 名称 | 值 | 简述 |
|---|---|---|
PWR_PVDLevel_MODE0 |
0x00000000 |
PVD检测电平设置为模式0 |
PWR_PVDLevel_MODE1 |
0x00000020 |
PVD检测电平设置为模式1 |
PWR_PVDLevel_MODE2 |
0x00000040 |
PVD检测电平设置为模式2 |
PWR_PVDLevel_MODE3 |
0x00000060 |
PVD检测电平设置为模式3 |
PWR_PVDLevel_MODE4 |
0x00000080 |
PVD检测电平设置为模式4 |
PWR_PVDLevel_MODE5 |
0x000000A0 |
PVD检测电平设置为模式5 |
PWR_PVDLevel_MODE6 |
0x000000C0 |
PVD检测电平设置为模式6 |
PWR_PVDLevel_MODE7 |
0x000000E0 |
PVD检测电平设置为模式7 |
PWR_PVDLevel_2V9 |
PWR_PVDLevel_MODE0 |
2.9V检测阈值(推荐用于3.3V系统) |
PWR_PVDLevel_3V1 |
PWR_PVDLevel_MODE1 |
3.1V检测阈值 |
PWR_PVDLevel_3V3 |
PWR_PVDLevel_MODE2 |
3.3V检测阈值(典型工作电压) |
PWR_PVDLevel_3V5 |
PWR_PVDLevel_MODE3 |
3.5V检测阈值 |
PWR_PVDLevel_3V7 |
PWR_PVDLevel_MODE4 |
3.7V检测阈值 |
PWR_PVDLevel_3V9 |
PWR_PVDLevel_MODE5 |
3.9V检测阈值 |
PWR_PVDLevel_4V1 |
PWR_PVDLevel_MODE6 |
4.1V检测阈值 |
PWR_PVDLevel_4V4 |
PWR_PVDLevel_MODE7 |
4.4V检测阈值 |
以上所有值均强制转换为
uint32_t,并写入PWR_CTLR寄存器的[6:4]位(PLS字段),实现电压阈值选择。
PWR_AWU_Prescaler
#
自动唤醒单元(AWU)的时钟预分频系数,用于控制AWU计数器的时钟源(LSI)分频倍数,从而决定唤醒周期的长短。LSI(低速内部时钟)典型频率为40kHz,通过不同分频可实现从毫秒级到数秒级的精确唤醒间隔,适用于低功耗定时唤醒、周期性采样等场景。
| 名称 | 值 | 简述 |
|---|---|---|
PWR_AWU_Prescaler_1 |
0x00000000 |
AWU计数器时钟 = LSI/1 |
PWR_AWU_Prescaler_2 |
0x00000002 |
AWU计数器时钟 = LSI/2 |
PWR_AWU_Prescaler_4 |
0x00000003 |
AWU计数器时钟 = LSI/4 |
PWR_AWU_Prescaler_8 |
0x00000004 |
AWU计数器时钟 = LSI/8 |
PWR_AWU_Prescaler_16 |
0x00000005 |
AWU计数器时钟 = LSI/16 |
PWR_AWU_Prescaler_32 |
0x00000006 |
AWU计数器时钟 = LSI/32 |
PWR_AWU_Prescaler_64 |
0x00000007 |
AWU计数器时钟 = LSI/64 |
PWR_AWU_Prescaler_128 |
0x00000008 |
AWU计数器时钟 = LSI/128 |
PWR_AWU_Prescaler_256 |
0x00000009 |
AWU计数器时钟 = LSI/256 |
PWR_AWU_Prescaler_512 |
0x0000000A |
AWU计数器时钟 = LSI/512 |
PWR_AWU_Prescaler_1024 |
0x0000000B |
AWU计数器时钟 = LSI/1024 |
PWR_AWU_Prescaler_2048 |
0x0000000C |
AWU计数器时钟 = LSI/2048 |
PWR_AWU_Prescaler_4096 |
0x0000000D |
AWU计数器时钟 = LSI/4096 |
PWR_AWU_Prescaler_10240 |
0x0000000E |
AWU计数器时钟 = LSI/10240 |
PWR_AWU_Prescaler_61440 |
0x0000000F |
AWU计数器时钟 = LSI/61440 |
以上所有值均强制转换为
uint32_t,写入AWUPSC寄存器的[3:0]位,实现分频配置。
STOP_mode_entry
#
进入待机(STANDBY)模式时使用的唤醒指令选择。该配置决定系统在进入低功耗待机后,是通过等待中断(WFI)还是等待事件(WFE)来恢复运行。WFI更适用于常规中断唤醒,WFE则适合与事件(如外部引脚变化、RTC闹钟等)配合使用,提升唤醒响应的灵活性。
| 名称 | 值 | 简述 |
|---|---|---|
PWR_STANDBYEntry_WFI |
0x01 |
使用WFI指令进入待机模式 |
PWR_STANDBYEntry_WFE |
0x02 |
使用WFE指令进入待机模式 |
PWR_Flag
#
PWR外设状态标志位,用于查询电源管理模块的当前状态。目前仅定义一个标志位,用于检测PVD的输出状态,可配合中断或轮询机制实现电压异常告警。
| 名称 | 值 | 简述 |
|---|---|---|
PWR_FLAG_PVDO |
0x00000004 |
PVD输出标志位(在CSR寄存器中) |
以上所有值均强制转换为
uint32_t,用于与PWR_CSR寄存器进行位掩码比较。
枚举 #
无
结构体 #
无
函数 #
PWR_DeInit
#
void PWR_DeInit(void)
将PWR外设的所有寄存器恢复为复位默认值。通过复位APB1总线上的PWR模块实现,而非逐位写入,确保所有配置(PVD、AWU、待机模式等)被彻底清除,适用于系统初始化或异常恢复场景。
参数:
无
返回值:
无
实现原理:调用RCC_APB1PeriphResetCmd()对PWR模块进行软复位,先使能复位再关闭,等效于硬件上电复位。
PWR_PVDCmd
#
void PWR_PVDCmd(FunctionalState NewState)
启用或禁用电源电压检测(PVD)功能。当启用时,芯片会持续监控VDD电压,当电压低于设定阈值时,PVD_FLAG被置位,可触发中断或用于软件判断。禁用后,PVD功能关闭,节省少量功耗。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE(启用)或 DISABLE(禁用) |
返回值:
无
该函数直接操作PWR_CTLR寄存器的第4位(PVDEN),是低功耗系统中实现电压保护的关键接口。
PWR_PVDLevelConfig
#
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)
配置PVD的电压检测阈值。根据传入的PWR_PVDLevel_*常量,设置PWR_CTLR寄存器中的PLS[6:4]字段,从而选择8个预设电压等级之一。建议根据系统工作电压范围选择合适阈值,例如3.3V系统推荐使用PWR_PVDLevel_3V1或PWR_PVDLevel_3V3。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
PWR_PVDLevel |
uint32_t |
从PWR_PVDLevel_MODE0到PWR_PVDLevel_MODE7中选择一个阈值 |
返回值:
无
该函数先清除PLS字段,再写入新值,避免误配置。注意:配置后需确保PVD已启用(调用
PWR_PVDCmd(ENABLE))才生效。
PWR_AutoWakeUpCmd
#
void PWR_AutoWakeUpCmd(FunctionalState NewState)
启用或禁用自动唤醒(AWU)功能。启用后,AWU计数器将基于LSI时钟递减,当计数器归零时触发唤醒事件,使系统从待机或停机模式中恢复。适用于周期性唤醒采集传感器数据、维持通信心跳等低功耗应用。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE(启用)或 DISABLE(禁用) |
返回值:
无
实际操作为设置PWR_AWUCSR寄存器的第1位(AWUEN),需配合
PWR_AWU_SetPrescaler()和PWR_AWU_SetWindowValue()完成完整配置。
PWR_AWU_SetPrescaler
#
void PWR_AWU_SetPrescaler(uint32_t AWU_Prescaler)
设置AWU计数器的时钟预分频系数,决定唤醒周期的长度。LSI时钟(约40kHz)经分频后作为AWU的计数源,分频值越大,唤醒间隔越长。例如,使用PWR_AWU_Prescaler_61440时,唤醒周期约为1.6秒(40kHz / 61440 ≈ 0.65Hz)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
AWU_Prescaler |
uint32_t |
从PWR_AWU_Prescaler_1到PWR_AWU_Prescaler_61440中选择一个分频值 |
返回值:
无
该函数读取AWUPSC寄存器,保留其他位,仅修改[3:0]位(分频码),确保不干扰其他配置。
PWR_AWU_SetWindowValue
#
void PWR_AWU_SetWindowValue(uint8_t WindowValue)
设置AWU的窗口比较值,用于控制唤醒事件的触发时机。当AWU计数器递减至该值时,会触发唤醒事件。该值必须小于0x3F(63),通常设置为计数器最大值的一半,以实现对称唤醒周期。若设置为0,则在计数器归零时立即唤醒。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
WindowValue |
uint8_t |
窗口比较值,范围0 |
返回值:
无
该值写入AWUWR寄存器的[5:0]位,用于与AWU计数器进行比较,实现“窗口唤醒”功能,适用于需要精确时间窗口的应用。
PWR_EnterSTANDBYMode
#
void PWR_EnterSTANDBYMode(uint8_t PWR_STANDBYEntry)
使系统进入待机(STANDBY)模式,此时除备份域和唤醒电路外,所有时钟和电源均被关闭,功耗降至最低(通常<1μA)。唤醒源包括外部复位、WKUP引脚、RTC闹钟或AWU事件。该函数通过设置PDDS位并执行WFI/WFE指令实现低功耗跳转。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
PWR_STANDBYEntry |
uint8_t |
PWR_STANDBYEntry_WFI(等待中断)或 PWR_STANDBYEntry_WFE(等待事件) |
返回值:
无
该函数会清除PWR_CTLR的PDDS位,再重新设置为1,确保待机模式被正确激活。同时,通过修改SCB->SCR寄存器的DEEPSLEEP位,使CPU进入深度睡眠,配合WFI/WFE实现系统级低功耗。注意:该函数执行后程序不会返回,除非被唤醒。
PWR_GetFlagStatus
#
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)
查询PWR外设的状态标志位,用于判断是否发生特定事件(如PVD电压阈值触发)。仅支持查询PWR_FLAG_PVDO,其他标志位未定义。该函数常用于中断服务程序或主循环中轮询电源状态。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
PWR_FLAG |
uint32_t |
仅支持PWR_FLAG_PVDO |
返回值:
SET(标志置位)或 RESET(标志未置位)
该函数读取PWR_CSR寄存器的PVDO位(第2位),并返回其状态。读取后标志位不会自动清除,需通过软件或硬件复位清除。