您现在的位置是:首页 >技术交流 >GD32F4x 加密(开启读保护功能)网站首页技术交流

GD32F4x 加密(开启读保护功能)

兵贵~ 2024-06-18 18:01:02
简介GD32F4x 加密(开启读保护功能)

参考链接1:(设置读保护)

GD32F4x 如何开启读保护功能(芯片加密)?_EmbeddedOsprey的博客-CSDN博客

参考链接2:读取芯片ID进行加密

《嵌入式 – GD32开发实战指南》第19章 程序加密_gd32大小端_Bruceoxl的博客-CSDN博客

对GD32F405,其地址为:

16 5B 4A 31 30 36 37 07 54 34 4E 32 

GD32保护参考程序

unsigned char	Sys_ID[12];
unsigned char q;


	for(q=0;q<12;q++)
    {       
		Sys_ID[q]=*(uint8_t*)(0x1FFF7A10+q);
        //printf(" %0.2X",Sys_ID[i]);
		
		/*保留下面两行,通过串口3读取ID,并修改完下面12个字节数据后,屏蔽下面两行*/
		#if CHIP_ID
		USART_SendData(USART3,Sys_ID[q]);                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 
		#endif
    }
    //ID 16 5B 4A 31 30 36 37 07 54 34 4E 32 
    if(Sys_ID[0]==0x16 && Sys_ID[1]==0x5B && Sys_ID[2]==0x4A &&
     Sys_ID[3]==0x31 && Sys_ID[4]==0x30 && Sys_ID[5]==0x36 &&
     Sys_ID[6]==0x37 && Sys_ID[7]==0x07 && Sys_ID[8]==0x54 &&
     Sys_ID[9]==0x34 && Sys_ID[10]==0x4E && Sys_ID[11]==0x32)
    {
		/*测试好后,屏蔽下面8行程序*/
		#if CHIP_ID
		USART_SendData(USART3,'p');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		USART_SendData(USART3,'a');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		USART_SendData(USART3,'s');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		USART_SendData(USART3,'s');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		#else		
		;
		#endif
    }
    else
    {
		/*测试好后,屏蔽下面8行程序*/
		#if CHIP_ID
		USART_SendData(USART3,'f');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		USART_SendData(USART3,'a');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		USART_SendData(USART3,'l');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		USART_SendData(USART3,'s');                       //向串口3发送数据
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);  //等待发送结束 ;
		#else
		
		while(1);
		
		#endif
    }

参考链接3:

1:GD32F103 、GD32F303 与 STM32F103 基本上兼容的,甚至可以直接使用ST 的库操作,所以替换起来还是相当方便的。

2. 首先看看 GD32F1的或者说 STM32F1的:

//开启读保护

if(FLASH_GetReadOutProtectionStatus() != SET)
{
  FLASH_Unlock();
  FLASH_ReadOutProtection(ENABLE);
  FLASH_Lock();
}


//关闭读保护

if(FLASH_GetReadOutProtectionStatus() != RESET)
{
  FLASH_Unlock();
  FLASH_ReadOutProtection(DISABLE);
  FLASH_Lock();
}

事实上,读保护一旦开启,如果解除读保护,同时也会由硬件自动清除掉代码,所以如果你通过调试器取消读保护时,会自动清除代码,防止被它人读取数据。

而一旦开启了读保护,你是无法通过调试器读取 FLASH 的,你读取的数据全是 0xff ,同时也无法通过调试器在线调试,所以,正在开发的产品一般不会加入这个功能,只有量产时才会加入,否则出现问题难定位。

如果需要重新下载,可以使用 KEIL 软件的这个擦除按钮:

3. F4的读保护

if(ob_spc_get() != SET)
{
  ob_unlock();
  ob_security_protection_config(FMC_LSPC);
  ob_start();  // 特别注意这条语句
  ob_lock();
}

4. 另外,产品一般会禁用 SW 引脚的调试功能,F1 和 F4 的方式不一样:

F1 的由专门语句负责:

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,DISABLE);

5. 而F4 就是把 PA13、P14 重新配置即可(即不使用默认功能,可设置为下拉输入):

rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN,  GPIO_PIN_13 | GPIO_PIN_14);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14);


 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。