PMU
简要说明
PMU(power management unit)电源管理单元,是一种高度集成的、针对便携式应用的电源管理方案,即将传统分立的若干类电源管理器件整合在单个的封装之内,这样可实现更高的电源转换效率和更低功耗,及更少的组件数以适应缩小的板级空间。
接口描述
csi_pmu_initialize
pmu_handle_t csi_pmu_initialize(int32_t idx, pmu_event_cb_t cb_event)
功能描述:
- 通过设备号初始化对应的pmu实例,返回pmu实例的句柄。
参数:
idx
: 设备号。cb_event
: pmu实例的事件回调函数(一般在进入低功耗模式上下文执行)。应用可根据回调函数做相应的睡前睡后行为。回调函数原型定义见pmu_event_cb_t。回调函数类型pmu_event_cb_t定义如下:
typedef void (*pmu_event_cb_t)(int32_t idx, pmu_event_e event, pmu_mode_e mode);
其中idx为设备号,event 为传给回调函数的事件类型,mode 为传给回调函数的低功耗模式。
pmu 回调事件枚举类型见 pmu_event_e 定义。
返回值:
NULL: 初始化失败。
其它: 实例句柄。
pmu_event_e:
名字 | 定义 | 备注 |
---|---|---|
PMU_EVENT_PREPARE_SLEEP | 睡前准备事件 | |
PMU_EVENT_PREPARE_DONE | 睡前唤醒事件 |
csi_pmu_uninitialize
int32_t csi_pmu_uninitialize(pmu_handle_t handle)
功能描述:
- pmu实例反初始化。该接口会释放相关的软硬件资源。
参数:
handle
: 实例句柄。
返回值:
- 错误码。
csi_pmu_enter_sleep
int32_t csi_pmu_enter_sleep(pmu_handle_t handle, pmu_mode_e mode)
功能描述:
- pmu实例反初始化。该接口会释放相关的软硬件资源。
参数:
handle
: 实例句柄。mode
: pmu模式 定义见 pmu_mode_e 。
返回值:
- 错误码。
pmu_mode_e:
名字 | 定义 | 备注 |
---|---|---|
PMU_MODE_RUN | 运行模式 | |
PMU_MODE_SLEEP | 睡眠模式(关闭cpu clock) | |
PMU_MODE_DOZE | 停止模式(关闭cpu以及外设clock) | |
PMU_MODE_DORMANT | 休眠模式(关闭cpu以及大部分外设电源) | |
PMU_MODE_STANDBY | 待命模式(关闭cpu、大部分外设以及ram电源) | |
PMU_MODE_SHUTDOWN | 关机模式 |
csi_pmu_power_control
int32_t csi_pmu_power_control(pmu_handle_t handle, csi_power_stat_e state)
功能描述:
- 保存和恢复pmu的寄存器。
参数:
handle
: 实例句柄。state
: 电源状态。原型定义见 csi_power_stat_e。
返回值:
- 错误码。
csi_power_stat_e:
名字 | 定义 | 备注 |
---|---|---|
DRV_POWER_OFF | 关电源状态 | |
DRV_POWER_LOW | 低电平状态 | |
DRV_POWER_FULL | 全电源状态 | |
DRV_POWER_SUSPEND | 挂起电源状态 |
csi_pmu_config_wakeup_source
int32_t csi_pmu_config_wakeup_source(pmu_handle_t handle, uint32_t wakeup_num, pmu_wakeup_type_e type, pmu_wakeup_pol_e pol, uint8_t enable)
功能描述:
- 配置pmu 的唤醒源。
参数:
handle
: 实例句柄。wakeup_num
: 唤醒号。type
: 唤醒源的信号类型,定义见pmu_wakeup_type_e。pol
: 唤醒源的信号极性,定义见pmu_wakeup_pol_e。enable
: 是否使能唤醒源。
返回值:
- 错误码。
pmu_wakeup_type_e:
名字 | 定义 | 备注 |
---|---|---|
PMU_WAKEUP_TYPE_PULSE | 脉冲类型 | |
PMU_WAKEUP_TYPE_LEVEL | 电平类型 |
pmu_wakeup_pol_e:
名字 | 定义 | 备注 |
---|---|---|
PMU_WAKEUP_POL_LOW | 低电平/下降沿有效 | |
PMU_WAKEUP_POL_HIGH | 高电平/上升沿有效 |
示例
PMU示例1
pmu_handle_t pmu_handle;
/* do console save and restore operation through console_handle */
extern usart_handle_t console_handle;
void manager_device_power(int32_t idx, pmu_event_e event, pmu_mode_e mode)
{
if (event == PMU_EVENT_PREPARE_SLEEP) {
csi_usart_power_control(console_handle, DRV_POWER_SUSPEND);
csi_pmu_power_control(pmu_handle, DRV_POWER_SUSPEND);
} else if (event == PMU_EVENT_SLEEP_DONE) {
csi_usart_power_control(console_handle, DRV_POWER_FULL);
csi_pmu_power_control(pmu_handle, DRV_POWER_FULL);
}
}
int32_t test_pmu_dormant_mode(void)
{
int32_t ret;
printf("test dormant mode\n");
pmu_handle = csi_pmu_initialize(0, manager_device_power);
csi_gpio_pin_initialize(WAKEUP_PIN, NULL);
if (pmu_handle == NULL) {
printf("csi_pmu_initialize failed\n");
return -1;
}
ret = csi_pmu_config_wakeup_source(pmu_handle, EXAMPLE_WAKEUP_NUM, PMU_WAKEUP_TYPE_LEVEL, PMU_WAKEUP_POL_HIGH, 1);
if (ret < 0) {
printf("csi_pmu_config_wakeup_source failed\n");
return -1;
}
printf("please change the wakeup pin %s from low to high\n", EXAMPLE_BOARD_WAKEUP_PIN_NAME);
ret = csi_pmu_enter_sleep(pmu_handle, PMU_MODE_DORMANT);
if (ret < 0) {
printf("csi_pmu_enter_sleep failed\n");
return -1;
}
ret = csi_pmu_config_wakeup_source(pmu_handle, EXAMPLE_WAKEUP_NUM, PMU_WAKEUP_TYPE_LEVEL, PMU_WAKEUP_POL_HIGH, 0);
ret = csi_pmu_uninitialize(pmu_handle);
if (ret < 0) {
printf("csi_pmu_uninitialize failed\n");
return -1;
}
printf("test standby mode successfully\n");
return 0;
}
int example_pmu(void)
{
drv_pinmux_config(WAKEUP_PIN, WAKEUP_PIN_FUNC);
test_pmu_dormant_mode();
return 0;
}
int main(void)
{
return example_pmu();
}