使用如下函数 RTC_SetAlarm(RTC_GetCounter()+10); //设置待机时间 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入低功耗 结果无法通过RTC唤醒,是为啥啊 |
如需获得 STM32F103C8T6 等器件的更多信息,请点击链接或 点击此处 联系在线客服!
在while里面循环调用,通过一个计数器,计数,达到数量后开始进入,然后在等着继续,为啥无法唤醒呢?
RTC的寄存器包括计数器的读取是有一定规则的,在手册18.3.3章节有详细描述的。所以需要软件额外的处理,否则读取的值会不准确,那么设置的ALARM就不准。 如果用流行的CUBE库,那么从应用层看就会简单的多。这个库里面有例程可以参考。 STM32Cube_FW_F1_V1.8.0\Projects\STM32F103RB-Nucleo\Examples\RTC
RTC的寄存器包括计数器的读取是有一定规则的,在手册18.3.3章节有详细描述的。所以需要软件额外的处理,否 ...
在使用本函数前必须先调用函数 RTC_WaitForLastTask(),等待标志位RTOFF 被设置 这个我试了一下,发现手册写错了, 手册是这样的 例: /* Wait until last write operation on RTC registers is terminated */ RTC_WaitForLastTask(); /* Sets Alarm value to 0xFFFFFFFA */ RTC_SetAlarm(0xFFFFFFFA); 但实际上应该是这样的 /* Sets Alarm value to 0xFFFFFFFA */ RTC_SetAlarm(0xFFFFFFFA); /* Wait until last write operation on RTC registers is terminated */ RTC_WaitForLastTask(); 调换一下就好了,这是为啥,很奇怪
RTC的寄存器包括计数器的读取是有一定规则的,在手册18.3.3章节有详细描述的。所以需要软件额外的处理,否 ...
其中,计数值修改为这个RTC_GetCounter()
你是用的之前的标准库开发的吧。关于那个函数RTC_WaitForLastTask()调用,它是为了保证 刚才最后的针对RTC寄存器的写操作完成了。换言之,开启新的RTC写操作时要保证没有前次没完成的 写操作。 反正你保证每次做RTC寄存器写操作前保证该位置1才可以。这是关键点。 下面F1标准库例程的部分代码: /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); ///START /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767);/* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); //END 你现在觉得这样写没有问题: /* Sets Alarm value to 0xFFFFFFFA */RTC_SetAlarm(0xFFFFFFFA);/* Wait until last write operation on RTC registers is terminated */ RTC_WaitForLastTask(); 你写前没有查RTCOFF标志,有可能你写时该位置1了,即没有未完成的RTC写操作。 然后再调用RTC_WaitForLastTask();也是合理的、保险的,保证该写操作顺利完成。 因为看不到你的代码,不知你后面还有些什么代码。