130 lines
1.9 KiB
C
130 lines
1.9 KiB
C
|
||
#include "cpuid.h"
|
||
#include "crc32.h"
|
||
|
||
#define CPUID_BEG UID_BASE
|
||
|
||
#define ID_SEQUE (4671014970607679160ull) // 0x40D2C75E1F9A36B8
|
||
|
||
#define STM32_CPUID_LEN 12 // stm32 cpuid 长度
|
||
|
||
// 得到 CPU ID,共16字节
|
||
u32 g_cpuIDBeg = CPUID_BEG;
|
||
|
||
void InitCpuIDBase(u32 base)
|
||
{
|
||
g_cpuIDBeg = base;
|
||
}
|
||
|
||
void GetCpuID(CpuId * pId)
|
||
{
|
||
int i;
|
||
u8 * pBuf;
|
||
u8 dat;
|
||
u32 addr = (g_cpuIDBeg) / 7;
|
||
|
||
if (pId != NULL)
|
||
{
|
||
addr *= 7;
|
||
addr += (g_cpuIDBeg) % 7;
|
||
pBuf = (u8*)(addr);
|
||
for (i = 0; i < STM32_CPUID_LEN; i++)
|
||
{
|
||
dat = *pBuf;
|
||
pId->buff[i] = dat;
|
||
pBuf++;
|
||
}
|
||
|
||
// 增加校验作为id延长码
|
||
pId->dword.dword4 = CalcCrc32(pId->buff, STM32_CPUID_LEN);
|
||
|
||
#if (0) // 输出信息
|
||
printf("\r\nread cpuid: ");
|
||
for (i = 0; i < CPUID_LEN; i++)
|
||
{
|
||
printf("%02x ", pId->buff[i]);
|
||
}
|
||
printf("\r\n");
|
||
#endif
|
||
|
||
#if (1) // 信息加密
|
||
{
|
||
#define XMOVE_NUM 1 // 移位次数(1--7),改变后加密信息发生变化
|
||
// 取反,错序,移位
|
||
uint64_t seque = ID_SEQUE; // 错序表
|
||
u8 idx, temp, first;
|
||
CpuId tmpbuf;
|
||
|
||
memcpy(tmpbuf.buff, pId->buff, CPUID_LEN);
|
||
|
||
// 取反 错序
|
||
for (i = 0; i < CPUID_LEN; i++)
|
||
{
|
||
dat = tmpbuf.buff[i];
|
||
idx = (seque & 0x0F);
|
||
seque >>= 4;
|
||
pId->buff[idx] = ~dat;
|
||
}
|
||
|
||
// 移位
|
||
for (idx = 0; idx < XMOVE_NUM; idx++)
|
||
{
|
||
first = pId->buff[0];
|
||
for (i = 1; i <= CPUID_LEN; i++)
|
||
{
|
||
dat = pId->buff[i-1];
|
||
dat >>= 1;
|
||
if (i == CPUID_LEN)
|
||
{
|
||
temp = first;
|
||
}
|
||
else
|
||
{
|
||
temp = pId->buff[i];
|
||
}
|
||
temp <<= 7;
|
||
dat |= temp;
|
||
pId->buff[i-1] = dat;
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|
||
//----------------------------------
|
||
|
||
static int g_cricount = 0;
|
||
|
||
void EnterCritical(void)
|
||
{
|
||
if (g_cricount == 0)
|
||
{
|
||
__disable_irq();
|
||
}
|
||
g_cricount++;
|
||
}
|
||
|
||
void ExitCritical(void)
|
||
{
|
||
if (g_cricount != 0)
|
||
{
|
||
g_cricount--;
|
||
}
|
||
|
||
if (g_cricount == 0)
|
||
{
|
||
__enable_irq();
|
||
}
|
||
}
|
||
|
||
// STM32软件复位
|
||
void RestartMcu(void)
|
||
{
|
||
printf("restart the mcu...\r\n");
|
||
|
||
__disable_irq();
|
||
|
||
NVIC_SystemReset(); // 系统复位
|
||
}
|