DA14530和DA14531
5个月前
发布的brent_zheng185点 12个回复亲爱的先生,
我的产品每天使用几次。所以我想把它放入深度睡眠(RAM Off)和保持RTC计数一次空闲。
问题是当系统唤醒时,RTC日历/时间寄存器为零。我已经正确地设置了PD_TIM。
你能帮我解决这个问题吗,非常感谢!
5个月前
亲爱的先生,
进入深度睡眠前的寄存器数据:
PMU_CTRL_REG: 0
CLK_RTCDIV_REG: 40 c8
RTC_CONTROL_REG: 0
RTC_EVENT_FLAGS_REG: 0
RTC_TIME_REG: 80000001
RTC_CALENDAR_REG: a021010d
RTC_KEEP_RTC_REG: 1
RTC_INTR_MIN事件从深度睡眠中唤醒后:
PMU_CTRL_REG: 2
CLK_RTCDIV_REG: 0
RTC_CONTROL_REG: 0
RTC_EVENT_FLAGS_REG: 0
RTC_TIME_REG: 0
RTC_CALENDAR_REG: 0
RTC_KEEP_RTC_REG: 0
似乎RTC在深度睡眠期间工作,但有人清除或重置那些寄存器在唤醒程序。你能帮我检查一下吗?
谢谢。
5个月前
嗨brent_zheng,
如果您希望在DA14531唤醒时保持RTC值,那么应该使用扩展睡眠模式。在这种模式下,所有的RAM块都被保留(默认配置),所以寄存器不会被重置。
当DA14531唤醒时,应用程序代码将立即开始执行,并且不会丢失数据。
SDK6.0.14.1114提供了2个示例来理解如何使用扩展睡眠模式以及如何唤醒DA4531。
项目\ target_apps \ ble_examples \ prox_reporter \ Keil_5
项目\ target_apps \ ble_examples \ ble_app_sleepmode \ Keil_5
谢谢,PM_Dialog
4个月前
亲爱的先生,
是的,我知道延长睡眠时间是有用的。我关心的是为什么RTC可以在深度睡眠时工作,但在醒来时清除?因为RAM没有被保留?我也尝试了RAM保留的深度睡眠,似乎不工作。
BR,
布兰特
4个月前
嗨brent_zheng,
请检查arch_set_deep_sleep() API。进入深度睡眠模式后,代码到达WFI(),应该在唤醒时执行HW重置。在第122行中,PMU_CTRL_REG[RESET_ON_WAKEUP]被设置为1,因此HW在唤醒时被激活DA14531数据表(v3.3),第5.2.1节POR, HW和SW复位
在表39:复位信号和寄存器中,RTC规则被POR或HW复位。因此,从深度睡眠到唤醒机制要经过一个HW复位过程,因此它会从OTP或次级存储器中复制软件。由于这个原因,ram数据将被覆盖,RTC将重新从零开始计数。
谢谢,PM_Dialog
2个月前
亲爱的支持团队
我的目标是实现自定义的时间深度睡眠模式在我的源代码。
在做同样的事情之前,我尝试首先实现ble_button_wakeup项目;通过使用基于RTC的中断。
目前的情况如下。
1.)流程为:启用RTC中断,定义中断处理程序,中断处理程序调用时唤醒设备
2.)我们完成了启用RTC中断,能够接收中断并使用中断处理程序调用唤醒函数。但是这个设备并没有醒来
3.)基本上,在白蚁,我能够看到计时器运行10秒,然后睡眠模式上的消息,但设备不会唤醒基于RTC启用中断。
我已经附上了一个重要的部分的代码为您的评估,请让我知道,如果我错过了什么,这里。
代码部分:RTC使能中断
空白initialize_alarm (rtc_time_t时间)
{
rtc_time_t alarm_time;
alarm_time =时间;
alarm_time。秒+ = RTC_TIMEOUT;
rtc_set_alarm (&alarm_time NULL, RTC_ALARM_EN_SEC);
//清除挂起的中断
rtc_get_event_flags ();
rtc_register_intr (rtc_interrupt_hdlr RTC_INTR_ALRM);
}
代码部分:中断处理程序
Static void rtc_interrupt_hdlr(uint8_t事件)
{
/ /存根函数
rtc_wake_flag = 1;
}
if(rtc_wake_flag) //定时器达到10s后休眠模式关闭
{
printf_string (UART2 \ n "睡眠模式);
sprintf(时间,“\ nT: % d % d: % d r \ n \”,mytime.hour, mytime.minute, mytime.sec);
printf_string (UART2、时间);
rtc_wake_flag = 0;
arch_set_sleep_mode (ARCH_SLEEP_OFF);//禁用休眠模式
arch_ble_force_wakeup ();//强制BLE唤醒
arch_ble_ext_wakeup_off ();//禁用永久休眠标志
app_easy_wakeup ();//当BLE被唤醒时调用相应的动作
user_app_init ();
}
您的输入和方向,将有助于我们项目的快速原型。期待您的宝贵意见。
2个月前
嗨Bas321,
谢谢你在论坛上的评论。我建议看看SDK的pxp_reporter示例。
当CFG_EXT_SLEEP_WAKEUP_RTC或CFG_DEEP_SLEEP_WAKEUP_RTC时,DA14531将从扩展睡眠或深度睡眠中唤醒。
configure_rtc_wakeup()将RTC配置为唤醒源,因此芯片在10秒后(alarm_time.)醒来。秒+ = 10)。
在入睡之前,您应该确保PD_TIM是打开的。请检查app_advertise_complete()。
一旦设备接受一个RTC中断,就会执行rtc_interrupt_hdlr()以从休眠中恢复并唤醒。rtc_interrupt_hdlr()应该在rtc_register_intr()中注册。
谢谢,PM_Dialog
5个月前
嗨brent_zheng,
谢谢你的在线问题。我建议首先检查SDK6.0.14中的接近报告项目和我们的“睡眠模式”教程。链接如下:
http://lpccs-docs.dialog-semiconductor.com/DA14531_Sleep_Mode+/deepsleep_config.html
DA14531能够通过RTC从深度睡眠模式中醒来。检查我们的步骤9:
要使用RTC (Real Time Clock)定时器进行唤醒,请定义CFG_DEEP_SLEEP_WAKEUP_RTC并取消其余唤醒机制的定义。
如果你还有什么问题,请告诉我们。
谢谢,PM_Dialog