嗨对话框,
现在我遇到了一个问题,唤醒后不起作用。
参考BLE_APP_SLEEPMODE示例项目,我添加了UART接收中断处理程序。
作为示例项目,我写下唤醒回调如下。
静态void enable_wakeup_cb(void)
{
if(GetBits16(SYS_STAT_REG, PER_IS_DOWN))
{
gpio_init();
periph_init();
}
setbits32(gp_control_reg,ble_wakeup_req,1);
if(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接收中断。
唤醒中断和GPIO INT正常工作,但UART接收INT。
我觉得UART初始化需要比GPIO更多的时间,所以我插入了几秒钟定时器等待和Periph_init()再次等待。
但结果是一样的。
你能告诉我唤醒后挪威启动UART的条件吗?
谢谢,
Diogenes.
设备:
嗨Diogenes,
在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,我更改为1毫秒,我的程序是唤醒后接收中断。
我通过示波器测量了定时,并且我检查了UART接收的定时在唤醒后至少超过10msec发生。
但是没有检测到UART接收中断,我想象UART接收中断本身将工作,因为它在几秒钟后被检测到。
所以我知道需要多少秒以启用UART接收中断。
当然,UART接收中断并在我的程序中发送正常工作。
那么我应该如何在唤醒后启用UART接收中断?
谢谢,
Diogenes.
嗨对话框,
我可以添加有关当前问题的一些信息。
首先,对于UART接收中断,在Weke-Up和我的程序之后通常不会在Rwble.cn中跳转到L.369(Assert_Warning(0);)。
if((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的唤醒延迟时间。
否则//使用_power_optimizations.
{
delay = minime_sleep_duration;
//如果xtal_trimming_time_usec更改(即变大)那么它
//将确保用户通知以增加1或更多的“延迟”
//插槽所以有足够的时间来解决xtal
#if((3125 +(minimue_sleep_duration + 625))<(lp_isr_time_usec + 1100))//1.1ms max上电时间// l.395
#错误“最小睡眠持续时间太小,对于使用的16MHz水晶......”
# 万一
}
rwip_wakeup_delay_set(延迟);// L.400.
但考虑到L.395的约束,我理解将最终_sleep_duration更改为1slot。
然后我认为这是睡眠模式和我重写arch_set_deep_sleep()的问题;to arch_set_extendend_sleep();在void user_app_adv_start(void)中,但结果是相同的。
无论如何,现在我正在损失。
请告诉我有用的信息来解决它。
谢谢,
Diogenes.
嗨对话框,
我必须更多地添加有关当前情况的更多信息。
我注意到调试MU程序不会进入(Arch_ble_ext_wakeup_get())子句虽然我在user_config.h中设置了ext_sleep,user_app_adv_start()和user_app_connection(),如folllowings。
// const static 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_EXTEDDE_SLEEP();
所以我评论了(Arch_ble_ext_wakeup_get()),但没有发生UART接收中断。
// if(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_ble_force_wakeUp()后插入Arch_Force_Active_Mode()吗?
Please tell me more information.
谢谢,
Diogenes.
嗨Diogenes,
如果将app_add_data_update_to配置为1毫秒,这意味着该设备将仅从1毫秒宣传,这太短了广告时间。在1毫秒到期后,设备将转到永久睡眠模式,唤醒它的唯一方法来自唤醒控制器,作为您正在处理的BLE_APP_SLEEP_MODE示例中的按钮的实现。在此之后,所有外围设备模块都将被供电(包括UART外围模块),因此您无法接收任何UART中断。尽管如此,我无法理解你试图与UART完成的事情。您想通过从UART接收数据来唤醒DA14580吗?您能否将App_add_data_update_to更改为更长的时间,并尝试运行项目而不启用睡眠模式?
关于您的第二个帖子,此断言可能意味着LP_Hanlder花费太多时间来执行和警告,您得到的意味着它需要更多时间才能唤醒计算值。请检查以前的线程:
https://support.dialog-seminile.com/forums/post/dialog-smartbond-bluetooth-low-energy-%2%80%93-software/some- tormal-sleep-mode.
我想通知您,如果您发现上述任何答案有用,请将其中一个标记为已接受。
谢谢,PM_DIALOG.
嗨对话框,
感谢你的回复。
>您想通过从UART接收数据来唤醒DA14580吗?
正如我已经解释了两倍的“否”,我只需要在Wakeup Int唤醒后接收中断。
>如果将app_add_data_update_to配置为1毫秒
我认为将App_Adv_Data_update_to配置为1毫秒是不可能的,因为app_adv_data_update_to的最小量子是10msec。
我使用app_adv_data_update_to运行1(10msec间隔)和1000(10sec),但结果是相同的。
在唤醒正常工作后,uart uart会接收中断。
我可以询问您是否有关它,将App_add_data_update_to配置为1(10磁形间隔)太短?
And I ask again about the question I wrote in previous post.
我重复我注释了(ARCH_BLE_EXT_WAKEUP_GET()和插入ACH_BLE_FORCE_WAKESUP()之后插入ARCH_FORCE_ACTION_MODE()。
我认为延长睡眠是真的进入了Arch_ble_force_wakeUp()后插入Arch_Force_Active_Mode()吗?
// if(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();
}
这只是我想在上一篇文章中提出的问题。
谢谢,
Diogenes.
嗨Diogenes,
所以你的意思是“我只是需要UART receive interrupt after wake-up by WAKEUP INT”? You will get an interrupt if you have data either to send or receive. Sorry, but I am not able to understand what you are trying to accomplish with the UART. If you configure the APP_ADV_DATA_UPDATE_TO as 1 (10msec), the UART will be powered on only for 10msec. The arch_ble_ext_wakeup_get() function checks whether the BLE core is in permanent sleep mode or not. Let me try to explain a bit better how the ble_app_sleep mode example works. The device will enter the sleep mode between the advertising or connection intervals. But, in this example there is a implementation of entering the permanent sleep and the device is able to be woken up only from the wake up controller. The sleep mode is really entered even I inserted arch_force_active_mode() just after arch_ble_force_wakeup(). Please check the user_app_adv_start() function and you will see the after the expiration (APP_ADV_DATA_UPDATE_TO) of the timer the adv_data_update_timer_cb() will be triggered. 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.