本帖最后由 STM新闻官 于 2025-4-20 01:42 编辑
01背景介绍BlueNRG系列芯片是意法半导体推出的一系列超低功耗的可编程Bluetooth®低功耗无线SoC解决方案。
芯片内嵌了意法半导体先进的2.4 GHz RF射频IP,结合了无与伦比的性能和超长电池寿命。支持点对点连接和Bluetooth™ Mesh网络,允许以可靠的方式建立大规模设备网络。BlueNRG系列芯片还适用于2.4 GHz专有无线通信,支持超低延迟应用。
从BlueNRG LP开始到后续的BlueNRG LPS及目前最新STM32WB09(之前称为BlueNRG-LPF),芯片内置一个1K字节的OTP区域。
地址空间从0x10001800~0x10001BFF。如用户的产品设计中会用到Secure bootloader功能(关于Secure Bootloader功能请参见相关LAT文档或ST提供的关于芯片UART bootloader的官方应用笔记),则Secure bootloader功能会使用到OTP区域。 如用户的产品设计中不会用到Secure bootloader功能则OTP区域可以用来存储客制的固定数据。 这一点也恰恰是很多用户在评估BlueNRG LP/LPS系列方案时提出的问题,本文档的目的就是为说明目前ST提供的如何操作(读写)OTP区域的方式方法,解答此类问题。
02相关资源介绍
2.1. RF-Flasher Utility工具
要对BlueNRG LP/LPS中的OTP区域进行读写,首先需要安装ST提供的上位机软件RF-Flasher Utility工具。该工具主要用于代码烧录,目前从ST官网上可下载的最新版本为4.3.5。请注意: RF-Flash Utility的最初版本是不支持对OTP区域的读写操作的,所以请尽量从官网上下载最新版本。 目前安装完成4.3.5版本后,其安装目录下附带的用户手册(UM2406)中还没有包含对OTP读写功能的相关说明,但实际上对应的功能已经包含了。 RF-Flash Utility工具包含两个部分:
▲图1. RF-Flasher Utility官网截图
2.2. OTP区域介绍
OTP的意思是One Time Programmable,也就是只能写一次,不能像Flash ROM那样擦除后重写。OTP存储区域位于地址空间:0x10001800~0x10001BFF,占1K字节空间。OTP读写操作是按“字”(Word,4字节)为单位进行的。用户将OTP的最后4个字节(起始地址为0x10001BFC)写入非0xFFFFFFFF的任意值后系统复位,可以保护OTP中的内容不会被再次更改(即单BIT从1到0的更改)。
2.3. 芯片内置的Bootloader程序
BlueNRG LP/LPS系列芯片在出厂前都会预烧录一个UART bootloader程序,使用RF-Flasher Utility工具对BlueNRG系列芯片进行的操作都需要UART bootloader程序的配合,对于OTP的读写操作也是同理,所以在用户在进行OTP读写操作前必须保证芯片当前运行在UART bootloader状态。将芯片置于运行UART bootloader状态的方法是,将BlueNRG-LP/LPS的PA10引脚强制拉高后再复位芯片。在ST提供的评估板上,用户按照如下操作方法也可方便地将芯片置于UART bootloader状态: 同时按住PUSH1和RESET按钮 释放RESET按钮 释放PUSH1按钮
确认芯片是否处于UART bootloader运行状态的方法是通过串口给芯片发送单字节数据“0x7F”,如果芯片返回单字节数据“0x79”,则证明芯片已处于UART bootloader运行状态。
03OTP操作命令解析
3.1. 调用RF-Flasher Launcher工具
打开Windows命令行工具窗口,进入到RF-Flasher Utility按照目录下的Application子目录后运行命令“RF-Flasher_Launcher.exe-h”,如下图2中帮助信息会列举出所有支持的命令行工具命令。可以看到版本4.3.5已经支持了“read_OTP”和“Write_OTP”命令。注意这两个命令只支持SWD模式的读写操作。
▲图2. RF-Flasher_Launcher.exe帮助信息 进一步运行“RF-Flasher_Launcher.exe read_OTP-h”或“RF Flasher_Launcher.exe write_OTP-h”可以进一步打印出“read_OTP”和“write_OTP”的参数信息。
3.2. “read_OTP”和“Write_OTP”命令参数说明
-h,--help:打印相关命令的帮助信息。-all,--all:列举出所有连接的设备的ID,包括通过串口连接的设备的串口号或通过SWD口(ST-Link,CMSIS-DAP或JLINK)连接的设备ID号。这些串口号或ID号用于标识对应的设备。-d DEVICE_ID,--device DEVICE_ID:通过串口号或ID号指定要操作的目标芯片。-address OTP_ADDRESS, --address TOP_ADDRESS:设定读写操作的起始地址。-num NUM,--number NUM:指定要读写的字(Word,4字节为单位)的数量,默认值为256,即覆盖整个OTP区域。-frequency/--frequency{5,15,25,50,100,125,240,480,900,1800,4000}:指定SWD口的通讯速率,对于串口连接方式无效。默认值为4000。-s,--show:读操作完成后,打印出OTP区域的内容。-l,--log:是否将打印信息存储到log文件中。-verbose/--verbose{0,1,2,3,4}:打印信息中debug信息级别,只对SWD方式和log有效。-value OTP_VALUE,--value OTP_VALUE:写操作中指定要写入OTP的值。
04实操举例
本实操举例中只使用一块BlueNRG-LP的评估板作为目标板来实现对OTP区域的读写操作。该评估板OTP区域初始内容为全“0xFF”,我们尝试对OTP起始地址0x10001800开始的第一个字进行读写操作。由于BlueNRG-LP评估板上板载有CMSIS DAP调试工具,所以连接方式选用的是SWD口方式。
具体步骤如下:通过Windows命令行工具,调出“RF-Flasher_Launcher.exe”。执行命令“RF-Flasher_Launcher.exe swd”,打印出当前连接的PC端的所有目标板。
如下图3中,只有一个连接的设备,打印出对应CMSIS-DAP调试设备的ID号。
▲图3. 显示连接的设备
第一次执行命令“RF-Flasher_Launcher.exe read_OTP-d 07200001066bff383930545043203530a5a5a5a597969908”,通过参数“-d”指定目标设备,运行“read_OTP”,读取OTP内容。这里未通过参数“-num”指定要读取多少个字,由于默认值为256,所以读取了整个OTP区域的值。从读取结果可以看到地址0x10001800处的当前值为0xFFFFFFFF。
▲图4. 第一次读回OTP初始内容
第一次执行命令“RF-Flasher_Launcher.exe write_OTP-d 07200001066bff383930545043203530a5a5a5a597969908-value 0x11223344-address 0x10001800-l”,命令运行写OTP操作,通过参数“-value”指定要写入的字的值,通过参数“-address”指定要写入的地址。必须通过log信息确认该写操作是否执行成功。
▲图5. Write_OTP操作 第二次执行命令“RF-Flasher_Launcher.exe read_OTP-d 07200001066bff383930545043203530a5a5a5a597969908”,读回OTP内容以确认前一步中数据是否成功写入。如下图6,发现OTP起始地址内容已更改为0x11223344,说明前面的写操作成功。
▲图6. 第二次读取OTP内容 第二次执行命令“RF-Flasher_Launcher.exe write_OTP-d 07200001066bff383930545043203530a5a5a5a597969908-value 0x11225544 -address 0x10001800-l”,对相同地址执行写操作,写入值更改为0x11225544,并确认写成功。 第三次执行命令“RF-Flasher_Launcher.exe read_OTP-d 07200001066bff383930545043203530a5a5a5a597969908”,读回OTP内容。发现OTP其实地址处值为0x11221144,而非第二次要写入的0x11225544。此处操作证明在OTP没有锁定的情况下,后续的写操作还可以继续更改OTP中的内容,但只限于将比特值为“1”的内容改写为比特值为“0”。
▲图7. 第三次读取OTP内容 05小结
当用户需要在其产品设计中使用到BlueNRG LP/LPS等系列芯片内置的OTP来存储其客制数据的时候,可以采用本文档所述方法实现。用户在访问OTP时,必须保证芯片处于UART bootloader模式。▼▼▼
点击按钮下载《如何操作BlueNRG LPLPS芯片内的OTP区域》原文档。点击下载
相关阅读
|