本篇总结
使用 BKP,读写备份寄存器并验证掉电数据保持。
🔑 KEIL MDK、UART调试、BKP
W55MH32L 内置 42 个 16 位备份寄存器(BKP),可存储 84 字节用户数据。它们位于备份域中,由 VBAT 供电,当 VDD 断电时数据仍可保持,系统复位或待机唤醒也不会清除。本示例演示向备份寄存器写入数据、检查数据保持,并测试侵入检测功能。
前置工具准备
开始本例程前,请确认以下工具已安装:
- WIZ UartTool V1.0:串口收发测试工具:点击下载
硬件连接
本例程主要使用芯片内部备份寄存器,无需外部硬件连接。USART1 用于串口输出测试信息。侵入检测引脚为 PC13(TAMPER 引脚),可外部连接触发信号验证侵入检测功能。VBAT 引脚可连接纽扣电池以在 VDD 断电时维持备份域供电。
| 引脚 | 功能 | 方向 | 模式 |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (IN_FLOATING) |
| PC13 | TAMPER (侵入检测) | 外部 → 开发板 | 可选,侵入检测输入 |
| 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.uvprojx,F7 编译,确认 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",验证备份数据在复位后保持不变。
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 引脚检测到异常时自动清除所有备份数据,防止非法篡改
- 适用于存储校准参数、计数器、配置信息等需要掉电保持的关键数据