BES2600按键开机方式
BES2600芯片在关机的状态的情况, 有两种方式可以将芯片开机: 一种方法是给CHRG脚5V电平, 另一种方式是开机按键PWRKEY脚有上升沿高电平的时候. 这两种情况都可以使芯片启动, 开始运行代码.
程序运行起来后, SDK代码中还有一套应用程序APP的启动流程
SDK默认按键开机方式
SDK代码默认搭配原厂的EVB开发板, 一般有个实体按键PWRKEY作为开机按键. 下面跟随SDK中的代码看默认的按键启动的流程, 以下为PWRKEY脚接实体按键:
当代码运行进入app_init()时, 需要满足一些开机的条件, 如果有些条件没有满足的话, 应用程序代码就会走关机流程, 让芯片回到关机状态.
比如开机的时候app_key_open()的时候, 里面会判断开机按键PWRKEY的状态, 如果此时PWRKEY脚位上是低电平则应用程序代码认为是PWRKEY抖动造成的开机, 不满足开机条件, 从而走到exit, app_init()返回值不为0, 则进入关机的流程使芯片关机
开机的时候进入app_poweron_key_init() 注册开机按键事件
SDK中默认进入的是以下红框部分, 分别注册了INITUP, INITLONGPRESS, INITLONGLONGPRESS和INITFINISHED事件, 这四个事件是从hal_key中传上来的事件, 分别是开机上升沿事件, 开机长按, 开机加长按事件, 开机完成事件
应用程序app会根据开机时PWRKEY按键是上升沿事件, 长按或加长按事件进入不同的回调, 给g_pwron_case赋对应的值, 并向main_thread设置一个0x02的事件标志
正常开机时, 会在app_poweron_wait_case()等待0x02信号标志, 获取pwron_case
在app_poweron_wait_case()中调用osSignalWait等待0x02信号标志, 线程暂停执行, 这里等待时间默认是5S, 有开机按键事件发生的时候会设置一个0x02的事件标志和设置pwron_case, app_init()中可以根据不同的pwron_case, 做不同的初始化. 比如poweron_case_normal的时候做正常的初始化, poweron_case_bothscan走开机进手机配对的流程
由以上代码分析可知, 默认SDK 开机方式是使用按键开机的方式
开机时PWRKEY短按一下 --> 认为是PWRKEY抖动, 重新关机
开机时PWRKEY短按1s左右 --> hal层上报INITUP事件, 走pwron_case_normal开机的流程
开机时PWRKEY长按3s左右 --> hal层上报INITLONGPRESS事件, 走pwron_case_bothscan, 开机并进入手机配对
开机时PWRKEY长按6s左右 --> hal层上报INITLONGLONGPRESS事件, 进入app_poweron_factorymode, 进入工厂模式DUT流程
PWRKEY开机一直拉高的方式
上面SDK默认的开机方式需要PWRKEY接入一个实体按键, 在实际项目中可能PWRKEY不会接入实体按键, 博主最近开发的一个项目PWRKEY开机的时候是一直拉高的方式.
这种方式常用在头戴式耳机中, 适用于PWRKEY脚接了一个拨动开关和PWRKEY脚接入一个霍尔开关来控制, 开机的时候PWRKEY脚一直为高电平, 关机状态的时候PWRKEY脚处于低电平. 那如果这种方式开机, 走默认SDK流程的话, 按上面的分析会直接进入INITLONGLONGPRESS, 进入了工厂模式, 从而没办法正常使用.
这种PWRKEY硬件接法软件上需要做改动, 可以在target.mk中打开宏开关POWERKEY_CTRL_ONOFF_ONLY, 这样开机就会跳过上面的步骤直接走POWERON_CASE_NORMAL开机流程开机
没有PWRKEY的开机方式
除了上面两种情况之外, 还有一种是硬件上直接不接PWRKEY, 芯片完全使用5V来进行开机启动, 芯片关机状态, 只要有5V给到CHARGE脚则开机启动. 这种方式常见TWS耳机项目开发中, 依靠充电盒中的5V开机耳机并进入到对应对应的流程.
在上面打开POWERKEY_CTRL_ONOFF_ONLY的基础上再打开NO_PWRKEY开关, 这样芯片启动的时候就可以跳过PWRKEY开机流程, hal_key的makefile中有NO_PWRKEY的编译开关, 只需要在target.mk中将NO_PWRKEY置为1即可