ESP32 | STM32获取芯片MCU唯一标识符、MAC

文章介绍了STM32和ESP32芯片如何获取和使用设备的唯一标识符,包括STM32的96位唯一ID及其用途,以及ESP32的MAC地址作为唯一标识。还提到ESP32的MAC地址可通过API获取和定制。

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

        与服务器通信时,需要进行设备绑定,采取了唯一标识的方式绑定,有获取设备MCU唯一标识符的需求,文中说明了STM32、ESP32系列芯片获取唯一标识符、MAC的方法。

STM32

        在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面:

        1、用作序列号(例如 USB 字符串序列号或其它终端应用程序)

        2、在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性

        3、激活安全自举过程等

        96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。

        用户在何种情况下,都不能修改这个身份标识。这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。

        唯一ID是一个96位的信息串,所以按字读取就是3个字,按半字读取就是6个,按字节读取就是12个。本质上没有区别,在这里我们按字读取。

STM32F10xxx中文参考手册说明:器件电子签名

获取96位的唯一身份标识寄存器数据时,其基地址为:0x1FFF F7E8

基地址偏移0x02: 0x1FFF F7E8 + 0x02 = 0x1FFF F7EA

基地址偏移0x04: 0x1FFF F7E8 + 0x04 = 0x1FFF F7EC

基地址偏移0x08: 0x1FFF F7E8 + 0x08 = 0x1FFF F7F0

//判断处理器是大端还是小端
    union{
    char ch[4];
     
    int num;
    }haha;
haha.num =0x12345678;
for(int i=0;i<4;i++)
{
    printf("%x\t", haha.ch[i]);
}
//STM32F103单片机上输出结果为
78    56    34    12
说明STM32F103为小端序处理器
小端模式:低地址存放低有效位

//读取芯片ID
void GetChipID ( uint32_t *id )
{
   //小端模式
    id[0] = * ( vu32 * ) ( 0x1ffff7e8 ); //高32位地址
    id[1] = * ( vu32 * ) ( 0x1ffff7ec ); //中32位地址
    id[2] = * ( vu32 * ) ( 0x1ffff7f0 ); //低32位地址
    printf ( "此芯片唯一ID为:0x%X-%X-%X \r\n", id[0], id[1], id[2] );
}
//获取芯片Flash大小
void GetFlashSize ( void )
{
    u16 stm32_Flash_Size;
    stm32_Flash_Size = * ( u16 * ) ( 0x1FFFF7E0 ); //闪存容量寄存器
    printf ( "芯片闪存容量大小为:%x \r\n", stm32_Flash_Size );
}

//读取芯片型号
void Main_Chip_Type(void)
{
    u32 type;
    type = *( unsigned  int * )( 0xE0042000 );    //MCU ID
    printf ( "芯片型号为:0x%x \r\n", type );
}

ESP32

物理地址是一种标识符,用来标记网络中的每个设备。同现实生活中收发快递一样,网络内传输的所有数据包都会包含发送方和接收方的物理地址。

由于网络设备对物理地址的处理能力有限,物理地址只在当前局域网内有效。所以,接收方的物理地址都必须存在于当前局域网内,否则会导致发送失败。

MAC地址的英语是 Media Access Control Address,直译为媒体存取控制位址,也称为局域网地址(LAN Address)、以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。

由于数据包中都会包含发送方和接收方的物理地址,数据包从起始地发送到目的地,为了能够正确地将数据包发送出去,就必须要求 MAC 地址具有唯一性。因此 MAC 地址都是由生产厂家在生产时固化在网络硬件中,是硬件预留的地址。

硬件的 MAC 地址是厂家按照一定的规则,进行设置所产生的,因此,MAC 地址拥有自己的格式。

MAC 地址采用十六进制数表示,共 6 个字节(48 位),长度为 48 bit(字节)。整个地址可以分为前 24 位和后 24 位,代表不同的含义。

  • 前 24 位称为组织唯一标识符(Organizationally Unique Identifier,OUI),是由 IEEE 的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
  • 后 24 位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中 MAC 地址后 24 位是不同的。

查询MAC厂商:在浏览器中输入网址 MAC地址查询 - 根据网卡MAC地址查询厂商信息 - MAC地址查厂商,如图所示。

ESP32 芯片未烧录唯一 chip_id,但设备默认烧录有全球唯一 MAC 地址,可以读取 MAC 地址替代 chip_id。

ESP32 默认的 MAC 是在 efuse 里,没法改。可以改是 IDF 支持使用用户自定义 MAC,但 efuse 里的 MAC 是物理级存在。可以用以下接口获取此 MAC:

esp_err_t esp_efuse_mac_get_default(uint8_t *mac);         //esp_efuse_mac_get_default to get the factory-programmed MAC, which is unique.
esp_err_t esp_efuse_mac_get_custom(uint8_t *mac);          //esp_efuse_mac_get_custom returns the custom MAC address, if it was programmed in BLK3 eFuse. 
esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type); //esp_read_mac is used to generate MAC addresses for each network interface.

MAC地址,一共48 bit,即6个字节。

常用的表示方法:

  • xx:xx:xx:xx:xx:xx 10:7B:44:80:F4:6A
  • xx-xx-xx-xx-xx-xx 10-7B-44-80-F4-6A
  • xxxx.xxxx.xxxx 107B.4480.F46A
//获取全球唯一的MAC地址     MAC地址,一共48 bit,即6个字节。
esp_efuse_mac_get_default(mac);
printf("mac:%s\n",mac); //mac:�Tubfp  
for(int i=0;i<strlen((char *)mac);i++)
    printf("%2X",mac[i]);//DC5475626670    ---》DC-54-75-62-66-70
printf("\n");
ESP32STM32可以通过串口通信进行数据交换。以下是基本的步骤: 1. 首先,需要确定两个MCU之间的串口通信参数,例如波特率、数据位、停止位、奇偶校验等。确保两个MCU使用相同的参数。 2. 在ESP32STM32中,需要使用相应的库来进行串口通信。在ESP32中,可以使用Arduino IDE和Serial库来进行串口通信。在STM32中,可以使用HAL库或者标准库来进行串口通信。 3. 在ESP32中,可以使用Serial.begin()函数来初始化串口。例如,Serial.begin(9600)将初始化波特率为9600的串口。 4. 在STM32中,需要使用HAL_UART_Init()函数来初始化串口。例如,HAL_UART_Init(&huart1)将初始化UART1串口。 5. 在ESP32STM32中,可以使用Serial.print()和Serial.read()函数来进行数据的发送和接收。例如,Serial.print("Hello World!")将发送字符串"Hello World!",Serial.read()将读取一个字节的数据并返回。 6. 在STM32中,可以使用HAL_UART_Transmit()和HAL_UART_Receive()函数来进行数据的发送和接收。例如,HAL_UART_Transmit(&huart1, (uint8_t*)"Hello World!", 12, 1000)将发送字符串"Hello World!",HAL_UART_Receive(&huart1, &data, 1, 1000)将读取一个字节的数据并存储在变量data中。 需要注意的是,在进行串口通信时,需要确保两个MCU的电平标准相同。例如,ESP32STM32都使用TTL电平标准,则需要将它们之间的串口连接线连接到相同的TTL电平引脚。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值