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

电子说

1.4w人已加入

描述

做低功耗产品,最头疼的问题之一就是:设备睡眠之后唤不醒,或者唤醒了却不知道是哪个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),如果要拿来做唤醒,记得先把复用功能关掉,否则可能唤不醒或漏电流偏大



审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分