嗨对话框,
我们需要在主循环中的速度更新广告地址和数据。
附加的Arch_Main.c可以工作除了地址和数据的有时不一致。
例如,根据应用程序逻辑,如果我们以这种方式更新:
地址数据
xx:xx:xx:xx:xx:00信息00
XX:XX:XX:XX:XX:01 INFO01
我们应该得到以下信息:
地址数据
xx:xx:xx:xx:xx:00信息00
XX:XX:XX:XX:XX:01 INFO01
事实上,我们有时会得到以下意想不到的结果:
地址数据
XX:XX:XX:XX:XX:01 INFO00
我们认为,广告地址更新(通过写入寄存器BLE_BDADDRL_REG和BLE_BDADDRU_REG)可以立即完成,
广告数据更新(通过GAPM_UPDATE_ADVERTES_DATA消息)被延迟或不与广告过程同步。
虽然sdk6中的ble\u app\u nonco示例可以实现我们的函数,但代价似乎很高,我们希望更新主循环中的任何内容以减少当前消耗。
那么,是否有任何其他方法可以安全更新?
提前致谢!
此致,
彼得
------------------------------------------------------------------------------
...
uint8\ t fly\ u update\ u count\ u attribute\ uuuuuuuuuuuuuuu((节(“保留\内存\区域0”),零\初始化));
extern void adv_addr_update(void);/ *更新广告设备地址* /
外部void adv_data_update(void);/*更新广告数据*/
....
int main(空白)
{
睡眠模式\u t睡眠模式;
//初始化保留模式
init_retention_mode();
//全局初始化
system_init();
/ *
************************************************************************************
*平台初始化
************************************************************************************
*/
而(1)
{
做{
//安排所有待处理的事件
在启用时安排时间();
}
while(app\u asynch\u proc()!=去睡觉)//授予应用程序控制权,尝试关闭电源
//如果应用程序返回goto_sleep
//在这里更新!!!
fly_update_count++;
if((fly\u update\u count%50)==0)
{
adv_addr_update();
adv_data_update();
}
...
//等待中断,如果允许这样做,请睡觉
if(((!ble_app_present)&&(check_gtl_state()))||(ble_app_present)))
{
//禁用中断
global_int_stop();
app_asynch_sleep_proc();
//获取允许的睡眠模式
//从rwip_power_down()到wfi()的时间必须尽可能短!!
sleep_mode = rwip_power_down();
if((sleep_mode==mode_ext_sleep)| |(sleep_mode==mode_ext_sleep_otp_copy))
{
//关闭收音机,无论允许的信息
进入睡眠(睡眠模式);
//在延长睡眠模式下,看门狗定时器被禁用
//(电源域PD_SYS自动关闭)。虽然,如果调试器
//附加看门狗定时器保持启用,必须明确
//禁用。
if((GetWord16(SYS\u STAT\u REG)&DBG\u IS\u UP)==DBG\u IS\u UP)
{
wdg_freeze();//停止看门狗定时器
}
//等待中断恢复操作
WFI();
//恢复操作
ARCH_RESUME_FROM_SLEEP();
}
否则if(sleep_mode == mode_idle)
{
如果((!BLE_APP_PRESENT)(&check_gtl_state())| |(BLE_APP_PRESENT))
{
//等待中断恢复操作
WFI();
}
}
//恢复中断
global_int_start();
}
wdg_reload(watchdog_default_period);
}
}
嗨Peter Luo,
我不确定究竟是你的要求是关于广告数据更新的要求,据我所知,你的问题是因为定时器醒来,BLE_APP_NONCONN项目不适合您,所以你想减少它额外从计时器唤醒并发送命令,以便在主循环中更新广告数据。你可以尝试的是不要用SDK弄乱,是在.app_on_ble_powered回调中放置广告更新命令,然后在向堆栈发出该命令时,您可以强制持续到更长时间才能保持持续您将通过返回keep_power的命令安排的命令,在命令计划之后,您可以从app_on_ble_powered返回goto_sleep。
关于更改bd地址,不建议通过直接写入585的寄存器来更改设备的bd地址,特别是当设备播发时,您应该让堆栈处理任何更改,也不建议在播发时更改设备的bd地址,因此,您必须停止播发过程更改db地址,然后使用新的bd地址进行播发。一般来说,关于固定BLE地址(公共或静态)的BLE规范定义了静态地址在eash电源循环后可以更改,地址可以在产品生命周期(公共)内固定,也可以在重新启动期间更改,因此,为了在不处理此类问题的情况下更改bd地址,您应该重置堆栈并让app\u easy\u gap\u dev\u configure()更改设备的bd地址,使用app\u easy\u gap\u dev\u config\u get\u active()以获取就绪消息,更改bd地址并更改地址。
谢谢你的对话
嗨对话框,
非常感谢您所以有用的信息!
布鲁克/彼得
嗨对话框,
我正试图改变的BD地址的飞行,因为你已经提到上述。启动后,我运行一个计时器,并在其中我想不断改变BD地址不同的值。我向堆栈发送一个重置,并在app\u easy\u dev\u configure()断点处着陆。但是如何使用app\u easy\u gap\u dev\u config\u get\u active()更改BD地址呢。谢谢你的帮助。谢谢。
嗨raghu.sbd,
当触发app_easy_gap_dev_configure()时,您应该更像如下修改它:
void app_easy_gap_dev_configure(void)
{
uint8_t bd [6] = {0xc2,0x2a,0x35,0xd7,0x7b,0xD3};
struct gapm_set_dev_config_cmd*cmd=app_easy_gap_dev_config_create_msg();
if(bd_flag){memcpy(cmd-> addr.addr,bd,6);}
app_gapm_configure_msg_send(cmd);
设置\u dev \u config \u cmd=NULL;
}
谢谢,下午好
嗨PM_DIALOG.
感谢您的答复。我完全这样做了。
我试图用这个技术通过定时器每30秒切换一次我的BD地址。
每次重置后,设备地址都更改,并在User_App_Adv_start()函数中,我重新启动30秒的计时器。
但似乎计时器只运行几个迭代......
我们能做多少次有限制吗。
谢谢。
嗨raghu.sbd,
不,定时器运行的次数没有任何限制。计时器运行了多少次?当它停止运行时,您是否得到任何断言或硬错误?你能在调试模式下运行它吗?
谢谢,下午好
嗨pm_dialog,
谢谢回复。
我没有得到任何断言。我正在调试模式下运行。它似乎是一个多个定时器问题,因为很多人都抱怨了其他帖子。
我停止第二个定时器并仅运行这个主计时器时,一切似乎都在没有任何问题。
多次的任何例子?
谢谢
嗨raghu.sbd,
我工作在SDK的BLE_APP_BEAKEBONE示例中,我使用了位于User_App_Adv_Start()函数中的计时器,但我无法复制您的问题。你提到很多人为这个问题抱怨,所以请你能分享抱怨的论坛帖子吗?
谢谢,下午好