stm32f10x_bkp
BKP(Backup)外设是STM32F10x系列微控制器中的备份寄存器模块,主要用于数据备份和侵入检测功能。该外设包含42个16位备份数据寄存器,在系统掉电或复位后数据仍然保持,同时支持侵入引脚检测功能。
数据类型定义
侵入引脚电平定义
#define BKP_TamperPinLevel_High ((uint16_t)0x0000) /* 侵入引脚高电平有效 */
#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) /* 侵入引脚低电平有效 */说明:
BKP_TamperPinLevel_High:侵入引脚高电平触发侵入检测BKP_TamperPinLevel_Low:侵入引脚低电平触发侵入检测
RTC输出源定义
#define BKP_RTCOutputSource_None ((uint16_t)0x0000) /* 无RTC输出 */
#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) /* RTC校准时钟输出 */
#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) /* RTC闹钟输出 */
#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) /* RTC秒脉冲输出 */说明:
BKP_RTCOutputSource_None:侵入引脚不输出RTC信号BKP_RTCOutputSource_CalibClock:侵入引脚输出RTC校准时钟信号BKP_RTCOutputSource_Alarm:侵入引脚输出RTC闹钟信号BKP_RTCOutputSource_Second:侵入引脚输出RTC秒脉冲信号
BKP寄存器定义
STM32F10x BKP外设包含以下寄存器:
#define BKP_DR1 ((uint16_t)0x0004) /* 备份数据寄存器1 */
#define BKP_DR2 ((uint16_t)0x0008) /* 备份数据寄存器2 */
#define BKP_DR3 ((uint16_t)0x000C) /* 备份数据寄存器3 */
#define BKP_DR4 ((uint16_t)0x0010) /* 备份数据寄存器4 */
#define BKP_DR5 ((uint16_t)0x0014) /* 备份数据寄存器5 */
#define BKP_DR6 ((uint16_t)0x0018) /* 备份数据寄存器6 */
#define BKP_DR7 ((uint16_t)0x001C) /* 备份数据寄存器7 */
#define BKP_DR8 ((uint16_t)0x0020) /* 备份数据寄存器8 */
#define BKP_DR9 ((uint16_t)0x0024) /* 备份数据寄存器9 */
#define BKP_DR10 ((uint16_t)0x0028) /* 备份数据寄存器10 */
#define BKP_DR11 ((uint16_t)0x0040) /* 备份数据寄存器11 */
#define BKP_DR12 ((uint16_t)0x0044) /* 备份数据寄存器12 */
#define BKP_DR13 ((uint16_t)0x0048) /* 备份数据寄存器13 */
#define BKP_DR14 ((uint16_t)0x004C) /* 备份数据寄存器14 */
#define BKP_DR15 ((uint16_t)0x0050) /* 备份数据寄存器15 */
#define BKP_DR16 ((uint16_t)0x0054) /* 备份数据寄存器16 */
#define BKP_DR17 ((uint16_t)0x0058) /* 备份数据寄存器17 */
#define BKP_DR18 ((uint16_t)0x005C) /* 备份数据寄存器18 */
#define BKP_DR19 ((uint16_t)0x0060) /* 备份数据寄存器19 */
#define BKP_DR20 ((uint16_t)0x0064) /* 备份数据寄存器20 */
#define BKP_DR21 ((uint16_t)0x0068) /* 备份数据寄存器21 */
#define BKP_DR22 ((uint16_t)0x006C) /* 备份数据寄存器22 */
#define BKP_DR23 ((uint16_t)0x0070) /* 备份数据寄存器23 */
#define BKP_DR24 ((uint16_t)0x0074) /* 备份数据寄存器24 */
#define BKP_DR25 ((uint16_t)0x0078) /* 备份数据寄存器25 */
#define BKP_DR26 ((uint16_t)0x007C) /* 备份数据寄存器26 */
#define BKP_DR27 ((uint16_t)0x0080) /* 备份数据寄存器27 */
#define BKP_DR28 ((uint16_t)0x0084) /* 备份数据寄存器28 */
#define BKP_DR29 ((uint16_t)0x0088) /* 备份数据寄存器29 */
#define BKP_DR30 ((uint16_t)0x008C) /* 备份数据寄存器30 */
#define BKP_DR31 ((uint16_t)0x0090) /* 备份数据寄存器31 */
#define BKP_DR32 ((uint16_t)0x0094) /* 备份数据寄存器32 */
#define BKP_DR33 ((uint16_t)0x0098) /* 备份数据寄存器33 */
#define BKP_DR34 ((uint16_t)0x009C) /* 备份数据寄存器34 */
#define BKP_DR35 ((uint16_t)0x00A0) /* 备份数据寄存器35 */
#define BKP_DR36 ((uint16_t)0x00A4) /* 备份数据寄存器36 */
#define BKP_DR37 ((uint16_t)0x00A8) /* 备份数据寄存器37 */
#define BKP_DR38 ((uint16_t)0x00AC) /* 备份数据寄存器38 */
#define BKP_DR39 ((uint16_t)0x00B0) /* 备份数据寄存器39 */
#define BKP_DR40 ((uint16_t)0x00B4) /* 备份数据寄存器40 */
#define BKP_DR41 ((uint16_t)0x00B8) /* 备份数据寄存器41 */
#define BKP_DR42 ((uint16_t)0x00BC) /* 备份数据寄存器42 */标准库函数详解
1. BKP_DeInit
/**
* @brief 将 BKP 所有寄存器恢复为复位默认值,用于重新配置前清空旧状态
* @param 无
* @retval 无
* @example
* BKP_DeInit();
* 将BKP外设恢复到初始状态
*/
void BKP_DeInit(void);功能说明:
- 清除侵入引脚配置、RTC 输出等控制寄存器
- 不会清除备份数据寄存器内容
2. BKP_TamperPinLevelConfig
/**
* @brief 配置侵入检测引脚的有效触发电平(高/低)
* @param BKP_TamperPinLevel: 侵入引脚电平配置
* 该参数可以是以下值之一:
* @arg BKP_TamperPinLevel_High: 高电平有效
* @arg BKP_TamperPinLevel_Low: 低电平有效
* @retval 无
* @example
* BKP_TamperPinLevelConfig(BKP_TamperPinLevel_High);
* 配置侵入引脚为高电平有效
*/
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);功能说明:
- 高电平或低电平触发侵入事件
- 需与 TamperPinCmd 配合使能检测
3. BKP_TamperPinCmd
/**
* @brief 使能/禁用侵入检测引脚,用于防拆/安全监控
* @param NewState: 侵入引脚功能的新状态
* 该参数可以是以下值之一:
* @arg ENABLE: 使能侵入引脚功能
* @arg DISABLE: 禁用侵入引脚功能
* @retval 无
* @example
* BKP_TamperPinCmd(ENABLE);
* 使能侵入引脚功能
*/
void BKP_TamperPinCmd(FunctionalState NewState);功能说明:
- ENABLE 后开始监测 PC13 侵入引脚
- 触发侵入事件会清除全部备份寄存器
4. BKP_ITConfig
/**
* @brief 使能/屏蔽 BKP 侵入中断,配合 NVIC 响应安全事件
* @param NewState: BKP中断的新状态
* 该参数可以是以下值之一:
* @arg ENABLE: 使能BKP中断
* @arg DISABLE: 禁用BKP中断
* @retval 无
* @example
* BKP_ITConfig(ENABLE);
* 使能BKP中断
*/
void BKP_ITConfig(FunctionalState NewState);功能说明:
- 侵入事件发生时产生 TAMPER 中断
- 需配合 NVIC_EnableIRQ(TAMPER_IRQn)
5. BKP_RTCOutputConfig
/**
* @brief 配置侵入引脚输出 RTC 信号(校准/闹钟/秒脉冲)
* @param BKP_RTCOutputSource: RTC输出源选择
* 该参数可以是以下值之一:
* @arg BKP_RTCOutputSource_None: 无输出
* @arg BKP_RTCOutputSource_CalibClock: 在侵入引脚上输出分频64的RTC时钟
* @arg BKP_RTCOutputSource_Alarm: 闹钟输出
* @arg BKP_RTCOutputSource_Second: 秒脉冲输出
* @retval 无
* @example
* BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);
* 配置侵入引脚输出RTC秒脉冲
*/
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);功能说明:
- 复用 PC13 输出 RTC 校准时钟、闹钟或秒脉冲
- 与侵入检测功能互斥,不可同时使用
6. BKP_SetRTCCalibrationValue
/**
* @brief 设置 RTC 时钟校准值(0–127),补偿晶振频率偏差
* @param CalibrationValue: RTC校准值,范围0-127
* @retval 无
* @example
* BKP_SetRTCCalibrationValue(64);
* 设置RTC校准值为64
*/
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);功能说明:
- 写入 BKP 校准寄存器,微调 RTC 走时精度
- 需先 PWR_BackupAccessCmd(ENABLE)
7. BKP_WriteBackupRegister
/**
* @brief 向指定备份寄存器写入 16 位数据,掉电后仍保持
* @param BKP_DR: 备份数据寄存器地址
* 该参数可以是BKP_DR1到BKP_DR42中的任意一个
* @param Data: 要写入的16位数据
* @retval 无
* @example
* BKP_WriteBackupRegister(BKP_DR1, 0x1234);
* 将数据0x1234写入备份寄存器1
*/
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);功能说明:
- 共 42 个 DR 寄存器(BKP_DR1–DR42)
- VBAT 供电时数据在复位/掉电后保留
8. BKP_ReadBackupRegister
/**
* @brief 读取指定备份寄存器的 16 位数据
* @param BKP_DR: 备份数据寄存器地址
* 该参数可以是BKP_DR1到BKP_DR42中的任意一个
* @retval 备份数据寄存器的16位值
* @example
* uint16_t data = BKP_ReadBackupRegister(BKP_DR1);
* 读取备份寄存器1的值
*/
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);功能说明:
- 常用于恢复掉电前保存的配置或计数
- 可与 WriteBackupRegister 配对使用
9. BKP_GetFlagStatus
/**
* @brief 查询侵入检测标志,判断是否发生安全事件
* @param 无
* @retval 侵入标志状态
* 该返回值可以是以下值之一:
* @arg SET: 检测到侵入事件
* @arg RESET: 未检测到侵入事件
* @example
* FlagStatus flag = BKP_GetFlagStatus();
* 获取侵入标志状态
*/
FlagStatus BKP_GetFlagStatus(void);功能说明:
- 返回 SET 表示检测到侵入事件
- 可用于轮询或中断前的状态确认
10. BKP_ClearFlag
/**
* @brief 清除侵入检测标志,处理完安全事件后需调用
* @param 无
* @retval 无
* @example
* BKP_ClearFlag();
* 清除侵入标志
*/
void BKP_ClearFlag(void);功能说明:
- 清除后标志恢复 RESET
- 处理侵入事件并确认备份数据后调用
11. BKP_GetITStatus
/**
* @brief 查询 BKP 侵入中断是否挂起,用于 ISR 中判断中断源
* @param 无
* @retval BKP中断状态
* 该返回值可以是以下值之一:
* @arg SET: BKP中断已挂起
* @arg RESET: BKP中断未挂起
* @example
* ITStatus status = BKP_GetITStatus();
* 获取BKP中断状态
*/
ITStatus BKP_GetITStatus(void);功能说明:
- 同时检查中断使能位和标志位
- 返回 SET 表示 TAMPER 中断已挂起
12. BKP_ClearITPendingBit
/**
* @brief 清除 BKP 中断挂起位,ISR 结束前必须调用
* @param 无
* @retval 无
* @example
* BKP_ClearITPendingBit();
* 清除BKP中断挂起位
*/
void BKP_ClearITPendingBit(void);功能说明:
- 不清除会导致中断反复进入
- 通常与 GetITStatus 配对使用
使用示例
基本数据备份示例
#include "stm32f10x.h"
void BKP_DataBackup_Example(void)
{
// 使能PWR和BKP时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
// 使能对备份寄存器和RTC的访问
PWR_BackupAccessCmd(ENABLE);
// 写入备份数据
BKP_WriteBackupRegister(BKP_DR1, 0x1234);
BKP_WriteBackupRegister(BKP_DR2, 0x5678);
BKP_WriteBackupRegister(BKP_DR3, 0x9ABC);
// 读取备份数据
uint16_t data1 = BKP_ReadBackupRegister(BKP_DR1);
uint16_t data2 = BKP_ReadBackupRegister(BKP_DR2);
uint16_t data3 = BKP_ReadBackupRegister(BKP_DR3);
}侵入检测示例
#include "stm32f10x.h"
void BKP_TamperDetection_Example(void)
{
// 使能PWR和BKP时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
// 使能对备份寄存器的访问
PWR_BackupAccessCmd(ENABLE);
// 配置侵入引脚为低电平有效
BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);
// 使能侵入引脚功能
BKP_TamperPinCmd(ENABLE);
// 使能BKP中断
BKP_ITConfig(ENABLE);
// 使能NVIC中断
NVIC_EnableIRQ(TAMPER_IRQn);
// 写入一些初始数据
BKP_WriteBackupRegister(BKP_DR1, 0x1234);
}
// 侵入中断服务程序
void TAMPER_IRQHandler(void)
{
if(BKP_GetITStatus() == SET)
{
// 检测到侵入事件,清除所有备份数据
for(int i = 1; i <= 42; i++)
{
BKP_WriteBackupRegister(i * 4, 0x0000);
}
// 清除中断挂起位
BKP_ClearITPendingBit();
}
}RTC输出配置示例
#include "stm32f10x.h"
void BKP_RTCOutput_Example(void)
{
// 使能PWR和BKP时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
// 使能对备份寄存器的访问
PWR_BackupAccessCmd(ENABLE);
// 配置侵入引脚输出RTC秒脉冲
BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);
// 设置RTC校准值
BKP_SetRTCCalibrationValue(64);
}注意事项
- 时钟使能:使用BKP外设前必须先使能PWR和BKP时钟
- 访问权限:写入备份寄存器前必须调用
PWR_BackupAccessCmd(ENABLE)使能访问权限 - 侵入检测:侵入事件会清除所有备份寄存器的内容,使用时需谨慎
- 中断处理:在中断服务程序中必须清除中断挂起位
- 校准值范围:RTC校准值必须在0-127范围内
- 寄存器地址:备份寄存器地址是固定的,不能随意修改
总结
STM32F10x BKP外设提供了强大的数据备份和侵入检测功能。通过42个备份数据寄存器,可以在系统掉电或复位后保持重要数据。侵入检测功能可以检测外部干扰并自动清除备份数据,提高系统安全性。RTC输出功能可以将RTC信号输出到侵入引脚,方便外部设备同步。在使用时需要注意正确的初始化顺序和权限设置,确保功能的正常使用。