#define CAL_FLASH_XOR_ADDR 0x0803d800
rt_uint32_t flash_serial_cal(rt_uint32_t *serial)
{
return serial[0] ^ serial[1] ^ serial[2];
}
int flash_serial_read(rt_uint32_t addr,rt_uint32_t *serial)
{
serial[0] = *((rt_uint32_t *)addr+0);
serial[1] = *((rt_uint32_t *)addr+1);
serial[2] = *((rt_uint32_t *)addr+2);
return 0;
}
int flash_uid_read(void)
{
rt_uint32_t uid_serial[3]={0x0};
rt_uint32_t crc_serial[3]={0x0};
flash_serial_read(UID_BASE,uid_serial);
flash_serial_read(CAL_FLASH_XOR_ADDR,crc_serial);
crc_serial[2] = flash_serial_cal(uid_serial);
rt_kprintf("cal:%x,%x\n",crc_serial[0],crc_serial[2]);
if(crc_serial[0]==0xffffffff)
{
stm32_flash_erase(CAL_FLASH_XOR_ADDR, sizeof(rt_uint32_t));
stm32_flash_write(CAL_FLASH_XOR_ADDR, (rt_uint8_t*) &crc_serial[2], sizeof(rt_uint32_t));
}
else {
if(crc_serial[0] != crc_serial[2])
{
while(1)
{
rt_thread_mdelay(5000);
rt_kprintf("cal error\n");
}
}
}
return 0;
}
STM32利用UID对FLASH区域程序进行简单的加密校验
发布于 2020-09-10 579 次阅读

Comments | NOTHING