22. PMU

Overview

以 AC637N 为例,使系统进入休眠(power_down)或者软关机(soft_off)状态,此时系统处于低功耗运行,可以通过IO口进行唤醒。提供 pmu 的应用示例、工程配置、API 介绍和常见问题。

22.1. 应用示例

  • pmu 的具体源代码详见 sdk/bsp/AC637N/src/power_api.c

  • power_api.c 中参考示例如下:

    #include "typedef.h"
    #include "asm/power_interface.h"
    #include "asm/wdt.h"
    
    extern u8 sys_low_power_request;
    extern u32 lowpower_usec;
    
    void sys_power_down(u32 usec)
    {
        if (usec == -2) {
            wdt_close();
        }
    
        if (!sys_low_power_request) {
            lowpower_usec = usec;
            low_power_sys_request(NULL);
            wdt_clear();
        }
    }
    
    void sys_softoff()
    {
        power_set_soft_poweroff();
    }
    
    void lowpower_mode(u8 mode)
    {
        if (mode == 0) {
            sys_power_down(-2);
        } else if (mode == 1) {
            sys_softoff();
        }
    }
    

22.2. 工程配置

  • sdk/bsp/AC637N/board/board_demo.c 中配置唤醒IO引脚:

    struct port_wakeup port0 = {
        .pullup_down_enable = ENABLE,                            //配置I/O 内部上下拉是否使能
        .edge               = FALLING_EDGE,                      //唤醒方式选择,可选:上升沿\下降沿
        .both_edge          = 0,
        .filter             = PORT_FLT_8ms,
        .iomap              = IO_PORTB_01,                       //唤醒口选择
    };
    
  • sdk/apps/main.c 中函数 user_main() 添加如下工程代码:

    int user_main()
    {
        extern void lowpower_mode(u8 mode);
        lowpower_mode(0); //power_down休眠
        mdelay(500);
        lowpower_mode(1); //soft_off软关机
    }
    
  • 编译下载后,开机自动进入sleep,按PB1唤醒,打印:sys_power_down out,等待500ms后马上进入soft_off,再按PB1复位唤醒。

22.3. 常见问题

1.如何同时配置多个IO唤醒引脚?

答:以配置PA02为例子,只需修改如下:

2.如何同时配置多个IO唤醒引脚?

答:以同时配置两个IO唤醒引脚为例子:

  • sdk/bsp/AC637N/board/board_demo.c 中按照如下同时配置两个唤醒IO引脚:

    struct port_wakeup port0 = {
        .pullup_down_enable = ENABLE,                            //配置I/O 内部上下拉是否使能
        .edge               = FALLING_EDGE,                      //唤醒方式选择,可选:上升沿\下降沿
        .both_edge          = 0,
        .iomap              = IO_PORTA_02,         //唤醒口选择
        .filter             = PORT_FLT_2ms,
    };
    
    struct port_wakeup port1 = {
        .pullup_down_enable = ENABLE,                            //配置I/O 内部上下拉是否使能
        .edge               = FALLING_EDGE,                      //唤醒方式选择,可选:上升沿\下降沿
        .both_edge          = 0,
        .iomap              = IO_PORTA_07,         //唤醒口选择
        .filter             = PORT_FLT_2ms,
    };
    
    const struct wakeup_param wk_param = {
        .port[1]    = &port0,
        .port[2]    = &port1,
    };
    

22.4. API参考

PMU 常用相关 API 介绍,具体软件代码见 sdk/bsp/AC637N/src/power_api.c

Functions

void sys_power_down(u32 usec)

休眠函数

Parameters

usec – 自动休眠唤醒时间,单位us

Returns

NULL

void sys_softoff()

软关机函数

Returns

NULL

void lowpower_mode(u8 mode)

低功耗模式选择函数

Parameters

err – 0为进入休眠,1为进入软关机

Returns

NULL