1、用sdk5.0.4 睡眠例程为基础创建的的工程,在extended睡眠模式下,调式模式,程序烧写到otp,一切都正常,
2、当换到deep睡眠模式,修改配置如下:
#undef CFG_MEM_MAP_EXT_SLEEP
#define CFG_MEM_MAP_DEEP_SLEEP
const static sleep_state_t app_default_sleep_mode = ARCH_DEEP_SLEEP_ON;
还有就是把所有用到arch_set_extended_sleep()地方换为 arch_set_deep_sleep();
问题:
1、程序烧写到otp后,无法进入睡眠
2、我的广播设备名为固定的名字动态的加上mac地址 ;如Dialog 80EACA000005;mac烧写在otpHeader里面的,第一轮广播的时候名字没有问题,但在第二轮广播后名字里面的mac部分就没有加上,我的名字逻辑部分添加在app.c里面的static struct gapm_start_advertise_cmd* app_easy_gap_undirected_advertise_start_create_msg(void)这个函数里面的。
请问这是什么原因,怎么解决呢,谢谢!
Keywords:
Device:
1. 你的方法应该没有问题,是不是在完成测试烧录OTP之前忘记把CFG_DEVELOPMENT_DEBUG 去定义了?如果CFG_DEVELOPMENT_DEBUG 还是定义过的话设备是无法进入deep sleep的,因为
/* - SysRAM is not powered down in deep sleep mode. Allows developer to run applications using Deep Sleep */
2. 不清楚你具体怎么做的名字逻辑,不过static struct gapm_start_advertise_cmd* app_easy_gap_undirected_advertise_start_create_msg(void)都是从NVDS_TAG_DVICE_NAME里面拿设备名字的,可不可以试着在NVDS_TAG_DEVICE_NAME被调用之前把你的名字+地址写到NVDS_TAG_DEVICE_NAME里面?
您好,CFG_DEVELOPMENT_DEBUG 是去定义了的。
我判断可能是这个函数void user_app_adv_undirect_complete(uint8_t status)里面的问题
如果sdk的睡眠例程里面这个函数这样写就睡眠不了
uint8_t advtimes=0;
void user_app_adv_undirect_complete(uint8_t status)
{
如果状态= = GAP_ERR_CANCELED)
{
advtimes++;
if(advtimes>=2)
{
advtimes=0;
arch_ble_ext_wakeup_on();
app_button_enable();
}
else
user_app_adv_start();
}
}
不知道这是什么情况?
应该是末尾那个user_app_adv_start()函数的问题,这个函数除了开始广播之外还做了其他事情,计划下一次的广播内容更新,重新准备广播内容,动态更新自定义生产商内容,设置deepsleep模式等等,你把它加在这里不太合适。
这个程序默认是广播10秒后停止广播,期间默认就是Deep sleep, 只有在连接到设备的时候才会改成extended sleep,修改睡眠模式的话只去关心那部分应该就行了。
你修改上面这个call back函数的目的应该是睡眠之前多广播几遍,其实可以直接修改APP_ADV_DATA_UPDATE_TO这个参量来改变10秒默认的时间来达到,这个函数最好保持原样。
我觉得你可以再看看UM-B-050 文档的8.50部分开始,详细了解一下这个例程
哪儿可以下载到UM-B-050 文档呢
网上就有