跳过主要内容

如何保持RTC工作在深度睡眠模式

DA14530和DA14531

5个月前

发布的brent_zheng185点 12个回复
0的问题

亲爱的先生,

我的产品每天使用几次。所以我想把它放入深度睡眠(RAM Off)和保持RTC计数一次空闲。

问题是当系统唤醒时,RTC日历/时间寄存器为零。我已经正确地设置了PD_TIM。

你能帮我解决这个问题吗,非常感谢!

5个月前

PM_Dialog

嗨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

5个月前

brent_zheng 185点

亲爱的先生,

谢谢你的快速回答。是的,我在用代理报告项目。在定义CFG_DEEP_SLEEP_WAKEUP_RTC时,系统可以在10秒后从Deep-sleep中唤醒。但我的问题是如何保持RTC日历/时间登记后醒来。我调用了rtc_get_time_bcd(),在系统从深度睡眠中醒来后返回0。

谢谢。

5个月前

brent_zheng 185点

亲爱的先生,

进入深度睡眠前的寄存器数据:

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个月前

PM_Dialog

嗨brent_zheng,

很抱歉耽搁了。让我检查一下,我会尽快给你答复。

谢谢,PM_Dialog

5个月前

PM_Dialog

嗨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个月前

brent_zheng 185点

亲爱的先生,

是的,我知道延长睡眠时间是有用的。我关心的是为什么RTC可以在深度睡眠时工作,但在醒来时清除?因为RAM没有被保留?我也尝试了RAM保留的深度睡眠,似乎不工作。

BR,

布兰特

接受答案!

4个月前

PM_Dialog

嗨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

4个月前

brent_zheng 185点

好的,我明白了,非常感谢!

4个月前

PM_Dialog

嗨brent_zheng,

谢谢你接受我的回答。如果您有任何后续问题,请提出新的论坛门票。

谢谢,PM_Dialog

2个月前

Bas321 85点

亲爱的支持团队

我的目标是实现自定义的时间深度睡眠模式在我的源代码。

在做同样的事情之前,我尝试首先实现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 85点

亲爱的团队

你能回复我的上面吗,已经等了很久了。

谢谢你!

温暖的问候
Basu.B.Patil

2个月前

PM_Dialog

嗨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