查看: 1616|回复: 0
收起左侧

第十六章:CH32V103应用教程——BKP

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-23 13:03:12 | 显示全部楼层 |阅读模式

    有人预言,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标准库函数具体内容如下:
    1. void BKP_DeInit(void);
    2. void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
    3. void BKP_TamperPinCmd(FunctionalState NewState);
    4. void BKP_ITConfig(FunctionalState NewState);
    5. void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);
    6. void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
    7. void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
    8. uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
    9. FlagStatus BKP_GetFlagStatus(void);
    10. void BKP_ClearFlag(void);
    11. ITStatus BKP_GetITStatus(void);
    12. 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文件
    1. #ifndef __BKP_H
    2. #define __BKP_H

    3. #include "ch32v10x_conf.h"

    4. void BKP_Tamper_Init(void);
    5. void TAMPER_IRQHandler(void);

    6. #endif
    复制代码
    bkp.h文件主要是相关函数的声明;

    bkp.c文件
    1. #include "bkp.h"

    2. void TAMPER_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
    3. /*******************************************************************************
    4. * Function Name  : BKP_Tamper_Init
    5. * Description    : Initializes the BKP Tamper.
    6. * Input          : None
    7. * Return         : None
    8. *******************************************************************************/
    9. void BKP_Tamper_Init(void)
    10. {
    11.     NVIC_InitTypeDef NVIC_InitStructure;

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

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

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

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

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

    29.     NVIC_InitStructure.NVIC_IRQChannel = TAMPER_IRQn;
    30.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    31.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    32.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    33.     NVIC_Init( &NVIC_InitStructure );

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

    37. /*******************************************************************************
    38. * Function Name  : TAMPER_IRQHandler
    39. * Description    : This function handles SysTick Handler.
    40. * Input          : None
    41. * Return         : None
    42. *******************************************************************************/
    43. void TAMPER_IRQHandler(void)
    44. {
    45.   if( BKP_GetITStatus() == SET ) //如果发生了侵入检测引脚中断
    46.     {
    47.         printf("TAMPER_IRQHandler\r\n");
    48.         printf( "BKP_DR1:%08x\r\n", BKP->DATAR1 );
    49.         printf( "BKP_DR2:%08x\r\n", BKP->DATAR2 );
    50.         printf( "BKP_DR3:%08x\r\n", BKP->DATAR3 );
    51.         printf( "BKP_DR4:%08x\r\n", BKP->DATAR4 );
    52.     }

    53.     BKP_ClearITPendingBit(); //清除中断标志位
    54. }
    复制代码
    bkp.c文件主要包含BKP侵入检测初始化函数以及相关中断服务函数。

    main.c文件
    1. int main(void)
    2. {
    3.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    4.     USART_Printf_Init(115200);
    5.     printf("SystemClk:%d\r\n",SystemCoreClock);

    6.     BKP_Tamper_Init();

    7.     while(1);
    8. }
    复制代码


    4、下载验证

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

    CH32V CH573单片机芯片-第十六章:CH32V103应用教程——BKPrisc-v单片机中文社区(1)

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

    CH32V CH573单片机芯片-第十六章:CH32V103应用教程——BKPrisc-v单片机中文社区(2)
    BKP.rar附件下载
    CH32V CH573单片机芯片-第十六章:CH32V103应用教程——BKPrisc-v单片机中文社区(3) 15、BKP.rar (469.04 KB, 下载次数: 12)
    链接:https://pan.baidu.com/s/1YJc1JjC65a6909xAyAsfeA

    提取码:f3p1
    复制这段内容后打开百度网盘手机App,操作更方便哦





    上一篇:第十五章:CH32V103应用教程——SPI读写FLASH
    下一篇:第十七章:CH32V103应用教程——CRC
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-26 09:52 , Processed in 0.374608 second(s), 47 queries .

    快速回复 返回顶部 返回列表