有关CH585三模例程中RF低功耗睡眠处理的讲解

一、LP模式

一级睡眠、保持连接

①浅睡时间到达,可主动调用:

image

 

②idel_sleep_flag成立后,启动RF_SLEEP_EVENT,

image

 

③上报率切换任务解析:

/*********************************************************************
 * @fn      app_switch_samping_rate
 *
 * @brief   is_connected : 如果当前已连接成功,填TURE,否则填FALSE
 *
 * @return  none
 */
/*查看dongle侧配对任务中定义的bound.pertime值,该值为RTC中断间隔*/
void app_switch_samping_rate(uint16_t new_rate, uint8_t is_connected)
{
    samping_rate = new_rate;
    if(work_mode==MODE_2_4G)
    {

        if(samping_rate>500)//1KHz及以上,采用0分频,即不分频,通过主循环的LowPower_Idle实现低功耗
        {
            //1KHz以上,使用sleep来不及睡眠唤醒,因此采用idle形式做低功耗处理
            RFRole_LowPower( 0 );
            TMR0_TimerInit(FREQ_SYS / (samping_rate-1));//设置与上报率对应的定时器定时周期
            TMR0_Disable();
            tmos_stop_task(app_taskId, APP_LOWPOWER_SEND_PACKET_EVT);
            tmos_stop_task(app_taskId, APP_SLEEP_EVENT);
            if(is_connected)
            {
                TMR0_Enable();
                TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);
                PFIC_EnableIRQ(TMR0_IRQn);//启动定时器中断
            }
        }
        else//dongle端pertime设置的是32ms一次通讯连接
        {
            if((!samping_rate_recover) || (samping_rate == samping_rate_recover))//如果samping_rate_recover标志为0,说明没有进入idle睡眠阶段
            //此处也可用if(!idle_sleep_flag)判断代替
            {
                if(samping_rate>250)//500Hz
                {
                    RFRole_LowPower( 16 );;//16分频->2ms一次通讯连接,最多睡眠2ms会被RTC产生中断唤醒起来执行一轮主循环
                }
                else if(samping_rate>125)//250Hz
                {
                    RFRole_LowPower( 8 );//8分频->4ms一次通讯连接,最多睡眠4ms会被RTC产生中断唤醒起来执行一轮主循环
                }
                else//125Hz
                {
                    RFRole_LowPower( 4 );//4分频->8ms一次通讯连接,最多睡眠8ms会被RTC产生中断唤醒起来执行一轮主循环
                }
            }
            else//保持连接、待机模式,采用0分频,即不分频->32ms一次通讯连接,最多睡眠32ms会被RTC产生中断唤醒起来执行一轮主循环
            {
                RFRole_LowPower( 0 );
            }
            TMR0_Disable();//关闭定时器外设,低功耗期间,不依赖定时器做键扫
            if(is_connected)
            {
                last_rtc_count = RTC_GetCycle32k();
                tmos_set_event(app_taskId, APP_LOWPOWER_SEND_PACKET_EVT);//启动低功耗睡眠任务(可用做低功耗期间的扫描标志位)
            }
        }
    }
}

 

 

④APP_LOWPOWER_SEND_PACKET_EVT解析:

image

 

⑤主循环:

image

 

⑥查标志做一次采样、本例程以模拟数据发送作为示例:

image

 

⑦执行完采样,会跑入睡眠任务,

image

image

 

⑧此低功耗阶段,有三种方式退出,恢复工作状态:

1、产生GPIO中断唤醒(GPIO唤醒不会再重启APP_LOWPOWER_SEND_PACKET_EVT),唤醒后调用RF_weakup();可恢复进入低功耗前的原上报率模式;

2、低功耗期间主动调用了发送数据接口rf_send_data

3、低功耗期间主动调用app_switch_samping_rate接口,切换至1K-4KHz模式;

 


 

二、8K模式

一级睡眠,保持连接

同LP模式,一级待机时间到达,执行函数:

image

运行睡眠任务:

image

 

 空闲任务讲解,除了下列的TMR3,由于idle的唤醒源有非常多,任何事件都可以唤醒,必须关闭其他所有外设的中断和事件配置,否则无法低功耗:

image

 

posted @ 2026-04-23 12:18  oTvTo  阅读(307)  评论(0)    收藏  举报