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();
}

results matching ""

    No results matching ""