AC695x学习笔记(4):软开关机

本文介绍了软开关机的工作原理及实现方法,包括芯片唤醒准备、开机键检测、关机操作及优化等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、唤醒准备

二、开机键检测

三、关机操作

四、优化

总结


前言

        通常我们进行开关操作是采取硬开关的方式,即芯片上电即开机,而断电为关机。如拨动开关。而软开关机则是电源一直给芯片供电,开机实际就是将芯片从休眠状态下唤醒进行工作,而关机后则是进入休眠状态。


一、唤醒准备

         要实现开关机功能,应先进行相关的配置操作:开启功能宏定义、唤醒配置(常用的为外部跳变沿唤醒的方式)等....

  • 功能宏定义:开关键功能宏定义配置在板级配置文件board_ac695x_demo_cfg.h中的‘系统配置’下的宏定义标志TCFG_POWER_ON_NEED_KEY置位使能。
//*********************************************************************************//
//                                  系统配置                                       //
//*********************************************************************************//
#define TCFG_AUTO_SHUT_DOWN_TIME	   0  //没有蓝牙连接自动关机时间
#define TCFG_SYS_LVD_EN				   0  //电量检测使能
#define TCFG_POWER_ON_NEED_KEY		   1  //是否需要按按键开机配置
#define TWFG_APP_POWERON_IGNORE_DEV    0  //上电忽略挂载设备,0时不忽略,非0则n毫秒忽略

#define TCFG_AUDIO_DEC_OUT_TASK		   0  // 解码使用单独任务做输出
  • 唤醒源:开启宏定义后,还需配置好唤醒源,包括唤醒使能、唤醒方式、唤醒口选择...等的相关配置,在源文件board_ac695x_demo.c中的**PWR config**下配置port_wakeup结构体:
/************************** PWR config ****************************/
struct port_wakeup port0 = {
    .pullup_down_enable = ENABLE,         //配置I/O 内部上下拉是否使能
    .edge       = FALLING_EDGE,           //唤醒方式选择,可选:上升沿\下降沿
    .attribute  = BLUETOOTH_RESUME,       //保留参数
    .iomap      = IO_PORTB_01,            //唤醒口选择
};

二、开机键检测

        当芯片从休眠状态被唤醒后会进行复位操作,此时仍会增加开机键的检测判断是否进行按键开机操作(防止按键误触导致的唤醒),而按键检测函数check_power_on_key( )则是在app_init函数中被调用来进行检测。

(1)检测函数check_power_on_key( ):在检测函数中主要是对开机键进行一定的消抖和过滤循环检测,当检测按下预定的时间/次数后便退出循环往下运行,否则将重新休眠。

static void check_power_on_key(void)
{
    u32 delay_10ms_cnt = 0;
    u32 delay_10msp_cnt = 0;

    while (1) {
        clr_wdt();
        os_time_dly(2);

        extern u8 get_power_on_status(void);
        if (get_power_on_status()) {
            putchar('+');
            delay_10msp_cnt = 0;
            delay_10ms_cnt++;
            if (delay_10ms_cnt > 70) {    //计数检测到一定时间则退出循环
				app_var.power_key_first_press = 1;
                return;
            }
        } else {
            putchar('-');
            delay_10ms_cnt = 0;

            delay_10msp_cnt++;
            if (delay_10msp_cnt > 20) {  //未检测成功则重新休眠
                puts("enter softpoweroff\n");
                power_set_soft_poweroff();
            }
        }
    }
}
  • 注意点在开机键状态获取函数get_power_on_status( )中要根据实际使用的按键类型对按键类型的宏定义使能。且若使用的是AD按键中的一个键作为开机键,则需注意最好以分压得到最小的ADC值的按键作为开机键,以防止多个按键都能进行开机。

    u8 get_power_on_status(void)
    {
    #if TCFG_IOKEY_ENABLE
        struct iokey_port *power_io_list = NULL;
        power_io_list = iokey_data.port;
    
        if (iokey_data.enable) {
            if (gpio_read(power_io_list->key_type.one_io.port) == power_io_list->connect_way){
                return 1;
            }
        }
    #endif
    
    #if TCFG_ADKEY_ENABLE
        if (adkey_data.enable) {
            if (adc_get_value(adkey_data.ad_channel) < 10) {    //通过判定ADC值判定按键按下
                return 1;
            }
        }
    #endif
        return 0;
    }

三、关机操作

        关机操作就只需发送关机的指令(KEY_POWEROFF + KEY_POWEROFF_HOLD),当检测到关机操作后,会进入到power_off任务中进行相应的关机操作。通常关机指令处理放在公共事件app_common_key_msg_deal()处理中进行处理。

四、优化

        由于开机和关机操作都是操作的同一按键,因此在正常开机后仍保持按键按下一直不松手,此时系统由于正常开机,便会接着去检测按键,则有可能误判定在开机情况下长按进行了关机操作,导致又关机。因此在上述的开关键的操作基础上,增加了一套逻辑:当正常开机后,只有进行了过松手操作后,才响应关机的消息推送。(仅提供一种示例思路,可根据自己逻辑修改)。

(1)步骤1:在结构体APP_VAR中添加个首次按键松手标志power_key_first_press(这个标志可自定随意定义,此文档仅便于个人管理才添加在结构体APP_VER中而已)

(2)步骤2:在进行开机键状态检测消抖处,当正常开机时则将标志power_key_first_press置位

(3)步骤3:在相关的按键值检测函数中检测按键是否松开,当检测到松手后再将标志位进行清零的操作。

(4)步骤4:在接收到关机消息处理时增加判定条件(在正常开机后需进行松手操作,即标志位清零过后)才可进行关机操作


总结

        以上就是的内容仅是常用的一种软开关机的方式,除了该方式,还有:(1)通过硬件配合芯片上电后控制三极管来进行锁定的自杀式开关机。(2)进入IDLE模式关闭其他功能的假关机。(3)其他....等不同的软开关机方式。可结合实际进行一些相关的逻辑操作。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值