本文共 1251 字,大约阅读时间需要 4 分钟。
每一个STM32微控制器都自带一个96位的唯一ID,也就是Unique Device ID或称为UID,这个唯一ID在任何情况下都是唯一的且不允许修改。
在开发过程中,可能需要用到这个UID,比如博主最近在研究的UAVCAN中就用到了UID。那么,这96位ID怎么读取呢?可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。这里需要注意的是UID的首地址问题,因为不同型号的STM32芯片的首地址可能不同。在网上搜索后发现,STM32F103系列MCU的UID首地址是0x1ffff7e8,而STM32F207/STM32F40X系列MCU的UID首地址是0x1fff7a10。由于博主用的芯片型号是STM32F407,这里就贴出实测通过的STM32F407的UID读取代码,是以字节为单位读取的。STM32F103系列只需要把首地址修改为0x1ffff7e8即可。下其他系列的芯片的UID首地址,F3系列的UID是0x1ffff7ac,F7系列的UID是0x1ff0f420
#define STM32_UNIQUE_ID_SIZE 12u8 stm32_uniqueId[STM32_UNIQUE_ID_SIZE] = {0}; u8* readStm32UniqueID(void) { vu8* addr = (vu8*)(0x1fff7a10); //UID首地址 for(u8 i = 0; i < STM32_UNIQUE_ID_SIZE; ++i) { u8 id= *addr; stm32_uniqueId[i] = id; ++addr; } return stm32_uniqueId;}
/** * @brief Returns first word of the unique device identifier (UID based on 96 bits) * @retval Device identifier */uint32_t HAL_GetUIDw0(void){ return (READ_REG(*((uint32_t *)UID_BASE)));}/** * This function will get STM32 uid. */void rt_get_cpu_id(rt_uint32_t cpuid[3]){ /* get stm32 uid */ cpuid[0] = HAL_GetUIDw0(); cpuid[1] = HAL_GetUIDw1(); cpuid[2] = HAL_GetUIDw2();}void XXX(void){ uint8_t cpuid[12]={"0000000000"}; rt_get_cpu_id((uint32_t*)cpuid);}
转载地址:http://ccuub.baihongyu.com/