嗨对话框,
现在我遇到一个问题,UART不唤醒后工作。
参考ble_app_sleepmode示例项目,我添加了UART接收中断处理程序。
由于样本项目,我写唤醒回调像以下。
静态孔隙enable_Wakeup_cb(空白)
{
if(getBits16(sys_stat_reg,per_is_down))
{
GPIO_init ();
periph_init ();
}
SetBits32(GP_CONTROL_REG,BLE_WAKEUP_REQ,1);
如果(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 ();
}
}
但是,UART接收中断有时不发生。
WAKE-UP中断和GPIO INT工作正常,但UART接收INT。
我觉得UART初始化需要比GPIO所以我插入几秒的等待后再次计时器等待和periph_init()更多的时间。
但结果是一样的。
你能告诉我的条件唤醒后noramally开始UART?
谢谢,
第欧根尼
设备:
嗨,第欧根尼,
在ble_app_sleep模式示例中,设备进入深睡眠模式APP_ADV_DATA_UPDATE_TO期满(缺省值是10秒)之后,所以所有外设都断电。这意味着,你是不是能够通过设备醒来的时候有UART活动。能否请您确认您要使用UART,因为该芯片被唤醒?另外,如果你试图解释一点你要完成的任务,将是非常有益的。你想唤醒你的设备,当你在UART发送数据,或者你想有UART活性,因为该芯片被唤醒?如果您希望实现第一选择,要知道,为了醒来,你应该激活WKUP控制器,否则芯片将继续保持进入睡眠模式。另外,能否请你澄清UART是你的工作吗?在ble_app_sleepmode示例中,仅UART2被实现并且可以通过定义被放入da1458x_config_basic.h的CFG_PRINTF宏激活
谢谢,PM_DIALOG.
嗨对话框,
谢谢你的评论。
对于APP_ADV_DATA_UPDATE_TO,我修改为1msec,我的程序是在唤醒后UART接收中断。
我测由示波器的定时和我检查UART的定时获得超过10毫秒的唤醒后发生至少。
但是,UART接收未检测中断和我想象UART接收中断本身会工作,因为它是几秒钟后检测。
所以我知道启用UART接收中断需要多少秒。
当然,UART接收中断和发送我的程序正常工作。
那么我应该怎样做才能在唤醒后启用UART接收中断?
谢谢,
第欧根尼
嗨对话框,
我能补充一些关于当前问题的信息吗?
首先,UART接收中断在wekeup后通常不会发生,我的程序有时会在rwble.c (ASSERT_WARNING(0);)中跳转到L.369。
如果((DEVELOPMENT_DEBUG)&&(USE_POWER_OPTIMIZATIONS))ASSERT_WARNING(0);// L.369
{
slp_period_retated = slp_period;
//如果此断言命中,则LP ISR持续时间长于时间
//已经通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留。
if(sleep_lp_cycles &&(sleep_lp_cycles
}
但是接收中断本身没有被发现,我必须判断这不是处理者的问题。
然后我怀疑arch_system.c()中的L.400唤醒延迟时间。
/ /其他USE_POWER_OPTIMIZATIONS
{
延迟= MINIMUM_SLEEP_DURATION;
//如果XTAL_TRIMMING_TIME_USEC发生变化(即变大),那么这个
//将确保用户得到通知,将“延迟”增加1或更多
//插槽,这样XTAL有足够的时间来解决
#如果((3125 +(MINIMUM_SLEEP_DURATION + 625))<(LP_ISR_TIME_USEC + 1100))//1.1ms最大电时间// L.395
#错误“最低的睡眠时间是使用16MHz晶振太小了......”
#ENDIF
}
rwip_wakeup_delay_set(延迟);/ / L.400
但考虑L.395的约束,我明白这是不可能改变MINIMUM_SLEEP_DURATION到1slot。
后来我想这是从睡眠模式和我重写arch_set_deep_sleep()中的问题;到arch_set_extended_sleep();在虚空user_app_adv_start(无效),但结果是一样的。
不管怎样,现在我很迷茫。
请告诉我有用的信息来解决这个问题。
谢谢,
第欧根尼
嗨对话框,
我必须补充更多关于当前形势。
我注意到在调试时mu程序不进入if(arch_ble_ext_wakeup_get())子句,尽管我在user_config.h, user_app_adv_start()和user_app_connection()中设置了EXT_SLEEP,如下所示。
//量静态sleep_state_t app_default_sleep_mode = ARCH_DEEP_SLEEP_ON;
const static sleep_state_t app_default_sleep_mode = arch_ext_sleep_on;
// arch_set_deep_sleep();
arch_set_extended_sleep();
所以我注释掉如果(arch_ble_ext_wakeup_get()),但UART接收中断没有发生。
/ /如果(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 ();
}
接下来,我在arch_ble_force_wakeup()之后强行插入arch_force_active_mode()。
然后UART接收中断发生,但我怀疑,如果真的计划进入睡眠模式或没有。
至少在调试时,程序进入arch_goto_sleep(sleep_mode)。
我是否可以认为扩展睡眠真的进入了,即使我插入arch_force_active_mode()仅仅在arch_ble_force_wakeup()之后?
请告诉我更多信息。
谢谢,
第欧根尼
嗨第欧根尼,
如果您将APP_ADV_DATA_UPDATE_TO配置为1msec,这意味着设备将仅从1msec开始发布,这是太短的发布时间。在1msec到期后,设备将进入永久休眠模式,唤醒它的唯一方法是从唤醒控制器,正如您正在处理的ble_app_sleep_mode示例中的按钮实现。在此之后,所有外设模块都将通电(包括UART外设模块),因此您将无法接收任何UART中断。但是,我还是不能理解你想用UART完成什么。您想通过接收来自UART的数据来唤醒DA14580吗?请更改APP_ADV_DATA_UPDATE_TO的时间长度,并尝试在不启用休眠模式的情况下运行项目。
对于您的第二篇文章,这个断言可能意味着lp_handder花费了太多的时间来执行,而您得到的警告意味着BLE核心唤醒计算值需要更多的时间。请查看之前的帖子:
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bluetooth-low-energy-%E2%80%93-software/some-porblem-sleep-mode
我想告诉你,如果你发现以上任何答案,他们是有用的,请标志之一所接受。
谢谢,PM_DIALOG.
嗨对话框,
谢谢你的回复。
>你想通过UART接收数据唤醒DA14580了?
正如我已经解释过两次“NO”,我只需要UART接收中断唤醒被唤醒后INT。
>如果您将APP_ADV_DATA_UPDATE_TO配置为1msec
我认为不可能配置APP_ADV_DATA_UPDATE_TO为1msec,因为APP_ADV_DATA_UPDATE_TO的最小量是10msec。
余与APP_ADV_DATA_UPDATE_TO运行是1(10毫秒时间间隔)和1000(10秒),但结果是相同的。
在这两个值下,UART在唤醒后接收中断正常工作。
我能问你一下,配置APP_ADV_DATA_UPDATE_TO为1(10毫秒间隔)太短?
我再次问我在前一篇文章中写道的问题。
我重复我注释掉了if(arch_ble_ext_wakeup_get()),并在arch_ble_force_wakeup()之后插入了arch_force_active_mode()。
我是否可以认为扩展睡眠真的进入了,即使我插入arch_force_active_mode()仅仅在arch_ble_force_wakeup()之后?
/ /如果(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 ();
}
这只是我想问问在以前的帖子的问题。
谢谢,
第欧根尼
嗨第欧根尼,
所以你的意思是,“我只需要UART在Wakeup int唤醒后接受中断”?如果您有数据要么发送或接收,您将收到中断。对不起,但我无法理解你试图与UART完成的事情。如果将App_add_data_update_to配置为1(10msec),则UART将仅适用于10毫秒。ARCH_BLE_EXT_WAKEUP_GET()函数检查BLE核心是否处于永久睡眠模式。让我试着更好地解释BLE_APP_SLEEP模式示例的更好。该设备将在广告或连接间隔之间输入睡眠模式。但是,在该示例中,存在进入永久睡眠的实现,并且只能从唤醒控制器唤醒设备。即使我在Arch_ble_Force_WakeUp()之后,睡眠模式也是如此插入Arch_Force_Active_Mode()。请检查user_app_adv_start()函数,您将看到计时器的到期后(app_add_data_update_to)触发adv_data_update_timer_cb()。 This function calls the app_easy_gap_advertise_stop() which send a GAPM_CANCEL_CMD message by executing the app_gapm_cancel_msg_create(). The response of the GAPM_CANCEL_CMD, is a GAPM_CMP_EVT, so the gapm_cmp_evt_handler() will be triggered from the app_task.c. If you check this function, in case of undirected connectable advertising that the example uses, app_on_adv_undirect_complete callback function will be triggered. Please check the .app_on_adv_undirect_complete callback from the user_callback_config.h header file and you will see that the user_app_adv_undirect_complete() is registered. This means that after the expiration of the timer the user_app_adv_undirect_complete() will be executed and it calls the arch_ble_ext_wakeup_on() which puts the BLE core to permanent sleep. Only an external event can wake it up.
谢谢,PM_DIALOG.