全部例程

备份寄存器(BKP)

W55MH32

更新于 2026年8月12日

本篇总结

使用 BKP,读写备份寄存器并验证掉电数据保持。

🔑 KEIL MDK、UART调试、BKP

W55MH32L 内置 42 个 16 位备份寄存器(BKP),可存储 84 字节用户数据。它们位于备份域中,由 VBAT 供电,当 VDD 断电时数据仍可保持,系统复位或待机唤醒也不会清除。本示例演示向备份寄存器写入数据、检查数据保持,并测试侵入检测功能。

前置工具准备

开始本例程前,请确认以下工具已安装:

  • WIZ UartTool V1.0:串口收发测试工具:点击下载

硬件连接

本例程主要使用芯片内部备份寄存器,无需外部硬件连接。USART1 用于串口输出测试信息。侵入检测引脚为 PC13(TAMPER 引脚),可外部连接触发信号验证侵入检测功能。VBAT 引脚可连接纽扣电池以在 VDD 断电时维持备份域供电。

引脚功能方向模式
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (IN_FLOATING)
PC13TAMPER (侵入检测)外部 → 开发板可选,侵入检测输入
VBAT备份域供电电池 → 开发板可选,纽扣电池正极

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\BKP\,核心文件如下:

BKP/
├── USER/
│   ├── main.c            ← BKP读写测试 + 侵入检测 + printf重定向
│   ├── w55mh32_conf.h    ← 外设头文件集中包含
│   ├── w55mh32_it.c/h    ← 中断服务函数(TAMPER中断)
│   ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│   └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
    └── delay/
        └── delay.c/h      ← SysTick 延时函数

步骤1:备份寄存器读写函数

函数:WriteToBackupReg()CheckBackupReg() — 向 42 个备份寄存器写入递增数据,并检查数据是否与预期一致。


void WriteToBackupReg(uint16_t FirstBackupData)
{
    uint32_t index = 0;
    for (index = 0; index < 42; index++)
    {
        BKP_WriteBackupRegister(BKPDR_Table[index], FirstBackupData);
        FirstBackupData += 0x5A;
    }
}

uint8_t CheckBackupReg(uint16_t FirstBackupData)
{
    uint32_t index = 0;
    for (index = 0; index < 42; index++)
    {
        if (BKP_ReadBackupRegister(BKPDR_Table[index]) != FirstBackupData)
            return (index + 1);
        FirstBackupData += 0x5A;
    }
    return 0;
}
  

BKP_WriteBackupRegister()BKP_ReadBackupRegister() 是标准库提供的备份寄存器读写接口。数据从 FirstBackupData 开始,每个寄存器递增 0x5A,便于检测数据是否被篡改或丢失。

如果你想自定义

  • 改写入数据 → 修改 FirstBackupData 初始值
  • 改递增步进 → 修改 0x5A 为其他值
  • 只使用部分寄存器 → 修改循环上限 42

步骤2:主函数与复位检测

函数:main() — 使能 PWR 和 BKP 时钟,开启备份域访问,通过检查 RCC_FLAG_PORRST 复位标志判断是上电复位还是其他复位。


int main(void)
{
    RCC_ClocksTypeDef clocks;
    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);

    printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, "
           "PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
           (float)clocks.SYSCLK_Frequency / 1000000,
           (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000,
           (float)clocks.PCLK2_Frequency / 1000000,
           (float)clocks.ADCCLK_Frequency / 1000000);
    printf("Backup Data Test.\n");

    /* 使能 PWR 和 BKP 时钟 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    /* 使能备份域访问 */
    PWR_BackupAccessCmd(ENABLE);
    /* 清除备份域标志 */
    BKP_ClearFlag();

    /* 检查复位标志 */
    if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
    {
        /* 上电/掉电复位:写入备份数据 */
        printf("POR/PDR Reset Flag Set\n");
        WriteToBackupReg(0xA53C);
        printf("Backup Data Write Success\n");
    }
    else
    {
        /* 非上电复位:检查备份数据是否保留 */
        printf("POR/PDR Reset Flag Reset\n");
        if (CheckBackupReg(0xA53C) == 0x00)
            printf("Backup Data Check Success\n");
        else
            printf("Backup Data Check Fail\n");
    }

    while (1);
}
  

上电复位(POR/PDR)时备份寄存器数据可能丢失,此时写入新数据。非上电复位(如按键复位)时备份寄存器数据保持,此时检查数据是否正确。通过对比两种情况验证备份寄存器的掉电保持特性。

如果你想自定义

  • 检测其他复位类型 → 使用 RCC_FLAG_PINRST(按键复位)、RCC_FLAG_SFTRST(软件复位)等标志
  • 存储自定义数据 → 将配置参数、校准值等存入备份寄存器,实现掉电不丢失

步骤3:侵入检测配置

侵入检测(Tamper Detection)功能在 TAMPER 引脚检测到指定电平变化时自动清除所有备份寄存器数据,防止非法篡改。


/* 篡改检测配置 */
BKP_TamperPinCmd(DISABLE);
BKP_ITConfig(DISABLE);
BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);
BKP_ClearFlag();

/* 重新使能篡改检测 */
BKP_ITConfig(ENABLE);
BKP_TamperPinCmd(ENABLE);

/* 篡改中断服务函数 */
void TAMPER_IRQHandler(void)
{
    if (IsBackupRegReset() == 0)
        printf("Backup Tameper Attack\n");
    else
        printf("Backup Tameper No Attack\n");
    BKP_ClearFlag();
}
  

配置流程:先禁用侵入检测和中断 → 设置触发电平(低电平触发)→ 清除标志 → 重新使能中断和检测。当 TAMPER 引脚(PC13)检测到低电平时触发中断,备份寄存器被硬件自动清零。

编译与下载

Keil MDK 中打开 BKP.uvprojxF7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。

运行验证

打开 WIZ UartTool V1.0,波特率 115200 / 8N1。第一次下载(上电复位)时,串口打印 "POR/PDR Reset Flag Set" 和 "Backup Data Write Success"。按 RESET 键(非上电复位)后,串口打印 "POR/PDR Reset Flag Reset" 和 "Backup Data Check Success",验证备份数据在复位后保持不变。

BKP备份寄存器测试串口输出
WIZ UartTool V1.0 显示备份寄存器测试结果:上电复位写入数据,按键复位后检查数据保持

常见问题

Q: 按键复位后备份数据检查失败

确认 VBAT 引脚已连接电源(3.3V 或纽扣电池)。如果 VBAT 无供电且 VDD 断电,备份寄存器数据会丢失。检查 PWR_BackupAccessCmd(ENABLE) 是否在读写前调用。

Q: 侵入检测中断不触发

确认 PC13 引脚连接了正确的触发信号。BKP_TamperPinLevelConfig 设置的触发电平需与实际信号匹配。侵入检测使能前需先清除标志位。

Q: 串口无任何输出

确认 COM 口号正确、波特率 115200,下载后需按 RESET 键启动。检查 printf 重定向的 fputc 函数是否正确实现。

总结

本文基于 W55MH32L 的备份寄存器(BKP)实现了数据掉电保持和侵入检测功能:

  • 42个16位备份寄存器,由 VBAT 供电,VDD 断电时数据不丢失,系统复位和待机唤醒也不清除
  • 通过检查 RCC_FLAG_PORRST 区分上电复位和其他复位,验证备份数据的保持特性
  • 侵入检测(Tamper)功能在 TAMPER 引脚检测到异常时自动清除所有备份数据,防止非法篡改
  • 适用于存储校准参数、计数器、配置信息等需要掉电保持的关键数据

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板