嗨,对话,
我们需要更新广告地址和数据在主循环飞行。
附加的arch\u main.c可以工作,除了有时地址和数据不一致。
例如,根据应用程序逻辑,如果我们这样更新:
addr数据
XX:XX:XX:XX:XX:00 Info00
xx:xx:xx:xx:xx:01信息01
我们应该得到以下情况:
addr数据
XX:XX:XX:XX:XX:00 Info00
xx:xx:xx:xx:xx:01信息01
事实上,我们有时会出现意外结果:
addr数据
XX:XX:XX:XX:XX:01 INFO00
我们认为,广告地址更新(通过写入寄存器BLE_BDADDRL_REG和BLE_BDADDRU_REG)可以立即完成,
广告数据更新(通过GAPM\ U update\ U ADVISTED\ U data消息)延迟或与广告过程不同步。
虽然SDK 6中的示例BLE_APP_NONCON可以在没有不一致的情况下实现我们的功能,但成本似乎很高,我们希望在主循环中更新任何内容以降低电流消耗。
那么,还有其他安全更新的方法吗?
提前谢谢!
致以最诚挚的问候,
彼得
-----------------------------------主拱门---------------------------------------------
......
UINT8_T FLY_UPDATE_COUNT __ATtribute __((部分(“RETETINE_MEM_AREA0”),ZERO_INIT));
外部void adv_addr_update(void);/*更新播发设备地址*/
extern void avd_data_update(void);/ *更新广告数据* /
....
int主(空)
{
sleep_mode_t sleep_mode;
//初始化保留模式
初始化保留模式();
//全球初始化
系统初始化();
/*
************************************************************************************
*平台初始化
************************************************************************************
* /
而(1)
{
做 {
//安排所有挂起事件
schedule_hile_ble_on();
}
while(app_asynch_proc()!= goto_sleep);//授予控件到应用程序,尝试掉电
//如果应用程序返回GOTO\u SLEEP
//在这里更新!!!
fly_update_count ++;
if((fly_update_count%50)== 0)
{
adv_addr_update();
adv_data_update();
}
......
//如果允许的话,等待中断并进入睡眠状态
如果((!BLE_APP_PRESENT)&(check_gtl_state())| |(BLE_APP_PRESENT))
{
//禁用中断
全局\u INT \u STOP();
app_asynch_sleep_proc();
//获取允许的睡眠模式
//从rwip\u power\u down()到WFI()的时间必须尽可能短!!
sleep_mode=rwip_power_down();
if((sleep_mode == mode_ext_sleep)||(sleep_mode == mode_ext_sleep_otp_copy)))
{
//关掉收音机和任何允许的东西
Arch_Goto_Sleep(Sleep_Mode);
//在扩展睡眠模式下,看门狗定时器被禁用
//(power domain PD\ U SYS自动关闭)。不过,如果调试器
//如果已连接,则看门狗计时器将保持启用状态,并且必须显式
//已禁用。
if((getword16(sys_stat_reg)&dbg_is_up)== dbg_is_up)
{
wdg_freeze();//停止看门狗定时器
}
//等待中断恢复操作
注射用水();
//恢复操作
arch_resume_from_sleep();
}
else if(睡眠模式==空闲模式)
{
if((!ble_app_present)&& check_gtl_state())||(ble_app_present))
{
//等待中断恢复操作
注射用水();
}
}
//恢复中断
全局\u INT \u START();
}
wdg\U重新加载(看门狗\U默认\U周期);
}
}
你好,罗彼得,
我不确定究竟是你的要求是关于广告数据更新的要求,据我所知,你的问题是因为定时器醒来,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_easy_gap_dev_configure()更改设备的BD地址,使用app_easy_gap_dev_config_get_active()以获取就绪消息,更改BD地址并更改地址。
谢谢mt_dialog.
嗨,对话,
非常感谢您提供的有用信息!
比尔/彼得
嗨,对话,
我正在尝试在上面提到的那样改变BD地址。启动后,我运行一个计时器,然后我想继续将bd地址更改为不同的值。我向堆栈发送重置,我在app_easy_dev_configure()断点中的土地。但我如何使用app_easy_gap_dev_config_get_active()来更改BD地址。感谢您的帮助。谢谢。
你好RAGHU.SBD,
当app\u easy\u gap\u dev\u configure()被触发时,您应该修改它,如下所示:
void app\u easy\u gap\u dev\u configure(无效)
{
uint8\u 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\u标志){memcpy(cmd->addr.addr,bd,6);}
app\u gapm\u configure\u msg\u send(命令);
set_dev_config_cmd = null;
}
谢谢,PM_DIALOG.
Hi PM\u对话框
谢谢你的回复。我确实做到了。
我尝试每30秒使用该技术使用计时器切换我的BD地址。
每次重置后,设备地址都会更改,在user\u app\u adv\u start()函数中,我会重新启动30秒计时器。
但似乎计时器只运行了几次迭代。。。
重置ble堆栈是否有多少次,我们可以做到。
谢谢。
你好RAGHU.SBD,
不,没有任何限制OM定时器运行多少次。计时器运行多少次?当它停止运行时,您是否得到了任何断言或硬质难?你能在调试模式下运行它吗?
谢谢,PM_DIALOG.
嗨,PM\U对话,
谢谢你的回复。
我没有得到任何断言。我正在调试模式下运行。这似乎是一个多定时器的问题,因为许多人抱怨在其他职位。
当我停止第二个计时器并只运行这个主计时器时,一切似乎都正常工作,没有任何问题。
有多次的例子吗?
谢谢
你好RAGHU.SBD,
我在SDK的ble\u app\u bearebone示例中工作,并使用了user\u app\u adv\u start()函数中的计时器,但我无法复制您的问题。你提到很多人抱怨这个问题,所以你能分享论坛帖子抱怨吗?
谢谢,PM_DIALOG.