以下介绍一种不增加成本,在软件方面下功夫,适用于防止其他人去读取代码,以下为具体代码:
#define GD32_ID_D 352520 // 任意的一个数 volatile u32 GD32_ID_addr[3]={0x1ffff7e8 - GD32_ID_D,0x1ffff7ec + GD32_ID_D,0x1ffff7f0 - GD32_ID_D}; /******************************************************************** 函数功能:读出ID 入口参数:para 返 回: 备 注: ********************************************************************/ volatile void GD32_Read_ID(volatile u32 *para) { volatile u32 Addr; //防止代码反汇编,所以此地址需要重新计算出来
Addr = GD32_ID_addr[0] + GD32_ID_D; para[0] = (vu32)(Addr); Addr = GD32_ID_addr[1] - GD32_ID_D; para[1] = (vu32)(Addr); Addr = GD32_ID_addr[2] + GD32_ID_D; para[2] = (vu32)(Addr); } /******************************************************************** 函数功能:加密ID并保存 加密和解密算法要一样 入口参数: 返 回: 备 注: ********************************************************************/ void GD32_Encrypted_ID(void) { u32 GD32ID[4],dat; GD32_Read_ID(GD32ID);
GD32ID[3] = GD32_ID_D; dat = GD32ID[0] + GD32ID[1] - (GD32ID[2]/GD32ID[3]);
FLASH_Unlock(); FLASH_ErasePage (GD32FLASH_EN_ID_START_ADDR); // FLASH_ProgramWord(GD32FLASH_EN_ID_START_ADDR,dat); // 保存这个数,写进32位 FLASH_Lock(); }
/******************************************************************** 函数功能:比较加密ID,正确返回0 入口参数: 返 回:1:错误,0:正确 备 注: ********************************************************************/ u32 GD32_COMPARE_KEY_ID(void) { u32 GD32ID[4],dat,dat2; STM32_Read_ID(GD32ID);
GD32ID[3] = GD32_ID_D; dat = GD32ID[0] + GD32ID[1] - (GD32ID[2]/GD32ID[3]);
dat2 = (u32)(GD32FLASH_EN_ID_START_ADDR);
if(dat == dat2){return 0;} else {return 1;} }
//=代码加密================// if(GD32_COMPARE_KEY_ID()) { //代码出厂设置对代码加密 if(初始化) { STM32_Encrypted_ID(); // 加密ID }
//=正常运行时=============//
//平时代码重上电进行ID校验,可设置校验不正确后让设备的部分功能不正常 if(GD32_COMPARE_KEY_ID()) {
}else{ //校验正确
}
以上代码可以参照设计成两个bin,第一个bin用于加密文件,第二个用于解密,即第二个下载后可以将第一个覆盖,以上仅供参考;
|