#include "TamperDetectionFunction.h"
#include "LED.h"

/*
当TAMPER引脚上的信号从0到1或从1到0
取决于备份控制寄存器BKP_TPCTL的TPAL位,
会产生一个侵入检测事件;
侵入检测事件会将所有数据备份寄存器内容清除。
*/

#define BKP_DATA_REG_NUM  42

void write_backup_register(uint16_t data);
uint32_t check_backup_register(uint16_t data);
uint32_t is_backup_register_clear(void);
void TamperDetectionFunction_Init(void);

//函数功能:TAMPER引脚(PC13)输入低电平时,会产生一个侵入检测事件,它会将所有数据备份寄存器内容清除。
void TamperDetectionFunction_Init(void)
{//MCU提供侵入检测功能以保护重要的用户数据,可通过设置BKP_TPCTL寄存器中的TPEN位来使能TAMPER引脚对应的功能。
    nvic_irq_enable(TAMPER_IRQn,0,0);//设置TAMPER_IRQn的中断优先级,抢占优先级为0,子优先级为0

rcu_periph_clock_enable(RCU_PMU);//使能RCU_PMU时钟
    rcu_periph_clock_enable(RCU_BKPI);//使能RCU_BKPI时钟

pmu_backup_write_enable();                          //使能对备份域寄存器的写访问
    bkp_tamper_active_level_set(TAMPER_PIN_ACTIVE_LOW); //配置TAMPER引脚(PC13)输入低电平有效
    bkp_tamper_detection_disable();//不使能"TAMPER引脚(PC13)实现备份复位功能"
    bkp_interrupt_disable();       //不使能"TAMPER-RTC引脚(PC13)侵入中断"
    bkp_flag_clear();              //清除"TAMPER-RTC引脚(PC13)侵入事件标志"
    bkp_interrupt_enable();        //TAMPER-RTC引脚(PC13)侵入中断使能
    bkp_tamper_detection_enable(); //使能"TAMPER引脚(PC13)可实现备份复位功能"

/*
    bkp_data_write(BKP_DATA_41,0xA0A0);//将0xA0A0写入备份数据寄存器41
    if(bkp_data_read(BKP_DATA_41)==0xA0A0) LED2_On();
    else LED3_On();
*/

write_backup_register(0x1226);
    if(0x00 == check_backup_register(0x1226)) LED2_On();//写入备份数据寄存器正确
    else  LED3_On();//写入备份数据寄存器不正确
}

void write_backup_register(uint16_t data)
{
    uint32_t temp = 0;

/* write data to backup data registers */
    for (temp = 0; temp < BKP_DATA_REG_NUM; temp++)
    {
        if(temp < 10)
        {
            BKP_DATA0_9(temp) = data + (temp * 0x50);
            //等价bkp_data_write(temp+1,(temp * 0x50));
        }
        else
        {
            BKP_DATA10_41(temp) = data + (temp * 0x50);
            //等价bkp_data_write(temp+1,(temp * 0x50));
        }
    }
}

/*!
    \brief      check if the backup DATAx registers values are correct or not
    \param[in]  data: the data to be written to backup data registers
      \arg        0x0000-0xFFFF
    \param[out] none
    \retval     the number of data register
*/
uint32_t check_backup_register(uint16_t data)
{
    uint32_t temp = 0;
    /* check the data of backup data registers */
    for(temp = 0; temp < BKP_DATA_REG_NUM; temp++)
    {
        if(temp < 10)
        {
            /* get data from data register 0-9 */
            if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA0_9(temp)))
            {//BKP_DATA_GET(BKP_DATA0_9(temp)和bkp_data_read( (temp+1))等价
                return temp+1;
            }
        }
        else
        {
            /* get data from data register 10-41 */
            if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA10_41(temp)))
            {//BKP_DATA_GET(BKP_DATA10_41(temp)和bkp_data_read( (temp+1))等价
                return temp+1;
            }
        }
    }
    return 0;
}

/*!
    \brief      check if the backup data registers are clear or not
    \param[in]  none
    \param[out] none
    \retval     the number of data register
*/
uint32_t is_backup_register_clear(void)
{
    uint32_t temp = 0;
    
    for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){
        if(temp < 10){
            /* check if the data of data register 0-9 is 0x0000 */
            if(0x0000 != BKP_DATA_GET(BKP_DATA0_9(temp)))
                        {//BKP_DATA_GET(BKP_DATA0_9(temp)和bkp_data_read( (temp+1))等价
                return temp+1;
            }
        }else{
            /* check if the data of data register 10-41 is 0x0000 */
            if(0x0000 != BKP_DATA_GET(BKP_DATA10_41(temp)))
                        {//BKP_DATA_GET(BKP_DATA10_41(temp)和bkp_data_read( (temp+1))等价
                return temp+1;
            }
        }
    }
    return 0;
}

//bkp_tamper_active_level_set(TAMPER_PIN_ACTIVE_LOW)配置TAMPER引脚(PC13)输入低电平有效
//TAMPER引脚(PC13)输入低电平时,会产生一个侵入检测事件,它会将所有数据备份寄存器内容清除。
void TAMPER_IRQHandler(void)
{
    if(RESET != bkp_interrupt_flag_get())
    {
/*
        if(bkp_data_read(BKP_DATA_41)==0x0000) LED4_On();//"备份数据寄存器41"中的数据被清除了
        else LED5_On();
*/
        if(0 == is_backup_register_clear())
        {//"备份数据寄存器"中的数据被清除了
            LED4_On();
        }
        else
        {//"备份数据寄存器"中的数据没有被清除
            LED5_On();
        }

bkp_interrupt_flag_clear();//清除"TAMPER-RTC引脚(PC13)侵入中断标志",clear the interrupt bit flag of tamper interrupt
        bkp_flag_clear();//清除"TAMPER-RTC引脚(PC13)侵入事件标志",clear the bit flag of tamper event

bkp_interrupt_disable();//不使能"TAMPER-RTC引脚(PC13)侵入中断",disable the tamper pin
        bkp_interrupt_enable();//TAMPER-RTC引脚(PC13)侵入中断使能,enable the tamper pin
        bkp_tamper_active_level_set(TAMPER_PIN_ACTIVE_LOW);//配置TAMPER引脚(PC13)输出低电平有效,tamper pin active level set
    }
}

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t,bool

#include "LED.h"
#include "TamperDetectionFunction.h"

int main(void)
{

//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
    //NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
    //NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
    //NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
    //NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  INTX_ENABLE();//开启所有中断

LED2_Init();//初始化LED2端口
    LED3_Init();//初始化LED3端口
    LED4_Init();//初始化LED4端口
    LED5_Init();//初始化LED5端口

TamperDetectionFunction_Init();

while(1)
    {
    }
}

GD32F10x的侵入检测事件相关推荐

  1. stm32之备份寄存器(BKP)应用(侵入检测中断)

    前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次数.保存这些动态信息其实有很多种方法,第一种:在系统掉电前保 ...

  2. unity3d 屏幕触摸检测事件

    屏幕上的触摸检测一般会检测点击,滑动,长按等 TouchPhase Enumeration Describes phase of a finger touch. Values Began A fing ...

  3. STM32-RTC实时时钟

    1 RTC实时时钟特征与原理 1.1 RTC简介 RTC是一个独立的定时器.RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能.修改计数器的值可以重新设置系统当前的时间和日期. ...

  4. 嵌入式系统(五):GPIO(输入输出端口扩展器)接口

    文章目录 1. GPIO结构及特点: (1)GPIO功能模式 (i)GPIO复用功能(AFIO,Alternate function) (ii)GPIO数字输入模式 (iii)模拟输入模式 (iii) ...

  5. stm32 BKP寄存器操作[操作寄存器+库函数]

    BKP是"BACKUP"的缩写,stm32f103RCTE的内部配备了10个16位宽度的BKP寄存器.在主电源切断或系统产生复位时间时,BKP寄存器仍然可以在备用电源的支持下保持其 ...

  6. 【STM32】HAL库-备份寄存器(BKP)

    简介 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据. 他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电. 当系统在待机模式下被唤醒,或系统复位或电源复位时, ...

  7. stm32 BKP 擦除后备寄存器存储的数据

    这里只为了将写入后备寄存器的数据毁灭,相当于擦除操作. 具体详细功能请查看stm32F103数据手册(中文手册:第五章 第47页开始) 侵入脚PC13 //TAMPER引脚中断配置 void TAMP ...

  8. stm32F103R6之BKP(备份寄存器)

    目录 概述 侵入检测 RTC校准 概述 Stm32F103有42个16位的备份寄存器.他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电.当系统在待机模式下被唤醒,或系统复位或电源复位时 ...

  9. STM32F103--BKP

    备注:         这是自己基于STM32的BKP备份寄存器的学习. BKP功能:  1  系统从待机模式或系统或电源复位时BKP备份寄存器不会被复位,保护程序运行数据. 2  BKP还可以管理嵌 ...

最新文章

  1. 搞机器学习,Python和R哪个更合适?
  2. VS2005 宽字符 unicode字符集和多字节字符集
  3. python打包不能在其他电脑打开、找不到指定模块,pyinstaller打包移植到别的电脑报错OSError: [WinError 126] 找不到指定的模块。...
  4. RealWave Surfaces 泡沫
  5. linux git ssh 配置文件,git bash配置ssh 登录 Linux的方法
  6. 1203.2——条件语句 之 switch语句
  7. 程序员必读的10本经典书(含资源)建议收藏
  8. .NET程序员我是如何通过一个产品在2年内买车买房
  9. [离散数学]命题逻辑P_2:命题联结词
  10. u盘启动计算机的几种方式,U盘各种启动模式方法介绍 六种U盘启动模式
  11. inside-outside algorithm详解
  12. 信号系统服务器,四大导航系统信号介绍
  13. 解决Cipher Suites导致的“未能创建 SSL/TLS 安全通道”异常问题
  14. 莱鸟学spss数据分析之第六章---描述性分析
  15. 64卦加密解密(娱乐用)
  16. 【Linux】ssh支持的加密算法有哪些?
  17. uc 浏览器不能打开网页
  18. 将实时三维计算机技术,基于结构光实时三维重建计算机应用技术专业论文.docx...
  19. 萨克斯《全球视角的宏观经济学》课后答案
  20. 硬盘健康状态、温度、通电次数、写入量和序列号检查软件

热门文章

  1. LeetCode 428. 序列化和反序列化 N 叉树***
  2. flickr php,phpFlickr并从Flickr获取图像
  3. Java 文件输入输出流 实验题
  4. Vue3获取地址栏参数
  5. python延时执行下一步
  6. DSP看门狗实验源程序
  7. windows10使用剪贴板历史记录,怎么设置同时复制多条内容?
  8. 科幻创新基站 打造科幻产业发展新范式 ——中关村科幻产业创新中心正式启航
  9. 全球与中国纳米压印光刻系统市场发展调研及投资价值报告2022-2028年版
  10. exFAT和NTFS哪个好