[其他ST产品] Alarm闹钟周期唤醒(10s/10min/10h)

[复制链接]
424|4
 楼主| 哈根达斯uz 发表于 2022-10-18 23:54 | 显示全部楼层 |阅读模式
最近在搞stm32L151C8T6的低功耗模式。

项目场景:
提示:这里简述项目相关背景:
LoRa低功耗,用到stm32L151C8T6+sx1278,SPI通信。本文主要讲述stm32L151低功耗问题——待机模式。
以下代码理论10s唤醒一次,时间可自由设置,详细配置之代码注释有

 楼主| 哈根达斯uz 发表于 2022-10-18 23:57 | 显示全部楼层
问题描述:
不废话直接上代码:
LowPower.c文件:[code]#include "LowPower.h"
#include "stm32l1xx_rtc.h"
#include "stm32l1xx.h"
#include "stm32l1xx_exti.h"
#include "misc.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx_pwr.h"

//RTC 时钟配置
void rtc_init(void) {
    RTC_InitTypeDef RTC_InitStructure;
 楼主| 哈根达斯uz 发表于 2022-10-18 23:58 | 显示全部楼层
main.c函数:
  1. int main()
  2. {
  3.         //系统初始化
  4.         //串口初始化
  5.         //。。。初始化
  6.         rtc_init();   //RTC初始化
  7.         platform_rtc_set_alarmA();   //RTC闹钟唤醒配置
  8.         while(1)
  9.         {
  10.                 //要执行的程序
  11.                 ......
  12.                 ......
  13.                 Sys_Standby1(); //进入待机模式
  14.         }
  15. }
 楼主| 哈根达斯uz 发表于 2022-10-18 23:59 | 显示全部楼层
注意事项:
时钟问题
在第二部分为什么说是理论10s呢?因为我在测试的时候发现真正唤醒的时间是8s/9s的样子,基本上设置10s会快上1s左右,2min快上12s左右,10min快上一分钟。这就有点离谱了,后来有看到网有在网上说这是因为晶振或者电容不匹配导致的,内部时钟好像确实不准确。可以换为外部晶振更加精准,电容的话就需要在焊板子的时候选用了,这暂时超纲了,不谈。
是否进入中断
standy待机模式不进入中断,stop模式进入,详细见网有博客:停机和待机唤醒程序入口
中断标志清除
对于Alarm唤醒来说,主要是Alarm初始化是要注意中断标志位。
对于停机唤醒要格外注意在中断服务函数种清除用到的中断标志位。
 楼主| 哈根达斯uz 发表于 2022-10-18 23:59 | 显示全部楼层
心得:
wakeup唤醒,最多可实现33s左右时间的唤醒,想要达到更高时间就无法使用。Alarm使用这样的计算方法一样可以达到周期性唤醒单片机:
  1. RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds+10);        //秒唤醒时间,必须为5的倍数

Alarm唤醒,Alarm唤醒不进入闹钟中断函数,到时间就自动唤醒后,自动重新设置Alram。stop模式更复杂,会进入中断函数,必须进行中断标志位的清除,否则会影响下一次唤醒。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

382

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部