低功耗与唤醒

1、低功耗相关参数配置

在board_awxxx_cfg.h中可以选择低功耗模式,选择LDO模式或者外挂DCDC方式
1、选择TCFG_LOWPOWER_POWER_SEL即可配置(sdk默认LDO模式)
#define TCFG_LOWPOWER_POWER_SEL                         PWR_LDO15                    //电源模式设置,可选DCDC和LDO
2、若要选择DCDC低功耗模式,则需要外挂dcdc模块以支持。外挂原理图参考以下(使用时需要将VPWR短接VIN,DCVDD短接1.2V,DC_EN接到PA5)。
"dcdc原理图参考"

dcdc原理图参考

#define TCFG_DCDC_PORT                IO_PORTA_05  //dcdc en脚
#define TCFG_LOWPOWER_POWER_SEL       PWR_DCDC15
board_awxxx_cfg.h中可以配置进入低功耗的方式。
1、区别在 性能指标 有提及。
#define TCFG_LOWPOWER_LOWPOWER_SEL  SLEEP_EN        //powerdown配置
#define TCFG_LOWPOWER_LOWPOWER_SEL  DEEP_SLEEP_EN   //poweroff配置
在board_awxxx_cfg.h文件中可配置VDDIO电压
1、有正常运行vddio_m和低功耗的vddio_w。
#define TCFG_LOWPOWER_VDDIOM_LEVEL            VDDIOM_VOL_30V //系统正常运行时的VDDIO电压;
#define TCFG_LOWPOWER_VDDIOW_LEVEL            VDDIOW_VOL_28V //系统低功耗时的VDDIO电压;
如果需要配置系统为VDDIO供电:
1、函数void board_power_init()中配置PCONTROL_POWER_SUPPLY模式为0
void board_power_init()
{
    GPIO_CONFIG_INIT();

    power_control(PCONTROL_POWER_SUPPLY, 0); //设置为0,vddio供电
Soft off调用power_set_soft_poweroff即可完成软关机
1、全局搜索此接口如何使用,一般来说进入软关机前应该做好 数据备份蓝牙断链
void power_set_soft_poweroff(void *priv); //软关机
Power down/off sys_power_down低功耗接口
1、TCFG_LOWPOWER_LOWPOWER_SEL选择了powerdown/poweroff就需要在主循环持续调用sys_power_down接口,保证一有空闲即进入低功耗。
2、usec:唤醒时间(微秒),该时间不可超过看门狗复位时间的一半;
void sys_power_down(u32 usec)             //进入低功耗接口
Power down/off 某时刻不进入
1、开发者想针对某时刻不想进入低功耗模式,可以在对应case中设置is_hidkey_active(以app_keyboard.c为例)为1即不允许进入低功耗,结束置0即可。
//1-临界点,系统不允许进入低功耗,0-系统可以进入低功耗
static volatile u8 is_hidkey_active = 0;

2、唤醒相关参数配置

Soft off与Power down共用唤醒模块,AW31N最多可以设置12个IO唤醒源。可以在对应板级board_aw31xxx.c添加唤醒口增加唤醒源。

参考iokey唤醒口可以知道,仅需要配置create_key_io_wakeup_config()即可,传参如下,

gpio: 唤醒IO口。支持所有PA口和USB_io;

gpio_mode:上/下拉模式;

filter:边沿唤醒选择消抖的脉冲时长;
① PORT_FLT_DISABLE;
② PORT_FLT_16us;
③ PORT_FLT_128us;
④ PORT_FLT_1ms;
edge:边沿触发方式;
① RISING_EDGE:上升沿;
② FALLING_EDGE:下降沿唤醒;
③ BOTH_ENGE:双边沿唤醒;

callback:唤醒回调;

注:使用边沿唤醒的应用,注意唤醒IO在唤醒时的电平不可位于1.3~1.7V,该范围的电压处于芯片高电平和低电平之间的中间态,可能出现无法唤醒的现象。


3、powerdown/off系统繁忙轮询机制

AW31N的powerdown/off在系统休眠前新增了系统模块空闲链表查询的机制,只要有一个模块标志不处于空闲,系统就不会进入休眠并且退出powerdown/off函数,当所有模块都处于空闲时系统才能进入休眠。

注:该机制轮询的位置已关闭总中断,对于定时响应的任务或者对时间要求比较苛刻的中断应用可能会造成影响。

/*************************************************************************************************/
/*!
 *  \brief      注册控制是否进入sleep
 *
 *  \param      [in]
 *
 *  \return
 *
 *  \note
 */
/*************************************************************************************************/
//-----------------------
//system check go sleep is ok
static u8 hidkey_app_idle_query(void)
{
    return !is_hidkey_active;
}

REGISTER_LP_TARGET(app_hidkey_lp_target) = {
    .name = "app_hidkey_deal",
    .is_idle = hidkey_app_idle_query,
};

参考上述案例,用户可以自行编写一个函数(如图中的hidkey_app_idle_query函数),然后注册到结构体中,需要自定义结构体名(括号中的app_hidkey_lp_target为用户自定义的结构体名)。当用户调用sys_power_down函数时,powerdown/off内部会查询用户所有已注册函数的返回值。当返回值为0时,会自动退出powerdown/off;当返回值为1时,就会进入休眠。


4、低功耗相关函数

函数void power_set_soft_poweroff(void)

Note

此函数实现使系统进入软关机。

函数void board_set_soft_poweroff(void)

Note

此函数实现在进入软关机之前将IO口设置成高阻,并将唤醒引脚设为对应的待唤醒状态,若需要保留某些I/O口原来状态,可在gpio_config_soft_poweroff调用函数PORT_PROTECT(u32 gpio)。

"唤醒IO保护“

唤醒IO保护

函数void sys_power_down(u32 usec)

Note

此函数实现进入系统power down,并通过延时或者触发唤醒。其中参数:

1.usec:唤醒时间(微秒),该时间不可超过看门狗复位时间的一半;

5、唤醒相关函数

函数bool is_wakeup_source(enum WAKEUP_REASON index)

Note

此函数实现查询传入的唤醒源参数,是否与系统soft off的唤醒源一致。该接口需要在系统初始化power_early_flowing()之后调用,否则获取的唤醒源不准确,其中参数:

1.index:唤醒端口;
① PWR_WK_REASON_FALLING_EDGE:io下降沿唤醒源0~11;
② 具体可传入的唤醒源请查看power_wakeup.h中的WAKEUP_REASON枚举;
2.返回值:
1 传入的唤醒源为本次系统的唤醒源;
0 传入的唤醒源非本次系统的唤醒源;

6、长短按复位相关函数

函数void p33_mclr_sw(u8 en)

此函数实现开关PB0短按复位功能。其中参数:

1.en:
1 开启短按复位使能
0 关闭短按复位使能

Note

此函数在使用前需要将短按复位口设置成上拉数字输入

函数gpio_longpress_pin0_reset_config(u32 pin, u32 level, u32 time, u32 release, u32 pull_enable)

Note

此函数实现配置长按复位功能。其中参数

1.pin:长按复位IO, 默认使用PA3,支持任意PA口、PB口和USB_io

2.level:io口输入上下拉配置。1为上拉, 0为下拉

3.time:长按复位时间。支持1s、2s、4s、8s、16s。时间设为0时会关闭长按复位功能。

4.release: 0 等到io电平反转再释放系统运行 1 立即释放系统运行

5.pull_enable:上下拉使能