第二十章 BKP
目录
[第二十章 BKP](#第二十章 BKP)
[1 BKP 简介](#1 BKP 简介)
[2 BKP 特性](#2 BKP 特性)
[3 BKP 功能描述](#3 BKP 功能描述)
[3.1 侵入检测](#3.1 侵入检测)
[3.2 RTC 校准](#3.2 RTC 校准)
[4 例程设计](#4 例程设计)
[4.1 BKP_BackupData](#4.1 BKP_BackupData)
[4.2 BKP_Tamper](#4.2 BKP_Tamper)
[5 下载验证](#5 下载验证)
[5.1 BKP_BackupData](#5.1 BKP_BackupData)
[5.2 BKP_Tamper](#5.2 BKP_Tamper)
1 BKP 简介
备份寄存器是 42 个 16 位的寄存器,可用来存储 84 个字节的用户应用程序数据。他们处在备份域里,当 VDD 电源被切断,他们仍然由 VBAT 维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。
此外,BKP 控制寄存器用来管理侵入检测和 RTC 校准功能。复位后,对备份寄存器和 RTC 的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。
执行以下操作可以使能对备份寄存器和 RTC 的访问。
- 通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口的时钟。
- 电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 的访问。
2 BKP 特性
- 数据后备寄存器。
- 用来管理防侵入检测并具有中断功能的状态/控制寄存器。
- 用来存储 RTC 校验值的校验寄存器。
- 在 PC13 引脚(当该引脚不用于侵入检测时)上输出 RTC 校准时钟,RTC 闹钟脉冲或者秒脉冲。
3 BKP 功能描述
3.1 侵入检测
当 TAMPER 引脚上的信号从'0'变成'1'或者从'1'变成'0'(取决于备份控制寄存器 BKP_CR 的 TPAL 位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。然而为了避免丢失侵入事件,侵入检测信号是边沿检测的信号与侵入检测允许位的逻辑与,从而在侵入检测引脚被允许前发生的侵入事件也可以被检测到。
- 当 TPAL=0 时:如果在启动侵入检测 TAMPER 引脚前(通过设置 TPE 位)该引脚已经为高电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在 TPE 位置'1'后并没有出现上升沿)。
- 当 TPAL=1 时:如果在启动侵入检测引脚 TAMPER 前(通过设置 TPE 位)该引脚已经为低电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在 TPE 位置'1'后并没有出现下降沿)。
设置 BKP_CSR 寄存器的 TPIE 位为'1',当检测到侵入事件时就会产生一个中断。在一个侵入事件被检测到并被清除后,侵入检测引脚 TAMPER 应该被禁止。然后,在再次写入备份数据寄存器前重新用 TPE 位启动侵入检测功能。这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚 TAMPER 进行电平检测。
注:当 VDD 电源断开时,侵入检测功能仍然有效。为了避免不必要的复位数据备份寄存器,TAMPER 引脚应该在片外连接到正确的电平。
3.2 RTC 校准
为方便测量,RTC 时钟可以经 64 分频输出到侵入检测引脚 TAMPER 上。通过设置 RTC 校验寄存器(BKP_RTCCR)的 CCO 位来开启这一功能。通过配置 CAL[6:0]位,此时钟可以最多减慢 121ppm。
4 例程设计
4.1 BKP_BackupData
- UART 通信模块UART_Configuration函数:使能 USART1 和 GPIOA 时钟,配置 GPIO 引脚用于 UART 通信,初始化 USART 参数(波特率、数据位、停止位等),并使能 USART1。
- 重定向printf函数:通过SER_PutChar和fputc函数将printf输出重定向到 USART1,方便通过串口输出调试信息。
- 备份寄存器操作模块WriteToBackupReg函数:将一系列递增的数据写入备份寄存器。数据从FirstBackupData开始,每个寄存器的值递增0x5A。
- CheckBackupReg函数:检查备份寄存器中的数据是否与预期一致。若所有寄存器的数据都正确,返回 0;若有不一致,返回第一个不一致的寄存器索引加 1。
- 主函数模块初始化系统时钟、延时函数和 UART。
- 使能备份寄存器和电源管理外设的时钟,清除备份寄存器标志。
- 输出系统时钟信息和测试提示信息。
- 检查复位标志RCC_FLAG_PORRST:若该标志置位,表明是 POR/PDR 复位,调用WriteToBackupReg函数写入数据,并输出写入成功信息。
- 若该标志复位,调用CheckBackupReg函数检查数据,并根据检查结果输出相应信息。
- 进入无限循环,保持程序运行。
4.2 BKP_Tamper
该例程是一个基于 W55MH32 的备份寄存器(Backup Registers)测试程序,用于验证备份寄存器的数据保存功能及篡改检测(Tamper Detection)机制。以下是程序的主要工作流程总结:
1. 初始化阶段
(1)使能电源和备份域时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
开启电源控制(PWR)和备份域(BKP)的时钟,为后续操作做准备。
(2)延时函数和串口初始化
delay_init();`
`UART_Configuration(115200);
- delay_init():初始化延时函数。
- UART_Configuration(115200):配置串口 1,波特率为 115200,用于调试信息输出。
(3)获取并打印时钟信息
RCC_GetClocksFreq(&clocks);`
`printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n", ...);
获取并打印系统各总线时钟频率,便于调试。
2. 备份域配置
(1)使能备份区域访问
PWR_BackupAccessCmd(ENABLE);
允许访问备份寄存器和 RTC 寄存器。
(2)配置篡改检测功能
BKP_TamperPinCmd(DISABLE);`
`BKP_ITConfig(DISABLE);`
`BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);`
`BKP_ClearFlag();
- 禁用篡改引脚和中断,设置引脚触发电平为低。
- 清除备份域标志位。
(3)重新使能篡改检测
BKP_ITConfig(ENABLE);`
`BKP_TamperPinCmd(ENABLE);
使能篡改中断和引脚检测功能。
3. 写入备份寄存器
(1)写入数据
WriteToBackupReg(0xA53C);
向 42 个备份寄存器写入递增数据(起始值 0xA53C,每个寄存器递增 0x5A)。
示例写入值:0xA53C, 0xA596, 0xA5F0, ..., 0xA53C + 41×0x5A。
4. 验证数据完整性
(1)检查写入结果
if (CheckBackupReg(0xA53C) == 0x00)`
` printf("Backup Data Write Success\n");`
`else`
` printf("Backup Data Write Fail\n");
CheckBackupReg() 函数遍历所有备份寄存器,验证数据是否与期望值一致。
若所有寄存器正确,打印成功信息;否则打印失败并返回错误寄存器索引。
5. 篡改检测机制
(1)中断配置
NVIC_Configuration();
配置篡改中断(TAMPER_IRQn)的优先级为抢占优先级 0,子优先级 0。
(2)中断处理函数
void` `TAMPER_IRQHandler(void)`
`{`
`if` `(IsBackupRegReset()` `==` `0)`
`printf("Backup Tameper Attack\n");` `// 所有寄存器被复位,检测到篡改`
`else`
`printf("Backup Tameper No Attack\n");` `// 寄存器数据正常`
`// 清除标志并重新使能篡改检测`
`}
- 当篡改引脚(默认 PB12)检测到低电平触发时,触发中断。
- 通过 IsBackupRegReset() 检查所有备份寄存器是否被复位:若全为 0x0000,说明数据被清除,报告攻击。
- 否则,认为数据正常。
5 下载验证
5.1 BKP_BackupData
程序启动
- 串口输出系统时钟频率信息,包含 SYSCLK、HCLK、PCLK1、PCLK2 和 ADCCLK 的频率,帮助确认系统时钟配置是否正确。
- 显示 "Backup Data Test.",表明开始进行备份数据测试。
- 输出RCC->CSR寄存器的值。
上电复位或掉电复位情况
- 若检测到 POR/PDR 复位标志(RCC_FLAG_PORRST)置位,串口输出 "POR/PDR Reset Flag Set"。
- 随后调用WriteToBackupReg函数向备份寄存器写入数据,完成后串口输出 "Backup Data Write Success"。
非上电复位或掉电复位情况
- 若检测到 POR/PDR 复位标志复位,串口输出 "POR/PDR Reset Flag Reset"。
- 调用CheckBackupReg函数检查备份寄存器中的数据:若数据检查成功,串口输出 "Backup Data Check Success"。
- 若数据检查失败,串口输出 "Backup Data Check Fail"。
程序持续运行
完成上述操作后,程序进入无限循环,持续运行但不再有其他输出,除非系统再次发生复位触发相应操作。

5.2 BKP_Tamper
