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为例子,只需修改如下:
在 sdk/bsp/AC637N/board/board_demo.c 中配置如下:
struct port_wakeup port0 = { .iomap = IO_PORTA_02, //唤醒口选择 };
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