CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

关于低功耗蓝牙使用的问题 GR551x

153***545

2022-09-28 15:58

我的蓝牙广播时间间隔设置如下请教下贵司FAE以下几个问题:

1、系统进入休眠后,蓝牙会2s后醒来自动广播吗?还是不重新初始化蓝牙就不会醒来,要自己设定时间自动唤醒

2、若第一点蓝牙会自动2秒醒来,那么它什么时候醒来有啥标志位可以看到醒来。(想蓝牙定时醒来时候做一次AD运算)

3、进入低功耗后,要是醒来,原先初始化的AD和PWM函数需要再重新初始化一下吗?

4、 pwr_mgmt_shutdown(PMR_MGMT_SLEEP_MODE);只需要调用这个函数就会进入休眠吗?还是得先提前把所有IO都设置一遍浮空?

5、pwr_mgmt_ultra_sleep(0);函数和 pwr_mgmt_shutdown(PMR_MGMT_SLEEP_MODE);这两个都是使能睡眠的,有什么区别呢?


0收藏

0赞成

{-}{-}

汇顶员工
2022-09-29 17:08

您好!

关于3,4,5

3、进入低功耗后,要是醒来,原先初始化的AD和PWM函数需要再重新初始化一下吗?

->如果基于APP driver开发,AD,PWM不需要再进行重新初始化,系统在睡眠时,会自动suspend register table,唤醒时,会自动resume register table;

APP driver 参考代码在如下路径:

GR551x_SDK_V1.7.0\projects\peripheral_app


如果基于HAL 开发,是需要客户自己开发suspend,resume register table的,我们不推荐客户这样使用。

HAL driver 参考代码在如下路径:

GR551x_SDK_V1.7.0\projects\peripheral

4、 pwr_mgmt_shutdown(PMR_MGMT_SLEEP_MODE);只需要调用这个函数就会进入休眠吗?还是得先提前把所有IO都设置一遍浮空?

--> 进入睡眠,需要进入睡眠模式,具体的可以参考PCS(power consumption service)工程:

对于非RTOS的需求

参考如下工程:

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs

注意几点:

a. 设置模式

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs\Src\platform\user_periph_setup.c


void app_periph_init(void)
{
#if !CFG_LPCLK_INTERNAL_EN 
    /* Turn off RC oscillator. */
    AON->RF_REG_5 = 0x000000A7;
#endif
	

    SYS_SET_BD_ADDR(s_bd_addr);
    ble_rf_tx_mode_set(BLE_RF_TX_MODE_LP_MODE);
    ble_rf_match_circuit_set(BLE_RF_MATCH_CIRCUIT_25OHM);
    wkup_key_init();
    pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);//设置模式
}

b. 模式说明

  • 目前SDK默认支持active 模式,sleep模式,idle模式,这几种模式可以通过调用pwr_mgmt_mode_set接口设置进入,该接口适用于RTOS及非RTOS版本;
/**@brief power manager model. */
typedef enum
{
    PMR_MGMT_ACTIVE_MODE = 0x0,       /**< Full speed state. */
    PMR_MGMT_IDLE_MODE,               /**< Idle state. */
    PMR_MGMT_SLEEP_MODE,              /**< Deep sleep state. */
} pwr_mgmt_mode_t;
  • 对于ultra deep sleep模式,需要调用pwr_mgmt_ultra_sleep()接口,该接口适用于RTOS及非RTOS环境;

c. 调用pwr_mgmt_schedule()接口

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs\Src\user\main.c 中main函数中:

...
while(1)
{
     pwr_mgmt_schedule();
}

对于RTOS 需求

请参考如下工程:

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos

a. 模式设置的接口与非RTOS一致

pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos\Src\platform\user_periph_setup.c

void app_periph_init(void)
{
    SYS_SET_BD_ADDR(s_bd_addr);
    bsp_log_init();
#if APP_LOG_STORE_ENABLE
    log_store_init();
#endif
    dfu_port_init(NULL, NULL);
    pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);
}

b. 电源管理调度已默认集成至FreeRTOS

相关实现:GR551x_SDK_V1.7.0\external\freertos\tasks.c 3260行


static portTASK_FUNCTION( prvIdleTask, pvParameters )
line 3324:
        extern void vPortEnterDeepSleep( TickType_t xExpectedIdleTime );
        /* It is not desirable to suspend then resume the scheduler on
         * each iteration of the idle task.  Therefore, a preliminary
         * test of the expected idle time is performed without the
         * scheduler suspended.  The result here is not necessarily
         * valid. */
        volatile TickType_t xExpectedIdleTime = prvGetExpectedIdleTime();
        if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
        {
            vTaskSuspendAll();
            xExpectedIdleTime = prvGetExpectedIdleTime();
            vPortEnterDeepSleep(xExpectedIdleTime);
            xTaskResumeAll();
        }
   }

GR551x_SDK_V1.7.0\external\freertos\portable\GR55XX\port_pm.c 348行

TINY_RAM_SECTION void vPortEnterDeepSleep(TickType_t xExpectedIdleTime)
{
    s_rtos_idle_ticks = xExpectedIdleTime;

    if (xExpectedIdleTime < 5)
    {
        ultra_wfi();
        return;
    }

    if (PMR_MGMT_SLEEP_MODE != pwr_mgmt_mode_get())
    {
        ultra_wfi();
        return;
    }

    pwr_mgmt_enter_sleep_with_cond(xExpectedIdleTime);
}

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos\Src\user\main.c

int main(void)
{
    app_periph_init();                                              /*<init user periph .*/
    ble_stack_init(&s_app_ble_callback, &heaps_table);              /*< init ble stack*/
    xTaskCreate(vStartTasks, "create_task", 512, NULL, 0, NULL);    /*< create some demo tasks via freertos */
    vTaskStartScheduler();                                          /*< freertos run all tasks*/
    for (;;);                                                       /*< Never perform here */
}

GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos\Src\platform\user_periph_setup.c


	void app_periph_init(void)
	{
			SYS_SET_BD_ADDR(s_bd_addr);
			bsp_log_init();
	#if APP_LOG_STORE_ENABLE
			log_store_init();
	#endif
			dfu_port_init(NULL, NULL);
			pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);//设置模式
	}

关于IO部分,在底层SDK已默认对寄存器进行suspend 及resume 操作,如果使用APP driver,可以不用管睡眠前,以及唤醒后的相关恢复动作,但是需要考虑睡眠情况下对GPIO口的状态配置对整个系统的功耗影响,这个部分可以根据实际电路进行配置,减少睡眠下的IO漏电,这个部分也可以参考《GR551x睡眠模式及功耗测量说明》的相关章节。

5、pwr_mgmt_ultra_sleep(0);函数和 pwr_mgmt_shutdown(PMR_MGMT_SLEEP_MODE);这两个都是使能睡眠的,有什么区别呢?

pwr_mgmt_ultra_sleep 接口可以是系统进入ultra deep sleep mode, pwr_mgmt_shutdown不推荐客户直接使用,PMR_MGMT_SLEEP_MODE 指的是配置进入sleep mode,sleep mode 与 ultra deep sleep mode不一致,建议内容如上4回答。


关于电源管理更多可以参考如下内容:

a.《GR551x Power Consumption Profile示例手册》https://docs.goodix.com/zh/online/detail/gr55xx_power_consumption_profile_example_guide/V2.2/6a83d6a19cfa9763675e68b97516d013

b. 《GR551x睡眠模式及功耗测量说明》https://docs.goodix.com/zh/online/detail/gr55xx_power_consumption_profile_example_guide/V2.2/6a83d6a19cfa9763675e68b97516d013


谢谢!





0条评论

0赞成

1收藏

您的评论

153***545

2022-09-30 10:15

那关于1.2点呢?


1条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注