本帖最后由 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,即即侵入检测引脚上的高电平会清除所有后备数据寄存器(硬件锁定上升沿),所以硬件连接方式如下:
此外,为了保证在主电源(VDD)掉电后,这些数据仍可以由 VBAT供电而保持,不受待机状态、系统复位或电源复位的影响,需对VBAT进行供电,硬件连接方式如下:
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,串口打印情况如下:
|