STM32利用UID对FLASH区域程序进行简单的加密校验

发布于 2020-09-10  578 次阅读


#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;
}

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。