你好,
我一直在使用DA14583单片机。现在我的定制板已经准备好了PIR传感器Azoteq(IQS621) MCU。
我的所有功能都很好,没有任何问题的Azoteq传感器与DA14583的接口。
现在,我需要做一个睡眠模式配置,我的定制设备持续2年的电池寿命。
我用2个AAA电池为设备供电。
我不能配置有中断的休眠模式,因为Azoteq传感器每10ms中断一次Dialog MCU进行I2C通信。
所以,任何人可以帮助我如何配置对话框MCU在睡眠模式配置的最长时间,它应该唤醒,无论何时有来自Azoteq传感器的数据。
同时,我正在与Azoteq MCU检查我如何可以减少当前消耗,如果你帮助对话MCU部分的睡眠模式配置,这将真的有帮助。
感谢和问候
罗希特R
设备:
嗨罗希特,
对不起,从你的问题中不清楚你是否想要在传感器的外部中断上唤醒。
您可以启用睡眠模式并指定一个或多个gpio来生成唤醒(有关唤醒计数器的详细信息,请参阅SW参考手册)。接近报告项目利用了这种唤醒机制。
如果你不想在传感器中断时被唤醒,你只需启用延长睡眠,并设置一个定时器来唤醒设备以查询来自传感器的数据,从而决定是保持清醒还是回到睡眠状态。
/ MHv
嗨MHv,
我不想唤醒设备与GPIO中断。由于传感器中断是为每10ms,所以我不能使用这个来唤醒设备,因为它与设备不睡眠状态一样好。我在硬件方面没有任何按钮。
如果你不想因为传感器的中断而被唤醒,你只需启用延长睡眠,并设置一个定时器来唤醒设备,以查询来自传感器的数据,从而决定是保持清醒还是回到睡眠状态。”
-根据你的评论,以下是我的理解,如果我错了请纠正我。
1.我必须使用计时器0或计时器1,其中我必须在设备进入睡眠状态时启动计时器,并在计时器的中断处理程序中唤醒它。[调用处理程序的时间期限由我根据每个应用程序决定]
但是,根据以上的了解,我有一些疑问,我想知道您的建议
1.在当前的固件中,我配置了计时器0为200ms来执行应用程序的其他任务。那么,我是应该按照您的建议使用相同的时间来实现唤醒算法,还是用其他方法来实现电池寿命为2年?
感谢和问候
罗希特R
嗨罗希特,
推荐的方法是利用应用程序计时器(app_easy_timer)。让我们假设您希望每秒唤醒并查询传感器。这可以通过设置如下所示的计时器来实现:
cb_my_timeout app_easy_timer (100);
第一个参数指定计时器在100 * 10 ms = 1000ms = 1s后超时。这时调用回调cb_my_timerout()。在这个回调函数中,您将实现数据轮询并再次设置计时器。查看软件参考手册了解app_easy_timer的详细信息(提示:它很容易使用;o)
你的电池非常大,所以我预计你可以轻松达到2年的电池寿命。
/ MHv
嗨MHv,
感谢您的反馈,
我将执行相同的,然后返回给你。
感谢和问候
罗希特R
感谢MHv_Dialog的建议!
嗨Rajapurerohit,
抱歉插进这个论坛帖子。你能让我们知道你是否需要进一步的支持吗?
谢谢,PM_Dialog
嗨PM_Dialog,
我正在努力,我的实现还没有完成。
因为我同时也在做其他的工作。所以我没有回答。
一旦我完成了执行,我会给你答复。
谢谢你的理解
罗希特R
嗨Rajapurerohit,
是的,请让我们知道当你继续执行
谢谢,PM_Dialog
嗨PM_Dialog,
我已经开始使用app_easy_timer()实现睡眠模式,并在前面建议的回调中唤醒。
但我很少怀疑,
案例1:
1)我已经配置设备ARCH_EXT_SLEEP_ON在user_config.h
2)然后使用5秒定时器计数,5秒后调用app_easy_timer() start [2sec]然后使用arch_set_extended_sleep()函数启用睡眠。
3)然后,在app_easy_timer disabled sleep的回调函数中,首先试图通过调用arch_disable_sleep()来唤醒,但没有成功,所以接下来尝试下面的函数
arch_disable_sleep ();
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
}
如果(arch_ble_ext_wakeup_get ())
{
arch_set_sleep_mode (app_default_sleep_mode);
arch_ble_force_wakeup ();
arch_ble_ext_wakeup_off ();
app_easy_wakeup ();
}
4)调试后,我知道我的5秒定时器功能只是没有执行,所以这导致整个睡眠逻辑失败。
案例2:
1)然后我保持ARCH_SLEEP_OFF在user_config.h
2)与情形1步骤相同。但这一次在5秒计时器过去后执行arch_set_extended_sleep()函数,设备停止广告
3)但是回调cb_my_timeout()函数没有执行,所以我不能看到设备唤醒和正常发布。
我不明白是什么问题,你能帮助我做错的地方吗?
如果你能引导我养成睡眠模式,那对我很有帮助。
感谢和问候
罗希特R
嗨Rajapurerohit,
你能检查一下SDK5.0.4的ble_app_sleepmode例子吗?它位于projects\target_apps\ble_examples\ble_app_sleepmode SDK路径下。在本例中,app_easy_timer()用于停止广告并将系统置于睡眠模式。然后,您可以通过GPIO中断唤醒芯片。
如果您正在开始一个新的设计或项目,我们建议从我们最新的名为DA14531的Smartbond设备开始。SDK得到了很大的改进,我们有很多代码示例和改进的文档,还有软件路线图支持。DA14580产品系列和SDK5没有任何软件路线图支持。
请查看DA14531产品页面:
//www.xmece.com/亚博电竞菠菜products/connectivity/bluetooth-low-energy/products/da14531
DA14531应亚博国际官网平台网址用程序:
-连接消费者:信标,智能标签,遥控器,接近标签,连接手表,手写笔,鼠标,玩具,低功耗传感器,蓝牙LE添加“BLE管道”到现有的应用亚博国际官网平台网址
-连接健康:连接注射器,吸入器,葡萄糖监测器,智能贴片,血压计,温度计
-汽车:轮胎压力,监控系统和低功率无线传感器
DA14531的最大好处是超低的成本和功率!
谢谢,PM_Dialog
嗨PM_Dialog,
谢谢你的回复,
我看到了ble_sleep的例子,但这对我来说没有用。因为我没有使用任何外部GPIO来唤醒设备,因为在这个产品的设计中没有使用GPIO引脚。
在ble_sleep的例子中,他们使用GPIO唤醒设备,而不是定期唤醒。在我的系统中,我需要定时睡觉和定时醒来的逻辑。
所以请帮助我定期起床和睡觉。
我的设备是,它的功能如下,请找到该设备的功能,并帮助我如何实现该设备的电池寿命为2年。
1)使用IQS621 I2C base代理传感器与我们的对话框DA14583单片机进行接口
2)在这里,我读取“RDY”引脚上的数据。IQS621传感器的RDY引脚每10ms中断一次读取数据[像Touch, Proxy和ALS]。基本上这个RDY引脚10ms中断窗口读取传感器I2C数据。[这个RDY中断我不能用于从睡眠中唤醒设备,因为它每10ms中断一次窗口]
3)接下来,如果触摸数据可用,我发送操作命令到其他设备,如果检测到任何Person时刻(即代理),我再次发送操作命令到其他设备。
4)在这里,当读取PIR数据[人的时刻]时,我检查具有一定阈值的ALS数据,如果两者都是阳性,则只向设备发送操作命令。如果没有人在场,就不要发出命令。
5)上述功能是有效的,并已得到证实。设备运行正常。
6)现在,为了设备的长寿命,我的下一步是睡眠mod配置。
因此,我想开发一个没有任何GPIO中断的睡眠模式配置。我的最终目标是“检查I2C基础传感器是否有几秒钟(例如2到5秒)的数据,然后如果没有数据,将进入睡眠模式,并在一段时间后再次检查数据。如果有数据持续保持清醒不去睡觉。这种重复的行为应该发生。”
还有不,我不会开始新项目的。
它是一款使用DA14583单片机,使用SDK 5.0.4开发的设备。所有的功能都得到了验证,并且已经为最终部署做好了准备。所以现在我专注于睡眠模式。
我将查阅DA14531设备相关文档,以了解您所分享的目的。
但我需要帮助的是SDK 5和DA14583设备的相关开发。
使用ble_app_sleepmode示例,我将尝试实现睡眠模式和管理设备睡眠,唤醒算法。如果有任何更新,我会尽快回复你。
感谢和问候
罗希特R
嗨罗希特,
请查看附件中的diff文件,用于在SDK的ble_app_sleep模式示例中实现定期唤醒和休眠。为了从永久睡眠模式中唤醒,使用BLE定时器。在这个演示中,系统播放了5秒的广告,然后停止广告并进入睡眠模式。它将在5秒后醒来,并将重新开始广告。请记住,在广告和连接间隔时间之间,设备会进入睡眠模式。此外,当处于睡眠模式时,所有外围域都将关闭。这个简单的演示演示了如何使用app_easy_timer() API来唤醒和休眠。您可以根据您的项目需求调整它。
谢谢,PM_Dialog
嗨PM_Dialog,
谢谢你的例子更新。
我正在浏览示例文件,但我不明白哪一行代码被注释了,哪一行被使用了。
diff文件不支持,所以我已经在notepad++上打开了它,但有些行使理解混乱。
右括号和左括号混淆了@@代表什么,有些行前面是+,有些行前面是-。
例如,
静态孔隙app_button_press_cb(空白)
+ * /
+静态孔隙app_wakeup_cb(空白)//哪个是左括号,哪个是右括号,哪个部分要去掉
{
- if (GetBits16(SYS_STAT_REG, PER_IS_DOWN))
+ periodic_wake_up_timer_used = EASY_TIMER_INVALID_TIMER;
+
+
if (GetBits16(SYS_STAT_REG, PER_IS_DOWN))
{
periph_init ();
}
@@ -239,39 +245,14 @@ static void app_button_press_cb(void)
arch_ble_ext_wakeup_off ();
app_easy_wakeup ();
}
- - - - - -}
-
- / * *
- ****************************************************************************************
- * @brief应用唤醒回调函数。在API消息实用程序中注册。
- * @返回void
- ****************************************************************************************
- * /
静态孔隙app_wakeup_cb(空白)
——{
+
//如果state不为idle,则忽略该消息
if (ke_state_get(TASK_APP) == APP_CONNECTABLE)
——{
+ {
user_app_adv_start ();
}
}
抱歉,但是如果可能的话,请您以不同的格式分享文件,可以很容易地打开和理解哪行代码被使用和哪行没有被使用,然后它真的会帮助我理解和进一步发展。
根据我对你共享的diff文件的了解。我已经尝试在我的项目文件用户外设.c和.h中实现相同的功能。请找到相同的txt文件。但是这个设备在做广告,看不到它睡了5秒然后醒来。为了检查这一点,我使用了BLE_Scaneer移动应用程序。让我知道如果我在配置中做错了什么。
谢谢你的理解
感谢和问候
罗希特R
嗨PM_Dialog,
请尽快让我知道你的反馈。
这件事对我来说非常紧急。
感谢和问候
罗希特R
嗨Rajapurerohit,
抱歉耽搁了。请在附件中找到你应该在SDK的ble_app_sleepmode示例中做的修改。请尝试SDK提供的一个干净的ble_app_sleepmode示例中的建议步骤。
谢谢,PM_Dialog
嗨PM_Dialog,
谢谢你更新的文件。
现在我可以打开文件了,我已经按照文件中提到的步骤操作了。
在下面的步骤2中,我使用了arch_set_extended_sleep()函数而不是arch_set_deep_sleep()函数
在user_config.h文件中启用ARCH_EXT_SLEEP_ON
/*第二步:修改user_app_adv_start() */
空白user_app_adv_start(空白)
{
app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb);
struct gapm_start_advertise_cmd * cmd;
cmd = app_easy_gap_undirected_advertise_get_active ();
//动态添加制造商特定数据
mnf_data_update ();
App_add_ad_struct (cmd, &mnf_data, sizeof(struct mnf_specific_data_ad_structure));
//广告播放时设置深度睡眠
arch_set_deep_sleep ();/ /函数arch_set_extended_sleep ();
app_easy_gap_undirected_advertise_start ();
}
但一旦设备进入睡眠模式就无法唤醒。不理解为什么?
我已经按照你在文件中提到的步骤做了。
请让我知道我在第二步做错了什么。
感谢和问候
罗希特R
嗨罗希特,
你在哪个项目中遵循了建议的步骤?您能否在调试模式下运行它并在app_wakeup_cb()中添加一个断点?
谢谢,PM_Dialog
嗨PM_Dialog,
我的项目是基于一个ble_peripheral的例子。
我只在调试模式下运行,我保持了断点,但程序不执行app_wakeup_cb()函数。
在user_app_adv_start()函数之后,将不再执行其他函数。
配置睡眠模式的步骤如下
1) user_config.h文件启用ARCH_EXT_SLEEP_ON
2)按照您共享的文件进行睡眠模式配置。在广告和连接之间配置休眠
在一段时间后程序被卡在函数下面的rwble.c文件中,
//开始修正
ble_deep_sleep_corr_en_setf (1);
if ((DEVELOPMENT_DEBUG) && (USE_POWER_OPTIMIZATIONS))
{
slp_period_retained = slp_period;
//如果这个断言命中,那么LP ISR持续的时间比时间长
//已经通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留。
If (sleep_lp_cycles && (sleep_lp_cycles < slp_period))
ASSERT_WARNING (0);-->在这一行代码在一段时间后停止了rwble.c文件
}
请尽快让我知道你的反馈
感谢和问候
罗希特R
嗨罗希特,
这种断言最可能的原因是lp_handler执行时间太长。这种警告意味着,BLE堆芯被唤醒的时间比计算值要长。sleep_lp_cycles是BLE核心进入睡眠前的编程睡眠量。slp_period是当设备最终被唤醒时所测量的实际睡眠时间。如果实际的睡眠时间比计划的要长,那么你可能会错过BLE事件。
如果设备处于唤醒状态且中断被禁用,则也会发生这种情况
因此,请检查您是否在代码的任何部分手动禁用了中断。
因为它是一个自定义代码和自定义板,我不能复制或调试这。我的建议是使用SDK的ble_app_sleepmode示例和我建议的步骤。你能复制这个吗?
此外,我假设您没有修改任何SDK文件。
谢谢,PM_Dialog
嗨PM_Dialog,
1)”如果设备处于唤醒状态且中断被禁用,那么也会发生这种情况,但是“-我没有得到这个点
2)”因此,请检查您是否在代码的任何部分手动禁用了中断。-不,没有损坏任何部件
3)”因为它是一个自定义代码和自定义板,我不能复制或调试这。我的建议是使用SDK的ble_app_sleepmode示例和我建议的步骤。你能复制这个吗?-好的,为了测试app_easy_timer,我可以测试ble_sleep的例子,但我的最终项目是基于ble_peripheral,现在我不能把整个项目转移到ble_sleep的例子,它现在是生产阶段。所以对我来说是不可能的。
-此外,如果需要,我可以与你分享我的项目文件,让我知道你的反馈。
4)”此外,我假定您没有修改任何SDK文件。-不,我没有修改任何SDK文件。
感谢和问候
罗希特R
嗨罗希特,
是的,如果可能的话,请分享您的项目。
谢谢,PM_Dialog
嗨PM_Dialog,
请找到该项目,但请确保该项目应该是私有的。
你和我都应该能进去,拜托了。
链接-https://drive.google.com/file/d/1J3VK3sf2iF9O180pDlde-w79oyPc9xcJ/view?u..。
我无法上传一个完整的项目,所以上传到驱动器上。让我知道这是不是你的权限。
感谢和问候
罗希特R
嗨罗希特,
我已经申请了权限。
谢谢,PM_DIalog
嗨PM_Dialog,
你现在能查一下吗?
嗨罗希特,
我下载了它,并保存在我的本地电脑上。我会检查一下代码,然后告诉你,
谢谢,PM_Dialog
嗨PM_Dialog,
我有什么新消息吗?
感谢和问候
罗希特R
嗨罗希特,
很抱歉我回复晚了。我们已经从论坛下线,我们已经要求我们的专家直接与您联系。
谢谢,PM_Dialog
嗨PM_Dialog,
是的,我收到了发行商的邮件,他们发送的是相同的文件diff文件,与你已经建议的步骤相同。我不能重复已经发生过的事情。所以希望你能尽快帮助我,这对我来说是非常紧急的。
谢谢你的理解。我期待在这个问题上得到积极的回应。
问候
罗希特R
嗨罗希特,
请按照下面的步骤在自定义代码和板中开始调试它。因为它是一个自定义代码,许多事情可能是根本原因,但我不能调试它,因为它是基于一个自定义板。
谢谢,PM_Dialog
嗨PM_Dialog,
谢谢你的反馈,
我在这里,
3.在debug中运行代码——”在调试中成功运行了代码"
4.app_easy_timer过期5秒后,BKPT必须命中。——“失败。BKPT没有打到线”
从第一天开始只有我被困住了。
感谢和问候
罗希特R
嗨,得益于他们,
你能在user_app_adv_undirect_complete()回调函数的if (status == gap_err_cancelled)行中添加一个BKPT吗?它打击吗?如果是,请按F10步进代码。哪一种行为?
谢谢,PM_Dialog
嗨PM_Dialog,
保持BKPT在if (status == gap_err_cancelled)行——"失败了,BKPT也没有击中这里。”
我想这是因为,我开启了延长睡眠模式
app_default_sleep_mode = ARCH_EXT_SLEEP_ON;在user_config.h文件
如果我删除这个,那么user_app_adv_undirect_complete()函数将执行,否则不会执行。
这里的问题是什么?开启延长睡眠模式是必须的,对吧?但不理解不执行的原因。
感谢和问候
罗希特R
嗨罗希特,
一旦广告停止或取消,就会触发user_app_adv_undirect_complete()回调函数。这意味着当adv_data_update_timer_cb()被触发并停止发布时,出现了一些错误。你能在adv_data_update_timer_cb()中添加一个BKPT吗?此外,您是否已启用或禁用看门狗?如果您在调试模式下运行代码而不添加任何BKPT,它会卡在什么地方吗?它是否卡在您在前面的评论中提到的断言中?
谢谢,PM_Dialog
嗨PM_Dialog,
如果我在use_config.h文件中启用EXT_SLEEP,并在user_peripheral.c文件中的user_app_adv_start中调用arch_set_extended_sleep()函数,就像您建议的diff文件或演示文件一样。
然后user_app_adv_undirect_complete(), adv_data_update_timer_cb()和其他函数不执行。
是的,在上面的睡眠配置中,代码在一段时间后会卡在断言警告中,这在前面的评论中提到过。
关于看门狗,我没有改变任何与看门狗有关的东西。一直是 , /****************************************************************************************************************/
/*开启看门狗定时器。* /
/****************************************************************************************************************/
#定义CFG_WDOG
感谢和问候
罗希特R
嗨罗希特,
我已经在SDK的ble_app_peripheral示例中使用DA14580 Pro-DK测试了这个逻辑,我能够定期唤醒设备。我将与附件中的diff文件共享。请在SDK的ble_app_peripheral示例中做同样的更改。我的建议是在一个干净的SDK安装中遵循更改,并且应该使用SDK提供的示例。
这个断点会出现,因为BLE_WAKEUP_LP_Handler()花费的时间比它应该花的时间长,所以您的代码会进入您之前发布的断言。在唤醒时,从BLE_WAKEUP_LP_Handler()调用peri_init()函数。因此,也许在外设_init()函数中,您的应用程序代码花费的时间比它应该花的时间要长。此外,该断言命中后,LP ISR持续的时间比通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留的时间更长。
我检查了你发给我的项目中的peri_init()函数,我看到你已经放置了一段代码,大大延迟了系统。您应该删除I2C和Timer 0初始化、所有SPI flash事务和“更新数据库”。
谢谢,PM_Dialog
嗨PM_Dialog,
非常感谢你的回复,
我已经按照您共享的diff文件的步骤进行了操作,有几行代码与其他行代码重叠,但根据我的理解,我做了相同的测试更改。
如果可能,你能分享一个文件,就像以前共享,这样我就不会错过任何部分/行代码。
/**************************************************************************
" periodic_wake_up_timer_used = EASY_TIMER_INVALID_TIMER;
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
}"
*********************************************************************************/
-上述部分代码出现在先前的app_wakeup_cb()函数的共享文件中,但在当前的ble_peripheral_diff文件中,它没有被提及。你能告诉我是否需要吗?
“我检查了你发给我的项目中的peri_init()函数,我看到你放置了一段代码,大大延迟了系统。您应该删除I2C和Timer 0初始化、所有SPI flash事务和“更新数据库”。”- - -如果我删除这个,那么我应该在哪里初始化所有这些函数?因为这些对我的项目是必要的"
感谢和问候
罗希特R
嗨PM_Dialog,
我已经按照diff文件和我的理解在我最后的代码中只做了更改。
以下是步骤,
1)注释I2C和Timer 0的初始化,所有SPI flash事务和“更新数据库”的所有初始化函数从peri_init()函数。
2)根据diff文件进行配置,如我所理解,在user_config.h文件和app_wakeup_cb()中启用EXT_SLEEP,修改了user_app_adv_undirect_complete()和user_app_adv_start()函数。
3)保持BKPT在线- "periodic_wake_up_timer_used = app_easy_timer(APP_PERIODIC_WAKE_UP_TO, app_wakeup_cb);"-“执行成功”
4)保持BKPT在线- "if (arch_ble_ext_wakeup_get())"-“执行成功”
5)每5秒执行第3步和第4步
但是如果取消注释所有初始化函数(步骤2),那么再次回调未执行的代码(步骤3和步骤4)。那么在哪里初始化这些函数?所有这些都是必要的。
感谢和问候
罗希特R
嗨罗希特,
请查收附件你应该做的修改。您可以在user_app_init()回调函数中修改该函数。我们通常在这里放置所有的初始化代码。
谢谢,PM_Dialog
嗨PM_Dialog,
我已经比较了文件和我的文件,两者是一样的。我已经按照你建议的步骤配置好了。
执行,
1)保持BKPT在线- "periodic_wake_up_timer_used = app_easy_timer(APP_PERIODIC_WAKE_UP_TO, app_wakeup_cb);"-“执行成功”
2)保持BKPT在线- "if (arch_ble_ext_wakeup_get())"-“执行成功”
并且在user_app_init()回调函数中初始化了所有的i2c、timer和flash。代码现在正在执行步骤1和步骤2。
接下来,我将测试使用这些集成的最终代码,并进行端到端测试。
我会测试最终的代码,并相应地报告你。
感谢和问候
罗希特R
嗨PM_Dialog,
我已经在最终代码中集成了所有步骤,并能够执行之前共享的两个步骤[5秒唤醒]。
但我无法连接设备,无法读取I2C传感器数据。我正在调试相同的。
同时,如果你可以建议我什么可能是错误的,然后我也将调试。
感谢和问候
罗希特R
嗨罗希特,
请在user_app_on_connection(0)回调函数中添加一个断点,并尝试步进代码。代码在连接时做什么?
谢谢,PM_Dialog
嗨PM_Dialog,
下面两行只执行两次,
执行,
1)保持BKPT在线- "periodic_wake_up_timer_used = app_easy_timer(APP_PERIODIC_WAKE_UP_TO, app_wakeup_cb);"-“成功执行x2”
2)保持BKPT在线- "if (arch_ble_ext_wakeup_get())"-“成功执行x2”
之后的代码不会执行,设备也不会发布
正如你所建议的,我已经在user_app_init()函数中初始化i2c,定时器和flash,但我无法读取传感器数据。
感谢和问候
罗希特R
嗨PM_Dialog,
经过逐级调试,观察到以下几点:
1)我已经按照你的建议配置了我最终的代码
2)然后,首先注释所有的初始化形式的peri_init()函数。
3)和,初始化相同的user_app_init()根据您的建议
4)在调试模式下只运行两次执行的睡眠步骤(我上周已经写了这些步骤,仍然没有回复)和I2C不工作。没有从传感器获取值。
5)所以,再次,我删除了所有初始化从user_app_init()函数也(I2C,定时器,flash读取所有函数删除),它观察到睡眠步骤正在执行每个文件共享由你。
我的结论是,如果我们删除I2C和其他init函数,那么睡眠就可以工作,否则就不能工作。
但我不明白在哪里和如何初始化函数然后?
这件事我急需帮助,因为我已经错过了最后期限。
感谢和问候
罗希特R
嗨Rahu,
请在调试模式下运行代码。你说过这不会被执行。
我的问题是:既然你的代码没有被执行,它会做什么?
这是定制的设计,它基于定制板,所以我不能复制你的任何问题。请在调试模式下运行您的代码,并帮助我理解行为。
每隔5秒,设备就会停止广告并进入永久睡眠模式。
休眠模式下,所有外设域(包括I2C)均下电。此外,在广告和连接间隔期间,系统将进入睡眠模式。因此,当没有任何I2C, flash等活动时,休眠模式是正常工作的。也许您应该在app_wakeup_cb()中重新初始化这些函数。但这是特定于应用程序的。
为了具有I2C、SPI等活性,系统应该处于主动模式。
谢谢,PM_Dialog
嗨PM_Dialog,
请查看测试遵循的步骤,
例1)
1)睡眠模式配置为10sec
2)在user_app_init()函数中只调用I2C init函数
3) I2C init步进和步过执行
4)传感器配置寄存器写步过和步进-执行
5)两次唤醒回调函数执行
6)设备停止投放广告
例2)
1)睡眠模式配置10秒
2)调用user_app_init()函数中唯一的定时器init函数
3) timer_init()步进和步过执行
4)两次唤醒回调函数执行
5)设备停止投放广告
例3)
1)睡眠模式配置为10sec
2)在user_app_init()和唤醒回调函数中调用I2C init和timer函数
3) I2C init和timer步进和步过执行
4)传感器配置寄存器写步过和步进-执行
5)两次唤醒回调函数执行
6)设备停止投放广告
例4)
1)睡眠模式配置为10sec
2)注释了user_app_init()和唤醒回调函数中的所有I2C init、timer函数
3)两次以上的唤醒回调函数执行
4)但当使用BLE Scanner应用程序试图连接到设备时,它是连接的,但一段时间(约10秒)后设备断开
5)然后该设备就不再做广告了(广告停止了)
例5)
1)关闭睡眠模式配置
2)在user_app_init()函数中初始化I2C,定时器
3)设备广告,能够读取传感器数据
4)连接也稳定
让我知道什么可能是错误的和你的反馈。我正在进一步测试,如果有什么我会更新你,但让我知道你的观点。
感谢和问候
罗希特R
因为你停止做广告,进入睡眠模式,然后醒来。还可以将外围设备重新初始化到app_wakeup_cb()回调中。
如果我理解正确的话,案例1-2-3-5按预期执行。但你说的下面是什么意思:
1)睡眠模式配置为10sec
2)在user_app_init()函数中只调用I2C init函数
您的意思是设备唤醒后才初始化I2C ?
案例5:
4)但当使用BLE Scanner应用程序试图连接到设备时,它是连接的,但一段时间(约10秒)后设备断开
在user_app_on_connection()中添加断点并尝试步进代码?您是否得到了任何断言,或者代码是否卡在了某个地方?连接之后的代码行为是什么?也许你应该取消“周期计时器”,但我不确定,因为我无法复制它在我的身边。
谢谢,PM_Dialog
嗨PM_Dialog,
如果我理解正确的话,案例1-2-3-5按预期执行。-“不,在1-2-3-4情况下,代码没有按照预期执行,它只唤醒两次,在那之后,没有广告,代码也没有卡在任何地方。只有第5种情况在执行,并且能够读取传感器数据,因为我已经禁用了睡眠模式。”
1)睡眠模式配置为10sec -“意思是你建议配置5秒,我已经配置了10秒”
2)在user_app_init()函数中只调用I2C_init函数- "意思是,除了i2c_init(),我已经注释了所有其他函数timer和flash read "
4)但当使用BLE Scanner应用程序试图连接到设备时,它是连接的,但一段时间(约10秒)后设备断开
在user_app_on_connection()中添加断点并尝试步进代码?您是否得到了任何断言,或者代码是否卡在了某个地方?连接之后的代码行为是什么?也许你应该取消“周期计时器”,但我不确定,因为我无法复制它在我的身边-"我在user_app_connection()函数中跳过,没有断言警告,不,代码没有卡在任何地方。App_easy_timer取消函数已经存在于连接函数中"
感谢和问候
罗希特R
嗨PM_Dialog,
有什么新消息吗?
感谢和问候
罗希特R
嗨罗希特,
我很困惑发生在你的代码,因为它是自定义项目/板,我不能复制你的任何问题。
在案例5中,您提到禁用了睡眠模式。你指的是定期广告吗?
您是否启用或禁用了WDOG ?在案例1-4中,代码的行为是什么?您是否尝试添加断点和步进代码?
谢谢,PM_Dialog
嗨PM_Dialog,
“我对你的代码中发生的事情感到非常困惑,因为它是自定义项目/板,我无法复制你的任何问题。”-是的,我同意这是一个自定义项目,但没有什么新的实现,我们使用的是基于I2C的传感器和计时器,这是必要的,闪存存储数据,除此之外,什么都没有加入。我不明白为什么在睡眠模式下I2C数据没有读取,即使按照你的建议进行了初始化。我不知道什么是错误的,我保持BKT到user_peripheral.c文件的每个函数,代码没有停止任何断言警告或任何错误消息。
“在案例5中,你提到你禁用了睡眠模式。你指的是定期的广告吗?”-是,完全禁用睡眠模式,user_config.h SLEEP_OFF启用和删除app_easy_timer定时唤醒。
“你是否启用或禁用WDOG ?”在案例1-4中,代码的行为是什么?您是否尝试过添加断点和步进代码?”-是的,WDOG是启用的,除了user_提到的文件,我没有修改任何SDK文件。
你们是否有I2C启用,BLE以及睡眠功能实现的项目,如果有,那么请和我一起,我将与我的例子比较,并检查有什么错误?
感谢和问候
罗希特R
嗨PM_Dialog,
我观察到了几点,你能帮忙吗?
1)当测试时,我已经强制暂停了代码,因为设备没有广告,没有来自i2c传感器的数据,然后代码我被暂停到以下行从i2c_read_byte()函数,
——“WAIT_WHILE_I2C_FIFO_IS_FULL ();//等待Tx FIFO已满" -此行代码停止,请检查我的代码和什么问题。
2)接下来,我在上面一行注释,减少ADV_UPDATE时间到只有100ms,并保持WAKEUP_TIME为5秒,然后我看到一些I2C数据,但发送数据包广告,然后没有更新广告数据,所以我再次暂停代码,它暂停到下面的函数的最后一行-“SCB->SCR &= ~(1<<2);”
静态内联void arch_resume_from_sleep(void)
{
//在唤醒后调用应用特定的任务
app_sleep_exit_proc ();
#if ((EXTERNAL_WAKEUP) && (!BLE_APP_PRESENT)) //外部唤醒,仅在外部处理器设计中
//禁用外部唤醒中断
ext_wakeup_disable ();
# endif
//恢复ARM睡眠模式
//重置SCR[2]=SLEEPDEEP位,否则mode=idle WFI将导致深度休眠
//而不是处理器暂停
渣打银行——>可控硅& = ~ (1 < < 2);
}
你能给我解释一下哪里不对吗?
感谢和问候
罗希特R
页面