HPM6750 读取 芯片 OTP 内置 UID UUID MAC地址 USB 地址

根据 OPT 信息配置进行宏定义
image

点击查看代码
// UID
#define OTP_CHIP_UID_IDX_START  (8U)
#define OTP_CHIP_UID_IDX_END    (11U)
// 芯片型号代码 [0:31]
#define OTP_CHIP_ID_IDX_START   (64U)
// ETH0 MAC 地址 [0:47]
#define OTP_CHIP_MAC0_IDX_START (65U)
// ETH1 MAC 地址 [16:63]
#define OTP_CHIP_MAC1_IDX_START (66U)
#define OTP_CHIP_MAC_IDX_END    (67U)
// USB 厂商 ID USB_VID [0:15], USB 设备 ID USB_PID [16:31]
#define OTP_CHIP_USB_IDX_START  (68U)
#define OTP_CHIP_USB_IDX_END    (68U)
// 用户可以自行烧写 OTP Word 69~79,用于存放应用数据
#define OTP_SW_INFO_IDX_START   (72U)
#define OTP_SW_INFO_IDX_END     (79U)
// UUID
#define OTP_CHIP_UUID_IDX_START (88U)
#define OTP_CHIP_UUID_IDX_END   (91U)

参考官网例子实现几个读取函数:

点击查看代码
/**
  * @brief  获取芯片 UUID,128 bit, 
  *         UUID 是MCU唯一身份标识,可以以8bit,16bit,32bit读取
  * @param  void
  * @retval void
  */
void show_uuid(void)
{
    uint32_t uuid_words[4];

    uint32_t word_idx = 0;
    for (uint32_t i = OTP_CHIP_UUID_IDX_START; i <= OTP_CHIP_UUID_IDX_END; i++) 
    {
        uuid_words[word_idx++] = ROM_API_TABLE_ROOT->otp_driver_if->read_from_shadow(i);
    }

    printf(">>MCU UUID:");
    uint8_t *uuid_bytes = (uint8_t *)uuid_words;
    for (uint32_t i = 0; i < sizeof(uuid_words); i++) {
        printf("0x%02X ", uuid_bytes[i]);
    }
    printf("\n");
}

/**
  * @brief  获取芯片 UID,128 bit
  * @param  void
  * @retval void
  */
void show_uid(void)
{
    uint32_t uid_words[4];

    uint32_t word_idx = 0;
    for (uint32_t i = OTP_CHIP_UID_IDX_START; i <= OTP_CHIP_UID_IDX_END; i++) {
        uid_words[word_idx++] = ROM_API_TABLE_ROOT->otp_driver_if->read_from_shadow(i);
    }

    printf("UID:  ");
    uint8_t *uid_bytes = (uint8_t *)uid_words;
    for (uint32_t i = 0; i < sizeof(uid_words); i++) {
        printf("%02x ", uid_bytes[i]);
    }
    printf("\n");
}

/**
  * @brief  获取 mac 地址 96 bit
  *         需要先自行写入
  * @param  void
  * @retval void
  */
void show_eth_mac_address(void)
{
    uint32_t mac_words[3];

    uint32_t word_idx = 0;
    for (uint32_t i = OTP_CHIP_MAC0_IDX_START; i <= OTP_CHIP_MAC_IDX_END; i++) {
        mac_words[word_idx++] = ROM_API_TABLE_ROOT->otp_driver_if->read_from_shadow(i);
    }

    printf("MAC:  ");
    uint8_t *mac_bytes = (uint8_t *)mac_words;
    for (uint32_t i = 0; i < sizeof(mac_words); i++) {
        printf("%02x ", mac_bytes[i]);
    }
    printf("\n");
}

/**
  * @brief  获取 芯片型号代码,32 bit
  * @param  void
  * @retval void
  */
void show_chip_id(void)
{
    uint32_t chip_id_word;
      
    chip_id_word = ROM_API_TABLE_ROOT->otp_driver_if->read_from_shadow(OTP_CHIP_ID_IDX_START);

    printf("CHIP ID:  ");
    uint8_t *chip_id_bytes = (uint8_t *)&chip_id_word;
    for (uint32_t i = 0; i < sizeof(chip_id_word); i++) {
        printf("%02x ", chip_id_bytes[i]);
    }
    printf("\n");
}

测试发现 UUID 可以正常读取,MAC与USB地址读取全是0x00,看来这两个地址需要用户自行提前写入才行。

posted @ 2023-11-15 10:05  求隐  阅读(283)  评论(0)    收藏  举报