153***545
我的蓝牙广播时间间隔设置如下请教下贵司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);这两个都是使能睡眠的,有什么区别呢?
{-}{-}
您好!
关于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. 模式说明
/**@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;
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
谢谢!
153***545
那关于1.2点呢?
打开微信,使用“扫一扫”即可关注