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);
}

注意事项

  1. 时钟使能:使用BKP外设前必须先使能PWR和BKP时钟
  2. 访问权限:写入备份寄存器前必须调用PWR_BackupAccessCmd(ENABLE)使能访问权限
  3. 侵入检测:侵入事件会清除所有备份寄存器的内容,使用时需谨慎
  4. 中断处理:在中断服务程序中必须清除中断挂起位
  5. 校准值范围:RTC校准值必须在0-127范围内
  6. 寄存器地址:备份寄存器地址是固定的,不能随意修改

总结

STM32F10x BKP外设提供了强大的数据备份和侵入检测功能。通过42个备份数据寄存器,可以在系统掉电或复位后保持重要数据。侵入检测功能可以检测外部干扰并自动清除备份数据,提高系统安全性。RTC输出功能可以将RTC信号输出到侵入引脚,方便外部设备同步。在使用时需要注意正确的初始化顺序和权限设置,确保功能的正常使用。