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

您所在的位置:网站首页 音响闹钟怎么关机 AC695x学习笔记(4):软开关机

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

2024-07-16 16:24| 来源: 网络整理| 查看: 265

目录

前言

一、唤醒准备

二、开机键检测

三、关机操作

四、优化

总结

前言

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

一、唤醒准备

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

功能宏定义:开关键功能宏定义配置在板级配置文件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)其他....等不同的软开关机方式。可结合实际进行一些相关的逻辑操作。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3