HAL读取STM32 96位全球唯一ID(UID)

本文介绍了STM32微控制器中唯一设备标识符(UID)的读取方法,包括使用HAL库函数HAL_GetUID读取UID及直接通过UID_BASE地址读取的方式,并提供了STM32F103C8T6的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Reference: Device ID in STM32 microcontrollers

HAL

以SMT32F103C8T6为例, stm32f1xx_hal.c中给出了一个读取ID的函数:

/**
  * @brief Return the unique device identifier (UID based on 96 bits)
  * @param UID: pointer to 3 words array.
  * @retval Device identifier
  */
void HAL_GetUID(uint32_t *UID)
{
  UID[0] = (uint32_t)(READ_REG(*((uint32_t *)UID_BASE)));
  UID[1] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 4U))));
  UID[2] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 8U))));
}

UID地址

UID_BASE的定义在stm32f103xb.h:

#define UID_BASE              0x1FFFF7E8U    /*!< Unique device ID register base address */

这个基地址不同系列的STM32是不同的:

Device lineStarting address
F0, F30x1FFFF7AC
F10x1FFFF7E8
F2, F40x1FFF7A10
F70x1FF0F420
L00x1FF80050
L0, L1 Cat.1,Cat.20x1FF80050
L1 Cat.3,Cat.4,Cat.5,Cat.60x1FF800D0

可以直接从地址读:

unsigned long *id = (unsigned long *)0x1FFFF7E8;
id[0]
id[1]
id[2]

HAL和直接取UID地址的值结果比较

结果是一样的:

    uint32_t uid[3];
    HAL_GetUID(uid);
    //printf("0x");
    for(int8_t i = 0; i < 3; i++) {
        printf("%x \r\n", uid[i]);
    }   
    printf("\r\n---------------\r\n");  

    uint32_t *id = (uint32_t *)0x1FFFF7E8;
    for(int8_t i = 0; i < 3; i++) {
        printf("%x \r\n", id[i]);
    }   
    printf("\r\n"); 

output:

66dff57 
57528448 
87231810 

---------------
66dff57 
57528448 
87231810 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值