这个问题已经这么长时间了,我想大概率题主已经解决问题了。
作为后来者,我看了很多朋友写的回答。总结一下,解决方法有3种:RTC、定时器、延时(OS延时或直接延时函数)。这其中最适合题主应用需求的就是RTC。
很多朋友说需要外挂DS1302之类的RTC,其实没有必要,绝大多数stm32f103(及以上型号)都带有片上RTC,一般需要高精度低功耗的话需外接32.768K的晶振(本想插个Stm32时钟树的照片,但是手机存的草稿到电脑上不知道从哪里找到)。RTC可以选择3种时钟源:外部32.768K晶振,外部高速时钟的128分频,内部40K低速RC振荡器(一般供独立看门狗)。所有,题主不想改电路也是可以实现的。
为什么说RTC最合适?有几个原因。
第一,精度。这个很多朋友都说了,不赘述。
第二,低功耗。这个我认为非常重要。题主做无线传感器节点,对功耗的要求是非常高的。如果采样延时函数的方式,cpu一直在全速运行,但是要2个小时才上传一次数据,对于99.9%(没有严格算)的cpu时间都是浪费的。那么如果使用RTC情况就不一样了。RTC做好定时设置后,可以让mcu进入低功耗模式,cpu可以停止,甚至连外部时钟都可以停止,把功耗降到最低。到指定时间时RTC能够唤醒mcu,此时完成采样并上传,上传完成后,设置RTC,然后又能进入低功耗。这样可以显著降低功耗。
根据stm32f103官方datasheet,工作在72M频率时,供电电流为70mA(全外设使能);工作在停止模式(低功耗模式的一种),起电流仅为35uA,相差2000倍。
插个cubemx的时钟配置截图。从图可以看出,未连接32.768k晶振,仅使用HSE 8M晶振,同样可以选用LSI的40KHz作为RTC时钟源。