杰理AC696N开发板开发历程——按键开机+新增新的唤醒源

2026年06月17日 14:35    发布者:清月芯世界
做低功耗产品,最头疼的问题之一就是:设备睡眠之后唤不醒,或者唤醒了却不知道是哪个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 = &port0,    .port = &port1,    .sub = &sub_wkup,    .charge = &charge_wkup,};三、如何区分是哪个I/O唤醒的?这里有一个容易踩的坑:按键唤醒是通过检测I/O口电平来开机的,如果在app_main这类靠后的函数里才去打印获取唤醒源,此时开发板已经唤醒,自然获取不到。
正确的做法是在上电早期就读取唤醒状态。在setup_arch()函数中,通过以下方式获取:
https://ima-notebook-prod.image.myqcloud.com/2/d3kbCeYD2DyOJFf58fofxe/file_manager/019ed3b6718c70ad8346d38ebcd01b93.webp?q-sign-algorithm=sha1&q-ak=AKID9IDtLZZKqGRO7hVFnMn0zjXTXovoTtAN&q-sign-time=1781674932%3B1781703732&q-key-time=1781674932%3B1781703732&q-header-list=&q-url-param-list=&q-signature=729fd9d9ea74a5808a0164b4c98cc7023f794b41
用十六进制打印返回值,每一位对应一个唤醒源——bit(1) == 2表示编号为1的IO口触发了唤醒。通过这种方式,可以准确区分是哪个I/O口将系统从休眠中唤醒。
小结按键开机配置相对直接,通过宏使能即可;新增唤醒源需要按照SDK的结构体规范进行配置;而区分具体唤醒IO的关键在于在正确的时间点(系统唤醒早期)读取唤醒状态寄存器。另外提醒一点:有些IO在低功耗模式下默认是复用功能的(如UART、ADC),如果要拿来做唤醒,记得先把复用功能关掉,否则可能唤不醒或漏电流偏大