stm32参考手册中指出,在地址为0x1FFFF7E8处,有一个唯一的身份标识寄存器。
可以直接访问该值。
printf( "\r\nChip ID: %x, %x, %x\r\n", *(vu32*)(0x1ffff7e8), *(vu32*)(0x1ffff7e8+4), *(vu32*)(0x1ffff7e8+8));
Chip ID: 5d8ff39, 36364e4e, 43137403
虽然这个96bit的ID是唯一的,但是MAC地址却只有48bit,因为量产有不同批次,而且采购的很随机的话这个ID号也是不唯一的,比较靠谱一点的还是自己在指定FLASH位置定义一个变量,这样程序就写死去读这个地方的值,而这个地方的值我们再用别的方式去修改,如自己写个上位机用串口通信设置等。
uint32_t chipID __attribute__((at(0X800F000)))= 0x12345678;
printf( "\r\nChip ID: %x\r\n", *(vu32*)(0X800F000));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F000));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F001));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F002));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F003));
这里使用了正点原子的脱机下载器,注释掉该定义变量,并在该处设置滚码。
开始烧录
串口显示如下:
Chip ID: 55550002
Chip ID: 2
Chip ID: 0
Chip ID: 55
Chip ID: 55
对应代码如下:
printf( "\r\nChip ID: %x\r\n", *(vu32*)(0X800F000));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F000));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F001));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F002));
printf( "\r\nChip ID: %x\r\n", *(vu8*)(0X800F003));
MAC地址的前12bit固定,后面的便可以直接如此自定义设置。