参考链接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);