离线
TA的每日心情 | 慵懒 2021-7-23 17:16 |
---|
签到天数: 17 天 [LV.4]
|
有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 草帽王子 于 2021-9-10 16:58 编辑
本章教程为后备寄存器(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,串口打印情况如下:
BKP.rar附件下载
15、BKP.rar
(469.04 KB, 下载次数: 12)
链接:https://pan.baidu.com/s/1YJc1JjC65a6909xAyAsfeA
提取码:f3p1
复制这段内容后打开百度网盘手机App,操作更方便哦
完 |
上一篇: 第十五章:CH32V103应用教程——SPI读写FLASH下一篇: 第十七章:CH32V103应用教程——CRC
|