RTC初始化流程
├── 1. 开启时钟
│ ├── 开启PWR时钟
│ └── 开启BKP时钟
├── 2. 允许备份访问
│ └── PWR_BackupAccessCmd(ENABLE)
├── 3. 检查是否首次配置
│ ├── 读取BKP_DR1的值
│ ├── 如果不是0xA5A5(首次配置)
│ │ ├── 开启LSE时钟
│ │ ├── 等待LSE就绪
│ │ ├── 选择LSE作为RTC时钟源
│ │ ├── 使能RTC时钟
│ │ ├── 等待RTC同步
│ │ ├── 设置RTC预分频器
│ │ ├── 设置时间
│ │ └── 写入BKP_DR1=0xA5A5
│ └── 如果是0xA5A5(非首次配置)
│ └── 等待RTC同步
└── 4. 初始化完成代码配置
void BKP_RTC_Init(void)
{
// 使能PWR和BKP时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
// 允许访问备份寄存器
PWR_BackupAccessCmd(ENABLE);
// 检查是否第一次配置
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5555)
{
// 使能外部低速晶振
RCC_LSEConfig(RCC_LSE_ON);
// 等待晶振稳定
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
// 选择LSE作为RTC时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
// 使能RTC时钟
RCC_RTCCLKCmd(ENABLE);
// 初始化RTC
RTC_WaitForSynchro();
// 32768Hz晶振,预分频后1Hz
RTC_SetPrescaler(32767);
// 写入标志,表示已配置
BKP_WriteBackupRegister(BKP_DR1, 0x5555);
}
else
{
// 已经配置过,等待同步
RTC_WaitForSynchro();
}
}
// 存储数据到BKP
void BKP_SaveData(uint16_t data)
{
PWR_BackupAccessCmd(ENABLE);
BKP_WriteBackupRegister(BKP_DR2, data);
PWR_BackupAccessCmd(DISABLE);
}
// 从BKP读取数据
uint16_t BKP_ReadData(void)
{
return BKP_ReadBackupRegister(BKP_DR2);
}BKP、PWR、RTC实战应用场景
1. 低功耗数据采集系统
- 电池供电,需要长期运行
- 每小时采集一次环境数据
- 掉电后数据不丢失
- 系统能够定时唤醒和休眠
2. 智能电表系统
- 记录用电数据
- 定时上报数据
- 掉电后保持时间和数据
- 防篡改功能
3. 物联网节点
- 电池供电,低功耗运行
- 定期连接网络上报数据
- 存储网络配置和设备ID
- 远程唤醒功能
4. 便携式医疗设备
- 电池供电,长续航
- 定时测量生命体征数据
- 存储患者信息和测量历史
- 紧急情况下快速唤醒
5. 工业控制系统
- 监控设备运行状态
- 定时采集生产数据
- 掉电后保持系统配置
- 故障时通过闹钟唤醒系统
6. 智能家居设备
- 低功耗待机
- 定时执行任务(如开关灯、调节温度)
- 存储用户偏好设置
- 远程控制和定时功能
7. 环境监测站
- 长期户外运行
- 定时采集环境数据(温度、湿度、PM2.5等)
- 存储历史数据和校准参数
- 低电量时降低采集频率
8. 智能农业设备
- 电池或太阳能供电
- 定时灌溉和监测
- 存储土壤数据和灌溉计划
- 根据天气情况调整工作模式
9. 车辆监测系统
- 低功耗监控
- 定时采集车辆状态数据
- 存储故障代码和行驶数据
- 异常情况及时唤醒报警
10. 安防系统
- 低功耗待机
- 定时布防和撤防
- 存储系统配置和报警记录
- 触发事件时快速唤醒响应
