GD32F103VE侵入事件

这篇具有很好参考价值的文章主要介绍了GD32F103VE侵入事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)
	{
	}
}

GD32F103VE侵入事件,产品研发,单片机,嵌入式硬件,GD32

 文章来源地址https://www.toymoban.com/news/detail-623697.html

到了这里,关于GD32F103VE侵入事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32F103VET输出PWM波形

    GD32F103VET将TIMER0_CH3映射到PE14引脚,使其输出PWM波形。测试时,使用示波器看PE14引脚输出的波形,效果更直观。 TIMER0之PWM输出引脚映射如下: TIMER0_REMAP[1:0]=\\\"00\\\"(没有映射): TIMER0_CH0默认被映射到PA8引脚 TIMER0_CH1默认被映射到PA9引脚 TIMER0_CH2默认被映射到PA10引脚 TIMER0_CH3默认被映射

    2024年02月14日
    浏览(15)
  • 基于gd32f103移植freemodbus master 主栈

    1.移植freemodbus master需要先移植RT-Thread操作系统 GD32F103C8T6移植 RTT Nano 教程-CSDN博客 2.移植freemodbus master协议栈 在移植了RTT以后,我们需要移植就只有串口相关的函数 移植freemodbus master协议栈具体步骤 下载移植freemodbus master协议栈 源码 添加协议栈文件 向mdk添加头文件路径 修改

    2024年01月18日
    浏览(18)
  • GD32F103串口DMA收发(空闲中断 + DMA)

    GD32F103串口DMA收发(空闲中断 + DMA) 代码如下:

    2024年02月12日
    浏览(17)
  • GD32F103硬件I2C0通讯

    GD32F103的I2C模块有I2C0和I2C1;本程序使用I2C0功能模块; I2C0引脚复用和重映射: 当I2C0_REMAP=0时,I2C0引脚复用功能,I2C0_SCL映射到PB6引脚,I2C0_SDA映射到PB7引脚; 当I2C0_REMAP=1时,I2C0引脚重映射,I2C0_SCL映射到PB8引脚,I2C0_SDA映射到PB9引脚; I2C1引脚只有复用引脚: I2C1_SCL映射到PB10引脚,I2C1_SDA映射到

    2024年02月13日
    浏览(25)
  • gd32f103vbt6 串口OTA升级5-combin部分

    本文主要是bin文件的组成进行一些简单介绍,方便理解升级的过程。 2.1 rk3399cpu+gd32f103 2.2 连接方式:串口(115200,8N1)或者iic(本文没有介绍iic) 3.1 单片机端分两个部分:iap(用于升级)和app(自己的应用)部分(这两个部分本文不做介绍)。 3.2 linux端做一个升级的app软件

    2024年02月16日
    浏览(14)
  • gd32f103vbt6 串口OTA升级3-linux端的部分

    本文主要是对linux端升级单片机程序的功能部分做一些介绍,包括一些软件流程。 2.1 rk3399cpu+gd32f103 2.2 连接方式:串口(115200,8N1)或者iic(本文没有介绍iic) 3.4.1  0 ~(0x5c00-1) : iap程序区,用于存放iap程序 3.4.2  0x5c00~(0x6000-1) : 这个1k用于存放一些标志位,以及程序的

    2024年02月17日
    浏览(19)
  • stm32f103单片机—编码器测速

    stm32f103ZET6开发板(非指定) MG513P3012V型号电机(带霍尔编码器)(非指定) 此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8, 定时器使用通道1、2来实现编码器功能 ,接线时注意把A/B相接到定时器通道1/2的引脚。 电

    2024年02月06日
    浏览(42)
  • 关于两个STM32F103系列单片机的蓝牙通信

       毕设做的是掌控小车,因此采用蓝牙通信作为小车和手部通信,前段时间做出实物,对其遇到的问题以及解决的方法做一些总结。一个主控芯片采用STM32F103ZET6,另一个主控芯片采用STM32F103C8T6,原因是本来准备了两个主控C8T6,不小心烧了一个。 1.两个蓝牙的配对  需要准

    2024年02月13日
    浏览(21)
  • STM32F103ZE单片机呼吸灯源代码

    本实验采用的系统频率SYSTIM为8MHZ,如果频率改变需要修改一个数值

    2024年02月09日
    浏览(24)
  • JDY-31蓝牙模块远程控制STM32F103单片机

       手机app通过蓝牙模块发送指令实时控制单片机的外设功能,比如发送衣柜开关门指令(舵机旋转),衣架上升降落(步进电机正转反转),远程开启去污除湿功能(继电器控制打开关闭小风扇+加热片)。 本次例子:手机APP连接蓝牙模块远程控制SG90舵机正转(0-180°)和反

    2024年02月01日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包