打印
[RISC-V MCU 应用开发]

十六、CH32V103应用教程——后备寄存器(BKP)

[复制链接]
1005|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
RISCVLAR|  楼主 | 2020-11-25 20:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 RISCVLAR 于 2020-11-25 20:10 编辑

CH32V103应用教程——BKP

本章教程为后备寄存器(BKP)侵入检测,当外界提供了一个信号(上升沿或下降沿)时,表示有“侵入事件”,硬件将自动清除当前系统中保留的重要信息。这种方式可以增加系统信息的安全性。

1、BKP简介及相关函数介绍
后备寄存器(BKP)提供了10个16位的通用数据寄存器,可以用来存储20字节的用户数据。在主电源(VDD)掉电后,这些数据仍可以由VBAT供电而保持,不受待机状态、系统复位或电源复位的影响。此外BKP单元还提供了侵入检测管理、RTC时钟校准及脉冲输出功能。

关于BKP侵入检测,侵入检测就是当外界提供了一个信号(上升沿或下降沿)时,表示有“侵入事件”,硬件将自动清除当前系统中保留的重要信息。这种方式可以增加系统信息的安全性。当侵入检测引脚上出现跳变沿(取决于 TPAL 位)时会产生一个侵入事件,如果使能了侵入检测中断,还会同时产生一个侵入检测中断。只要出现了侵入事件,后备数据寄存器就会被全部清除。此外,硬件检测采用**方式,即使侵入检测功能未开启(TPE=0),系统也会采样是否有跳变沿,并在满足 TPAL 位选择情况下,提前锁定侵入事件,并在 TPE 位置 1 下,触发侵入事件。  
例如:当TPAL=0时,如果TPE=0未开启功能,但TAMPER引脚已经为高电平,一旦TPE=1后,则会产生一个额外的侵入事件(系统提前锁定了上升沿)。当TPAL=1时,如果TPE=0未开启功能,但TAMPER引脚已经为低电平,一旦 TPE=1后,则会产生一个额外的侵入事件(系统提前锁定了下降沿)。

所以为了防止发生不必要的侵入事件,导致清除了后备寄存器,建议:在希望硬件检测侵入引脚的开始时刻,通过写BKP_TPCSR寄存器CTE位置1,先清除硬件可能**过的侵入事件,并确保当前侵入检测引脚状态是无效的。

注:当 VDD电源断开时,侵入检测功能仍然有效。为了避免不必要的复位数据后备寄存器,TAMPER 引脚应该在片外连接到正确的电平。

关于CH32V103 BKP具体信息,可参考CH32V103应用手册。CH32V103 BKP标准库函数具体内容如下:
void BKP_DeInit(void);
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
void BKP_TamperPinCmd(FunctionalState NewState);
void BKP_ITConfig(FunctionalState NewState);
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
FlagStatus BKP_GetFlagStatus(void);
void BKP_ClearFlag(void);
ITStatus BKP_GetITStatus(void);
void BKP_ClearITPendingBit(void);
1.1、void BKP_DeInit(void)
功  能:将BKP外围寄存器初始化为其默认重置值。
输  入:无

1.2、void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel)
功  能:配置侵入检测引脚激活级别。
输  入:BKP_TamperPinLevel:指定篡改Pin的活动级别。

1.3、void BKP_TamperPinCmd(FunctionalState NewState)
功  能:启用或禁用侵入检测引脚激活。
输  入:NewState:启用或禁用。

1.4、void BKP_ITConfig(FunctionalState NewState)
功  能:启用或禁用侵入检测中断。
输  入:NewState:启用或禁用。

1.5、void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource)
功  能:选择要在侵入检测引脚上输出的RTC输出源。
输  入:BKP_RTCOutputSource:指定RTC输出源。

1.6、void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue)
功  能:设置RTC时钟校准值。
输  入:CalibrationValue:指定RTC时钟校准值。

1.7、void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)
功  能:将用户数据写入指定的数据备份寄存器。
输  入:BKP_DR:指定数据备份寄存器。Data:要写入的数据。

1.8、uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR)
功  能:从指定的数据备份寄存器读取数据。
输  入:BKP_DR:指定数据备份寄存器。

1.9、FlagStatus BKP_GetFlagStatus(void)
功  能:检查是否设置了侵入检测事件标志。
输  入:无

1.10、void BKP_ClearFlag(void)
功  能:清除侵入检测事件挂起标志。
输  入:无

1.11、ITStatus BKP_GetITStatus(void)
功  能:检查是否发生了侵入检测中断。
输  入:无

1.12、void BKP_ClearITPendingBit(void)
功  能:清除侵入检测引脚中断挂起位。
输  入:无

以上函数在使用时直接在程序中调用即可。

2、硬件设计
本章教程为BKP侵入检测教程,由数据手册可知,侵入检测引脚为PC13,且由应用手册和程序设计可知,侵入检测控制寄存器(BKP_TPCTLR)中TPAL位默认值为0,即即侵入检测引脚上的高电平会清除所有后备数据寄存器(硬件锁定上升沿),所以硬件连接方式如下:
  • PC13连接开发板3.3V引脚

此外,为了保证在主电源(VDD)掉电后,这些数据仍可以由 VBAT供电而保持,不受待机状态、系统复位或电源复位的影响,需对VBAT进行供电,硬件连接方式如下:
  • 开发板VBAT引脚连接开发板3.3V引脚

3、软件设计
本章教程主要用于测试BKP的侵入检测功能,当PC13引脚由低电平跳变为高电平时,表示有“侵入事件”,硬件将自动清除当前系统中保留的重要信息。这种方式可以增加系统信息的安全性。且如果使能了侵入检测中断,还会同时产生一个侵入检测中断。其具体程序如下:
bkp.h文件
#ifndef __BKP_H
#define __BKP_H

#include "ch32v10x_conf.h"

void BKP_Tamper_Init(void);
void TAMPER_IRQHandler(void);

#endif
bkp.h文件主要是相关函数的声明;
bkp.c文件
#include "bkp.h"

void TAMPER_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
/*******************************************************************************
* Function Name  : BKP_Tamper_Init
* Description    : Initializes the BKP Tamper.
* Input          : None
* Return         : None
*******************************************************************************/
void BKP_Tamper_Init(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE ); //使能PWR时钟和BKP时钟

    BKP_TamperPinCmd( DISABLE );   //禁用侵入检测引脚激活
    PWR_BackupAccessCmd( ENABLE ); //启用对RTC和备份寄存器的访问。
    BKP_ClearFlag();               //清除侵入检测事件,此举是为了清除硬件可能**过的侵入事件,并确保当前侵入检测引脚状态是无效的。
    BKP_ITConfig(DISABLE);         //关闭侵入中断

    BKP_WriteBackupRegister( BKP_DR1, 0x9880 ); //将用户数据写入指定的数据备份寄存器。
    BKP_WriteBackupRegister( BKP_DR2, 0x5678 );
    BKP_WriteBackupRegister( BKP_DR3, 0xABCD );
    BKP_WriteBackupRegister( BKP_DR4, 0x3456 );

    printf( "BKP_DR1:%08x\r\n", BKP->DATAR1 );
    printf( "BKP_DR2:%08x\r\n", BKP->DATAR2 );
    printf( "BKP_DR3:%08x\r\n", BKP->DATAR3 );
    printf( "BKP_DR4:%08x\r\n", BKP->DATAR4 );

    //侵入检测引脚(TEMPER引脚)有效电平设置
    BKP_TamperPinLevelConfig( BKP_TamperPinLevel_High ); //BKP_TamperPinLevel_High值为0:侵入检测引脚上的高电平会清除所有后备数据寄存器(硬件锁定上升沿)
  //BKP_TamperPinLevelConfig( BKP_TamperPinLevel_Low );  //BKP_TamperPinLevel_Low值为1:侵入检测引脚上的低电平会清除所有后备数据寄存器(硬件锁定下降沿)
    printf("TPAL=%d\n",BKP->TPCTLR);                     //根据打印值可对侵入检测控制寄存器(BKP_TPCTLR)的各个位的值和状态进行判断

    NVIC_InitStructure.NVIC_IRQChannel = TAMPER_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init( &NVIC_InitStructure );

    BKP_ITConfig( ENABLE );     //使能侵入检测引脚中断。
    BKP_TamperPinCmd( ENABLE ); //使能侵入检测引脚激活
}

/*******************************************************************************
* Function Name  : TAMPER_IRQHandler
* Description    : This function handles SysTick Handler.
* Input          : None
* Return         : None
*******************************************************************************/
void TAMPER_IRQHandler(void)
{
  if( BKP_GetITStatus() == SET ) //如果发生了侵入检测引脚中断
    {
        printf("TAMPER_IRQHandler\r\n");
        printf( "BKP_DR1:%08x\r\n", BKP->DATAR1 );
        printf( "BKP_DR2:%08x\r\n", BKP->DATAR2 );
        printf( "BKP_DR3:%08x\r\n", BKP->DATAR3 );
        printf( "BKP_DR4:%08x\r\n", BKP->DATAR4 );
    }

    BKP_ClearITPendingBit(); //清除中断标志位
}
bkp.c文件主要包含BKP侵入检测初始化函数以及相关中断服务函数。
main.c文件
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n",SystemCoreClock);

    BKP_Tamper_Init();

    while(1);
}

4、下载验证
将开发板VBAT引脚连接开发板3.3V引脚,然后将编译好的程序下载到开发板并复位,观察串口打印情况具体如下:

将PC13连接开发板3.3V引脚,发生侵入检测事件并产生中断,后备寄存器清0,串口打印情况如下:




15、BKP.rar

469.04 KB

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

293

帖子

41

粉丝