STM32-(15):如何用ID号保护自己的劳动成果

上一篇:STM32-(14):端口复用与重映射下一篇:STM32-(16):Systick 系统时钟

怎样进行版权保护?
1.加密:Flash
2.ID号:每个芯片都有独一无二的ID号,类似于人的身份证号码

一般的盗版的方法:
1、电路板连接进行反向设计(PCB板反向设计),然后能设计出一个一模一样的PCB
2、读取原芯片的程序(获取整个Flash数据),然后把整个数据放到新的芯片中去
当程序代码中加入ID号码的判断,就能起到保护的作用

STM芯片中加入了96位的ID (唯一),这个ID号主要作用有:①序列号 ;②安全性(校验ID号之后才能执行某段程代码);③加密(秘钥)
这个ID号放在 0x1FFFF7E8—0x1FFFF7F4,一共12个字节,96位,我们自由选择用到这96位中的部分或者全部

示例代码

/*Include---------------------------*/
#include"stm32f10x_lib.h"		//包含所有的头文件
#include<stdio.h>

//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART3_Configuration(void);

u8  tab[]="\nHello! everyone,welcome to class!";
/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/ 
int main(void)
{
	#ifdef DEBUG
	debug();
	#endif
	
	u8 i;
	u8 ID_num[12];
	//u16  data;

	//------------初始化------------
	RCC_Configuration();
	GPIO_Configuration();
	USART3_Configuration();

	//printf("\nThe ID: \n");	
	for(i=0;i<12;i++)
	{
		ID_num[i] = *(u8 *)(0x1FFFF7E9+i);
		//printf("%x",ID_num[i]);	
	}

	//ID  是否等于 ffcd213355313235631243ff  如果等于置标志flag=1

	if(flag==1)
	{
		;;;;
	}
	
	//------------向USART3发送数据------------
	while(1) ;	
}

/*******************************************************************************
* Function Name  : Delay_Ms
* Description    : delay 1 ms.
* Input          : dly (ms)
* Output         : None
* Return         : None
*******************************************************************************/
void Delay_MS(u16 dly)
{
	u16 i,j;
	for(i=0;i<dly;i++)
		for(j=1000;j>0;j--);
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
	//----------使用外部RC晶振-----------
	RCC_DeInit();			//初始化为缺省值
	RCC_HSEConfig(RCC_HSE_ON);	//使能外部的高速时钟 
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);	//等待外部高速时钟使能就绪
	
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer
	FLASH_SetLatency(FLASH_Latency_2);		//Flash 2 wait state
	
	RCC_HCLKConfig(RCC_SYSCLK_Div1);		//HCLK = SYSCLK
	RCC_PCLK2Config(RCC_HCLK_Div1);			//PCLK2 =  HCLK
	RCC_PCLK1Config(RCC_HCLK_Div2);			//PCLK1 = HCLK/2
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);	//PLLCLK = 8MHZ * 9 =72MHZ
	RCC_PLLCmd(ENABLE);			//Enable PLLCLK

	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);	//Wait till PLLCLK is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//Select PLL as system clock
	while(RCC_GetSYSCLKSource()!=0x08);		//Wait till PLL is used as system clock source
	
	//---------打开相应外设时钟--------------------
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);	//使能APB2外设的GPIOA的时钟		 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : 初始化GPIO外设
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
	GPIO_InitTypeDef	GPIO_InitStructure;		//声明一个结构体变量

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 	//选择PC.10(TXD) 和 PC.11
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //管脚频率为50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	 //输出模式为复用推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);				 //初始化GPIOC寄存器
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 	//选择PC.10(TXD) 和 PC.11(RXD)
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //管脚频率为50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	 //输出模式为浮空输入
	GPIO_Init(GPIOC,&GPIO_InitStructure);				 //初始化GPIOA寄存器		
	
	//将USART3的TXD和RXD重映射到PC10和pc11
	GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);		
} 

void USART3_Configuration(void)
{
	USART_InitTypeDef  U3;
	U3.USART_BaudRate =9600;
	U3.USART_WordLength = USART_WordLength_8b;
	U3.USART_StopBits = USART_StopBits_1;
	U3.USART_Parity = USART_Parity_No;
	U3.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
	U3.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
	USART_Init(USART3, &U3);

	USART_Cmd(USART3,ENABLE);
}

/*******************************************************************************
* Function Name  : fputc
* Description    : 重定向这个C库(stdio)printf函数  文件流——》串口USART1
* Input          : ch,*f
* Output         : None
* Return         : None
*******************************************************************************/ 
int fputc(int ch,FILE *f)
{
	//ch送给USART1
	USART_SendData(USART3, ch);
	//等待发送完毕
	while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET) ;
	//返回ch
	return(ch);
}

在这里插入图片描述

上一篇:STM32-(14):端口复用与重映射下一篇:STM32-(16):Systick 系统时钟
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值