text
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. 初始化完成

代码配置

c
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实战应用场景

应用场景特点
低功耗数据采集系统电池供电,长期运行;每小时采集一次环境数据;掉电后数据不丢失;系统能够定时唤醒和休眠
智能电表系统记录用电数据;定时上报数据;掉电后保持时间和数据;防篡改功能
物联网节点电池供电,低功耗运行;定期连接网络上报数据;存储网络配置和设备ID;远程唤醒功能
便携式医疗设备电池供电,长续航;定时测量生命体征数据;存储患者信息和测量历史;紧急情况下快速唤醒
工业控制系统监控设备运行状态;定时采集生产数据;掉电后保持系统配置;故障时通过闹钟唤醒系统
智能家居设备低功耗待机;定时执行任务(如开关灯、调节温度);存储用户偏好设置;远程控制和定时功能
环境监测站长期户外运行;定时采集环境数据(温度、湿度、PM2.5等);存储历史数据和校准参数;低电量时降低采集频率
智能农业设备电池或太阳能供电;定时灌溉和监测;存储土壤数据和灌溉计划;根据天气情况调整工作模式
车辆监测系统低功耗监控;定时采集车辆状态数据;存储故障代码和行驶数据;异常情况及时唤醒报警
安防系统低功耗待机;定时布防和撤防;存储系统配置和报警记录;触发事件时快速唤醒响应