电子说
做低功耗产品,最头疼的问题之一就是:设备睡眠之后唤不醒,或者唤醒了却不知道是哪个IO触发的。最近在AC696N开发板上调试按键开机和唤醒源配置,把整个过程梳理一下。
一、按键开机配置
AC696N的按键开机功能通过配置文件中的宏定义使能即可。这里采用的是长按开机机制——用户需要长按按键一段时间才能触发开机,避免短按误触。

关于长按时间的配置,如果设置得太短,系统可能会默认进入软关机状态(包括上电也会进入软关机)。具体的逻辑可以通过函数跳转和代码阅读来理解,SDK中相关代码的注释和调用链还是比较清晰的。
二、新增唤醒源与多I/O口控制开机
AC696N支持通过多个IO口的边沿(上升沿或下降沿)将系统从低功耗状态唤醒。新增唤醒源的配置步骤如下:
在板级文件中定义 port_wakeup 结构体变量
配置结构体成员:pullup_down_enable(使能内部上/下拉)、edge(唤醒边沿)、iomap(指定唤醒IO)
将结构体指针填入 wakeup_param 结构体数组
示例代码如下:
c
struct port_wakeup port0 = {
.pullup_down_enable = ENABLE,
.edge = FALLING_EDGE, // 下降沿唤醒
.iomap = IO_PORTA_06,
};
const struct wakeup_param wk_param = {
.port[1] = &port0,
.port[2] = &port1,
.sub = &sub_wkup,
.charge = &charge_wkup,
};
三、如何区分是哪个I/O唤醒的?
这里有一个容易踩的坑:按键唤醒是通过检测I/O口电平来开机的,如果在app_main这类靠后的函数里才去打印获取唤醒源,此时开发板已经唤醒,自然获取不到。
正确的做法是在上电早期就读取唤醒状态。在setup_arch()函数中,通过以下方式获取:

用十六进制打印返回值,每一位对应一个唤醒源——bit(1) == 2表示编号为1的IO口触发了唤醒。通过这种方式,可以准确区分是哪个I/O口将系统从休眠中唤醒。
小结
按键开机配置相对直接,通过宏使能即可;新增唤醒源需要按照SDK的结构体规范进行配置;而区分具体唤醒IO的关键在于在正确的时间点(系统唤醒早期)读取唤醒状态寄存器。另外提醒一点:有些IO在低功耗模式下默认是复用功能的(如UART、ADC),如果要拿来做唤醒,记得先把复用功能关掉,否则可能唤不醒或漏电流偏大
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !