GD32F103VE侵入事件

news2024/10/7 14:29:05

GD32F103VE的TAMPER引脚(PC13),当PC13输入低电平时,会产生一个侵入检测事件。它会将所有“数据备份寄存器”内容清除。
这个功能有什么用?
一是防止被人开壳,抄袭。二是自毁功能。

直奔主题,多一句就是浪费时间。测试程序如下:

#include "TamperDetectionFunction.h"
#include "stdio.h"  //使能printf(),sprintf()
//#include "LED.h"

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

#define BKP_DATA_REG_NUM  42  //备份寄存器有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)输入低电平时,会产生一个侵入检测事件,它会将所有数据备份寄存器内容清除。
//为防止侵入事件丢失,PC13引脚检测到边沿检测信号与TPEN位的逻辑与作为侵入检测信号
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引脚(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);//将0x1226写入地址为BKP_DATA_0的备份寄存器
	if(0x00 == check_backup_register(0x1226))//写入备份数据寄存器正确
	{
//		MCU_Led_On();//写入备份数据寄存器正确
		printf("\r\nwrite_backup_register OK!!!");
	}
	else//写入备份数据寄存器不正确
	{
//		MCU_Led_Off();//写入备份数据寄存器不正确
		printf("\r\nwrite_backup_register Error!!!");
	}
}

//函数功能:将data,data+0x50,data+0x50*2,......data+0x50*41,写入备份寄存器
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++)
	{
		bkp_data_write( (bkp_data_register_enum)(temp+1),(data + (temp * 0x50)) );
		//BKP_DATA_0的初始值为1,所以这里要用(temp+1)
//		if(temp < 10)
//		{
//			BKP_DATA0_9(temp) = data + (temp * 0x50);
//		}
//		else
//		{
//			BKP_DATA10_41(temp) = data + (temp * 0x50);
//		}
	}
}

//函数功能:从备份寄存器读取数据,并比较;若发现错误,则返回
uint32_t check_backup_register(uint16_t data)
{
	uint32_t temp = 0;

	for(temp = 0; temp < BKP_DATA_REG_NUM; temp++)
	{
		if(bkp_data_read( (bkp_data_register_enum)(temp+1) ) != (data + (temp * 0x50)) )
		{//BKP_DATA_0的初始值为1,所以这里要用(temp+1)
			return temp+1;//发现错误
		}

//		if(temp < 10)
//		{
//			//get data from data register 0-9
//			if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA0_9(temp)))
//			{
//				return temp+1;
//			}
//		}
//		else
//		{
//			//get data from data register 10-41
//			if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA10_41(temp)))
//			{
//				return temp+1;
//			}
//		}
	}

	return 0;
}

//函数功能:检查"备份寄存器"的数据是否为0x0000,并比较;若发现不是0x0000,则返回
uint32_t is_backup_register_clear(void)
{
	uint32_t temp = 0;

	for(temp = 0; temp < BKP_DATA_REG_NUM; temp++)
	{
		if(bkp_data_read((bkp_data_register_enum)(temp+1))!=0x0000)
		{//BKP_DATA_0的初始值为1,所以这里要用(temp+1)
			return temp+1;//发现错误
		}
//		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;
}

//函数功能:"TAMPER引脚(PC13)侵入中断服务函数
//bkp_tamper_active_level_set(TAMPER_PIN_ACTIVE_LOW)配置TAMPER引脚(PC13)输入低电平有效
//TAMPER引脚(PC13)输入低电平时,会产生一个侵入检测事件,它会将所有数据备份寄存器内容清除。
void TAMPER_IRQHandler(void)
{
	if(RESET != bkp_interrupt_flag_get())//读取"TAMPER-RTC引脚(PC13)侵入中断标志"
	{
		if(0 == is_backup_register_clear())//发现"侵入事件"清除了"备份数据寄存器"
		{//"备份数据寄存器"中的数据被清除了
//			MCU_Led_On();
			printf("\r\nClear backup_register!!!");
		}
		else//发现"侵入事件"没有清除"备份数据寄存器"
		{//"备份数据寄存器"中的数据没有被清除
//			MCU_Led_On();
			printf("\r\nDon't Clear backup_register!!!");
		}

		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 "UART3.h"
#include "stdio.h"  //使能printf(),sprintf()

void UART3_Init(unsigned int bound);

//函数功能:初始化串口3,这个和STM32F103VET6的UART4兼容
void UART3_Init(unsigned int bound)
{
	rcu_periph_clock_enable(RCU_GPIOC); //使能GPIOC时钟,enable GPIO clock 
	rcu_periph_clock_enable(RCU_UART3); //使能UART3时钟,enable USART clock

	gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
	//将GPIOC10设置为AFIO口(复用IO口),输出上拉

	gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
	//将GPIOC11设置为浮空输入口

	usart_deinit(UART3);                         //复位UART3,USART configure
	usart_baudrate_set(UART3, bound);          //设置UART3的波特率
	usart_word_length_set(UART3, USART_WL_8BIT); //设置UART3数据传输格式为8位
	usart_stop_bit_set(UART3, USART_STB_1BIT);   //设置UART3停止位为1位
	usart_parity_config(UART3, USART_PM_NONE);   //设置UART3无需奇偶校验
	usart_hardware_flow_rts_config(UART3, USART_RTS_DISABLE); //设置不使能UART3的RTS引脚功能
	usart_hardware_flow_cts_config(UART3, USART_CTS_DISABLE); //设置不使能UART3的CTS引脚功能
	usart_receive_config(UART3, USART_RECEIVE_ENABLE);   //使能UART3接收
	usart_transmit_config(UART3, USART_TRANSMIT_ENABLE); //使能UART3发送
	usart_enable(UART3); //使能UART3
}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
	usart_data_transmit(UART3, (uint8_t) ch);
	while( RESET == usart_flag_get(UART3, USART_FLAG_TBE) )
	{//等待串口0发送结束
	}

	return ch;
}

 main.c程序如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t,bool
#include "UART3.h"
#include "stdio.h"  //使能printf(),sprintf()

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

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
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"
	UART3_Init(115200);//初始化UART3
	printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"

  INTX_ENABLE();//开启所有中断

	LED_Init();//初始化MCU_Led

	TamperDetectionFunction_Init();
//TAMPER引脚(PC13)输入低电平时,会产生一个侵入检测事件,它会将所有数据备份寄存器内容清除。
//当将PC13输入低电平时,串口输出"Clear backup_register!!!"
	while(1)
	{
	}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nsqd的架构及源码分析

文章目录 一 nsq的整体代码结构 二 回顾nsq的整体架构图 三 nsqd进程的作用 四 nsqd启动流程的源码分析 五 本篇博客总结 在博客 nsq整体架构及各个部件作用详解_YZF_Kevin的博客-CSDN博客 中我们讲了nsq的整体框架&#xff0c;各个部件的大致作用。如果没看过的&…

cloudstack远程调试

前置条件&#xff1a;服务器安装好cloudstack的management、agent; 1、managemeng、agent启动服务文件 packaging/systemd cloudstack-agent.default # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTIC…

openmp和avx配置

实际场景&#xff1a; 项目中数据拷贝慢&#xff08;使用的是memcpy&#xff09;&#xff0c;希望能加速拷贝&#xff0c;所以尝试了使用avx的流方式&#xff0c;和openmp方式处理 问题1&#xff1a; 调用avx是报错 error: inlining failed in call to always_inline ‘__m512…

亲测有效!帮你更方便更舒服使用ubuntu20.04!!!

今天要记录的是如何更舒服的使用ubuntu20.04&#xff0c;全部内容就在上面这张图里&#xff0c;包括三方面&#xff1a;1、ubuntu美化&#xff1b;2、ubuntu扩展&#xff1b;3、必备软件。 1、ubuntu美化 这部分内容可以直接参考&#xff1a;这位大佬&#xff0c;讲的很详细也…

gRPC三种Java客户端性能测试实践

本篇文章只做性能测试实践&#xff0c;不会测试各类状况下极限性能&#xff0c;所以硬件配置和软件参数就不单独分享了。 服务端 依旧采用了fun_grpc项目的SDK内容。服务端代码如下&#xff1a; package com.funtester.grpc;import com.funtester.frame.execute.ThreadPoolU…

Python实现GA遗传算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

验证码安全志:AIGC+集成环境信息信息检测

目录 知己知彼&#xff0c;黑灰产破解验证码的过程 AIGC加持&#xff0c;防范黑灰产的破解 魔高一丈&#xff0c;黑灰产AIGC突破常规验证码 双重防护&#xff0c;保障验证码安全 黑灰产经常采用批量撞库方式登录用户账号&#xff0c;然后进行违法违规操作。 黑灰产将各种方…

RL — 强化学习算法概述

一、说明 在本系列中&#xff0c;我们检查了许多强化学习&#xff08;RL&#xff09;算法&#xff0c;例如&#xff0c;MoJoCo任务的策略梯度方法&#xff0c;Atari游戏的DQN和机器人控制的基于模型的RL。虽然许多算法都是针对特定领域引入的&#xff0c;但这种联系只能是遗留的…

BKTEM-3A型热电材料性能测试仪(动态法)

BKTEM-3A型热电材料性能测试仪(动态法) 关键词&#xff1a;塞贝克&#xff08;seebeck&#xff09;&#xff0c;波尔贴&#xff08;Peltier&#xff09;效应&#xff0c;热电系数 BKTEM-3型热电材料性能测试仪热电材料也称温差电材料&#xff08;thermoelectric materials&…

c语言const修饰的说明

1、const修饰的为常量&#xff0c;不可以直接修改&#xff0c;但是可以通过指针修改 #include "stdio.h" #include <stdlib.h>int main() {//1、constconst int a 10;//a 100;//err 左值不可修改&#xff0c;const修饰的为常量&#xff0c;不可以直接修改&a…

WSL2安装CentOS7和CentOS8

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载ZIP包&#xff1f;二、安装1.打开Windows子系统支持2.安装到指定位置3.管理虚拟机4.配置虚拟机1.配置国内源2.安装软件3.安装第三方源 5.配置用户1.创建…

iNav飞控之FAILSAFE机制

iNav飞控之FAILSAFE机制 1. 源由2. 设计2.1 触发场景2.1.1 上锁时触发2.1.2 解锁时触发 2.2 FAILSAFE策略2.2.1 DROP2.2.2 LAND2.2.3 SET-THR2.2.4 RTH2.2.5 NONE 2.3 异常场景2.3.1 救援上锁2.3.2 救援后解锁2.3.3 FAILSAFE地面预判2.3.4 RTH丢失定位2.3.5 RC链路恢复 3. 重要…

怎样做好字幕翻译服务?

我们知道&#xff0c;字幕泛指影视作品后期加工的文字&#xff0c;往往显示在电视、电影、舞台作品中。字幕翻译就是将外国影片配上本国字幕或者是将本国影片配上外国字幕。那么&#xff0c;字幕翻译的主要流程是什么&#xff0c;怎样做好字幕翻译服务&#xff1f; 据了解&…

二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进…

IDEA超强XSD文件编辑插件-XSD / WSDL Visualizer

前言 XSD / WSDL Visualizer可以简化XML架构定义(XSD)和WSDL文件编辑过程; 通过使用与IntelliJ无缝集成的可视化编辑器&#xff0c;转换处理XSD和WSDL文件的方式。告别导航复杂和难以阅读的代码的挫败感&#xff0c;迎接流线型和直观的体验。 插件安装 在线安装 IntelliJ IDE…

yxBUG记录

1、 原因&#xff1a;前端参数method方法名写错。 2、Field ‘REC_ID‘ doesn‘t have a default value 问题是id的生成问题。 项目的表不是自增。项目有封装好的方法。调用方法即可。 params.put("rec_id",getSequence("表名")) 3、sql语句有问题 检…

【iOS】App仿写--天气预报

文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报&#xff0c;特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页&#xff0c;搜索界面&#xff0c;添加界面&#xff0c;浏…

基金公司最佳实践:如何用价值流分析,洞察研发效能瓶颈?

近日&#xff0c;ONES 受邀参加 QECon 2023 全球软件质量&效能大会&#xff08;北京站&#xff09;。在会上&#xff0c;ONES 高级研发总监&首席解决方案架构师陈亮宇&#xff0c;发表了主题为《聚焦价值流分析&#xff0c;寻找研发效能的「北极星」》的演讲&#xff0…

NSX 4.1中新的网络和高级安全功能介绍

我们很高兴地宣布VMware NSX 4.1全面上市&#xff0c;该版本为私有云、混合云和多云的虚拟化网络和高级安全提供了新功能。该版本的新特性和功能将使VMware NSX客户能够利用增强的网络和高级安全&#xff0c;提高运营效率和灵活性&#xff0c;并简化了故障排除的过程。 领先于…

使用免费MES系统的成功经验

随着科技的发展和数字化时代的到来&#xff0c;越来越多的工厂开始采用生产管理软件来提高生产效率和管理水平。 本文将分享一家工厂在使用免费生产管理软件后的成功经验&#xff0c;希望对广大读者有所帮助。 “之前也是在市面上找了很多厂家咨询报价&#xff0c;少则十几万多…