STM32利用UID和OTP进行固件加密

本文介绍了如何在STM32G030上利用OTP(一次性可编程)和UID(唯一标识符)进行固件加密。OTP特性确保数据一旦写入无法更改,而UID提供每个芯片的全球唯一编码。通过加密UID并存储在OTP中,可以在设备启动时验证加密值,从而确保设备未被非法解密。

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

资料准备:对应模块的参考手册(RM)
注:本文章基于STM32G030,文中所说的“本芯片”等,都代表STM32G030
在这里插入图片描述

一、OTP介绍

OTP:one-time programmable,只允许一次编程,也就是只能从1写0,不能从0写1。这里可能有人要问,这不是flash的特性么?需要注意的是,flash是允许擦除的,是允许从0写1的。而OTP不允许擦除,就算在ICP烧录代码时,也不会丢。而且,如果只有一位是0,整个双字(64位)都不能再写了,甚至也不能写0x0000 0000 0000 0000。这里的双字节根据不同的单片机有差距,由于我所使用的每次只能写双字节,因此,这里便是双字节。
“The OTP area cannot be read when RDP level is 1 and boot source is not the
Main Flash memory area.”当读保护级别位1时,并且BOOT源不是主程序区域时,OTP是不允许读的。

在不通的系列上,OTP的起始地址有所不同,需要自行去参考手册的flash章节查找,本芯片中OTP起始地址是0x1FFF7000

二、UID介绍

UID是芯片厂商为每个芯片出厂写入的,是一个96位的全球唯一编码。就相当于人类的身份证。HAL库中提供了获取UID的接口

/**
  * @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_
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值