跳到主要内容

深度睡眠模式下的唤醒功能。

DA14530和DA14531

三个月前

邮寄人Bas32185分 4答复
0票

我的目标是在源代码中实现深度睡眠模式的定制计时。
在做同样的事情之前,我试图首先实现ble_button_唤醒项目;通过使用基于RTC的启用中断。
其现状如下。
1.)流程为:启用RTC中断,定义中断处理程序,中断处理程序调用时唤醒设备
2.)我们完成了RTC中断的启用,能够接收中断并使用中断处理程序调用唤醒功能。但设备并没有苏醒
3.)基本上,在termite中,我可以看到计时器运行10秒,然后在消息上进入睡眠模式,但设备不会基于RTC启用中断而唤醒。
我附上了代码的一个重要部分供您评估,如果我遗漏了什么,请告诉我,在这里。

代码部分:用于RTC启用中断

空白initialize_alarm (rtc_time_t时间)
{
rtc\u时间\u t报警时间;

alarm_time =时间;
alarm_time。秒+ = RTC_TIMEOUT;

rtc设置报警(&alarm\u time,NULL,rtc\u alarm\u EN\u SEC);

//清除挂起的中断
rtc_获取_事件_标志();
rtc_register_intr (rtc_interrupt_hdlr RTC_INTR_ALRM);
}

代码部分:中断处理程序
静态无效rtc\U中断\U hdlr(uint8\U t事件)
{
//存根函数
rtc_唤醒_标志=1;
}
if(rtc_wake_flag)//定时器达到10秒后睡眠模式关闭
{
printf_string (UART2 \ n "睡眠模式);
sprintf(时间,“\nT:%d:%d:%d\n\r”,mytime.hour,mytime.minute,mytime.sec);
printf_字符串(UART2,时间);
rtc_唤醒_标志=0;
arch_设置_睡眠_模式(arch_睡眠_关闭);//禁用睡眠模式
拱力唤醒();//强迫孩子醒来
arch_ble_ext_wakeup_off ();//禁用永久休眠标志
app_easy_wakeup();//一旦BLE唤醒,立即调用相应的操作
user_app_init ();
}

您的投入和指导将有助于我们项目的快速原型化。期待您的宝贵建议

三个月前

PM_对话框

你好,Bas321,

感谢您发布新的论坛帖子。我已在以下论坛门票上回复您,因为您添加了评论:

//www.xmece.com/support-posts/how-keep-rtc-working-deep-sleep-mode

请核对我的答复:

建议看一下SDK的pxp_reporter示例。

当CFG_EXT_SLEEP_WAKEUP_RTC或CFG_DEEP_SLEEP_WAKEUP_RTC时,DA14531将相应地从延长睡眠或深度睡眠中唤醒。

configure_rtc_wakeup()将rtc配置为唤醒源,因此芯片在10秒后唤醒(alarm_time.sec+=10)。

在入睡之前,您应该确保PD_TIM是打开的。请检查app_advertise_complete()。

一旦设备接收到RTC中断,RTC_interrupt_hdlr()将超时,以便从睡眠和唤醒中恢复。rtc_中断_hdlr()应在rtc_寄存器_intr()中注册\

注意:让我们继续讨论这个论坛主题。

谢谢,下午好

接受答案!

三个月前

PM_对话框

你好,Bas321,

让我们继续讨论您的新论坛主题:

//www.xmece.com/support-posts/wake-function-during..。

谢谢,下午好

两个月前

Bas321 85分

亲爱的团队

谢谢你的回复,

(1) CFG_DEEP_SLEEP_WAKEUP_RTC

在user_proxr.h中,我找到了这个函数。

但是,应该在何处定义(在代理报告程序项目的哪一行和文件中)

(2) 在configure_rtc_wakeup()中

如果我们想让系统处于深度睡眠状态1小时,那么仅仅提到这一点就足够了吗

alarm_time。秒+ = 3600

(3)下面是app_advertise_complete()对应的函数。

你能告诉我如何确保PD_TIM是开放的吗

无效应用程序广告完成(施工状态)
{
如果((状态==间隙(错误)| | |(状态==间隙(错误)已取消))
{

#如果(报告者)
app_proxr_alert_stop();
#恩迪夫
}

如果(状态==间隙错误已取消)
{
拱门可外接唤醒开启();

#如果已定义(uuu DA14531_uuuu)
//配置PD_TIM
#如果已定义(CFG_EXT_SLEEP_WAKEUP_RTC)|已定义(CFG_EXT_SLEEP_WAKEUP_TIMER1)|\
已定义(CFG_DEEP_SLEEP_WAKEUP_RTC)|已定义(CFG_DEEP_SLEEP_WAKEUP_TIMER1)
//确保PD_TIM已打开
设置16(PMU\u CTRL\u REG,TIM\u SLEEP,0);
//等待,直到打开PD_TIM
while((GetWord16(SYS_STAT_REG)&TIM_IS_UP)!=TIM_IS_UP);
#否则
//关闭PDU TIM
设置16(PMU\u CTRL\u REG,TIM\u SLEEP,1);
//等待PD_TIM关闭
while((GetWord16(SYS\u STAT\u REG)&TIM\u DOWN)!=TIM\u DOWN);
#恩迪夫
#恩迪夫

注意:是否有其他指令通过RTC配置深度睡眠模式?

非常感谢。

两个月前

PM_对话框

你好,Bas321,

  1. 这是正确的–应该定义CFG_DEEP_SLEEP_WAKEUP_RTC宏,以便通过RTC从深度睡眠中唤醒。
  2. 请看一下rtc的时间结构。在1小时的情况下,您可以使用alarm_time.hour+=1。
  3. 你需要什么时候开门?正如您在app_adversed_complete()回调中所看到的,代码将等待直到打开PD_TIM。

while((GetWord16(SYS_STAT_REG)&TIM_IS_UP)!=TIM_IS_UP);

如果PD_TIM没有打开,那么代码将堆叠到while()循环中。

关于通过RTC进行深度睡眠和唤醒,应遵循以下教程:

http://lpccs-docs.dialog-semiconductor.com/DA14531_Sleep_Mode/deepsleep_config.html

谢谢,下午好