编写 K32L3A MCU 闪存 IFR 字段

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

编写 K32L3A MCU 闪存 IFR 字段

编写 K32L3A MCU 闪存 IFR 字段

                                     编写 K32L3A MCU 闪存 IFR 字段

简介
K32L3A60VPJ1AT MCU 是下一代 Kinetis 双核设备。该设备带来了传统 Kinetis 设备不支持
的处理和多任务处理功能。此外, K32L3A60VPJ1AT 还提供了改进的功耗和安全功能。这
些安全功能的一些重要方面在于非易失性信息寄存器(IFR)存储区域以及该区域的编程方
式。 IFR 存储器区域是与主阵列分离的具有受限访问的储器空间,并且由可擦除 IFR 区域和
不可擦除 IFR 区域组成。不可擦除的 IFR 区域包括程序的一种标识符和版本标识符。可擦
除的 IFR 区域具有闪存安全性,闪存选项,批量擦除启用以及控制设备行为的其他此类功
能。在旧版 Knietis 设备中,主闪存阵列的某些字段(闪存地址 0x400-0x40F)在引导时配
置了 IFR。但是,在 K32L3A60VPJ1AT 中,不再以这种方式控制 IFR 存储区。尝试配置这些
设置时,这会带来挑战。 本文档的目的是解释如何更改这些设置,并提供一些有关如何进
行这些更改的选项。
配置 IFR 字段的第一步是了解如何通过硬件对这些字段进行编程。使用称为“程序索引命令”
的特殊闪存命令对 IFR 字段进行编程。编程后,必须先擦除这些字段,才能重新编程闪存
配置值。擦除这些值的唯一方法是通过批量擦除。这提供了安全性,因为在不删除用户代
码的情况下也无法更改 IFR 值。此外,更改用户代码映像不会影响引导加载程序的操作,
从而确保可以执行安全的引导功能。此处描述了写入可擦除 IFR 值的过程:
1.使用程序索引命令(0x43)写入 FCCOB0。
2.用要编程的索引写入 FCCOB1.可能的索引列在“可擦除 IFR 映射”表中(K32L3A6 参考
手册中的表 16.4.1.2)。
3.将 FCCOB2 和 FCCOB3 写入 0x00,因为此命令不使用它们。
4.用所需的值写入 FCCOB4 - FCCOBB。(请注意, 并非所有索引都使用所有 FCCOB 字
段。请确保查阅 Erasable IFR Map 表,其中 FCCOB 字段用于您正在编程的索引。)
5.将 0x70 写入闪存状态寄存器(FSTAT),以清除上一个闪存命令中可能存在的任何错
误。(请注意,此命令必须是字节写操作。)
6.将 0x80 写入闪存状态寄存器(FSTAT)以启动已编程的闪存命令。
7.轮询 FSTAT 寄存器,直到 CCIF 位字段(位字段 7)为 1(‘1’)为止。(请注意, 用您
的脚本语言可能无法执行此操作,或者仅等待 flash 命令完成执行可能会更容易。在这
些情况下,等待时间比典型的 Program Index 命令完成时间 110us 长的多)
对 IFR 进行编程后,应回读 IFR 以验证其是否正确完成。其过程如下:

1.使用读取索引命令(0x41)写入 FCCOB0.
2.将 FCCOB1 写入要读取的索引。可能的索引列在“可擦写 IFR 映射“表中(K32L3A6 参
考手册中的表 16.4.1.2)。
3.用 0 写入 FCCOB2-FCCOBB。结果将存储在 FCCOB4-FCCOBB 中,因此,应清除这
些内容以确保收到正确的结果。
4.将 0x70 写入闪存状态寄存器(FSTAT),以清除上一个闪存命令中可能存在的任何
错误。注意,该命令必须是字节写入。
5.将 0x80 写入闪存状态寄存器(FSTAT)以启动已编程的闪存命令。
6.轮询 FSTAT 寄存器,直到 CCIF 位字段(位字段 7)为 1(‘1’)为止。(请注意,在您
的脚本语言中可能无法执行此操作,或者只是简单地等待 flash 命令完成执行可能会
更容易。在这些情况下,等待时间要比最长的读取索引命令完成时间 35us 长的多)
使用程序索引命令时,必须知道要修改哪个索引才能创建正确的 Flash 命令。索引列表可
以在 K32L3A60VPJ1AT 参考手册的 Flash 章节的 IFR 描述部分中找到。
有几种不同的选项可用于对 FORT 字段进行编程。这些选项是:
1.使用 Kinetis Flash 工具
2.使用 blhost
3.调试器脚本
4.用户软件中的子例程
选项#1: Kinetis Flash 工具
使用 Kinetis Flash Tool 可能是更改 IFR 值的·最方便的方法。 Kinetis 闪存工具使用 UART 或
USB 协议与 K32L3A6 引导加载程序接口并写入所需的 IFR 字段。 Kinetis Flash 工具的最大优
点之一是,它为用户提供了一个图形界面,可以轻松的对 IFR 字段进行编程。下图是
Kinetis Flash 工具的图片,并突出显示了对 IFR 字段进行编程时要使用的重要输入控件和选
项卡:

nxf51434_0-1628846509415.png

1.此字段是端口集框。他选择与引导加载程序通信时要使用的接口(UART 或 USB)。此
框还允许配置接口。有关默认配置,请查阅 K32L3A6 参考手册。
2.这是“Flash 实用工具”选项卡。选择此选项卡以查看此图像中显示的控件。
3.这是索引输入字段。应在此处输入要编程的 IFR 的索引。
4.这是十六进制数字字段。该值将在“索引”字段中指示的 IFR 索引处进行编程。此处的
值应为十六进制格式,而不能包含前面的“0x”。
5.这是字节计数字段。这告诉实用程序要编程多少个字节,并且必须是该 IFR 索引的值,
请参考参考手册中的“可擦除 IFR 映射表”。
6.这是程序按钮。填写完所有字段后,单击此按钮可以对所需的 IFR 位置进行编程。
选项#2: BLOHOST
MCUBoot 软件包还包括一个命令行可执行文件,可与引导加载程序交互。该工具 blhost 还
可用于对 IFR 字段进行编程。“flash-program-once”命令应用与对所需的 IFR 位置进行编程。
该命令的语法如下:
flash-program-once<index><byteCount><data>
因此,例如, 如果要使用 0xFFFFF3FF 编程 FOPT IFR 字段(记录索引 0x84),则使用此命令
的正确语法应为

flash-program-once 0x84 4 FFFFF3FF
编程后,“一次刷新读取”命令可用于回读并验证已编程的 IFR 字段。以下是使用以前的 IFR
位置的示例
flash-read-once 0x84 4
以下是使用 blhost 擦除设备,对 FOPT IFR 进行编程以及从命令行读回 FOPT IFR 的完整示
例。

nxf51434_1-1628846614026.png


选项#3:调试器脚本
简单的调试器脚本是写入 IFR 值的另一种便捷方式。调试器脚本在调试会话启动过程的后台
执行(因此是用户的隐藏操作),通常可以使用任何文本编辑器轻松地对其进行编辑。但是,
更改值可能更麻烦,因为这通常必须由用户在每次编程时手动完成。考虑到这一点,最好为
不同的配置使用不同的连接脚本
使用调试器脚本的第一步是编写调试器脚本。调试器脚本的功能和语法取决于您的工具链。
就本文档而言,我们将重点介绍 MCUXpresso IDE。 MCUXpresso IDE 使用与调试器无关的
PokeXX 和 PeekXX 命令(其中 XX 是 8、 16 或 32,具体取决于要对所需寄存器进行字节访
问,半字访问,还是字访问)。因此,无论您使用 JLink 或 CMSIS-DAP 进行调试,还是使用
任何其他调试器,在设备上运行的相同命令将继续起作用。下面是一个 MCUXpresso 连接脚
本示例,该脚本写入 FOPT 寄存器,然后将其读回以打印到调试日志。
5140 REM
====================Program
FOPT
===================================
5150 poke32 this 0x40023004 0x43840000
5160 REM Stuff FCCOB registers with desired FOPT value
5170 Poke32 this 0x40023008 v%
5171 Print “New Val “;~s%

5180 Poke32 this 0x4002300c 0x00000000
5180 Poke8 this 0x40023000 0x70
5190 Poke8 this 0x40023000 0x80
5200 wait 1000
6000 REM
================== Read FOPT
=====================================
6001 REM Now read the FOPT back
6010 Poke32 this 0x40023004 0x41840000
6020 Poke32 this 0x40023008 0x00000000
6030 Poke32 this 0x4002300c 0x00000000
6040 Poke8 this 0x40023000 0x70
6050 Poke8 this 0x40023000 0x80
6060 wait 1000
6070 s% = Peek32 this 0x40023008
6080 Print "New FOPT Val ";~s%
请注意,在上面的脚本中, v%是所需的 FOPT 值,并且它已在未显示的脚本部分中定义
(第 164 行)。
162 REM This is the value to be written to the FOPT
164 v% = 0xfffff3ff
编写脚本后,必须告知 MCUXpresso 使用连接脚本。这是在“调试配置”窗口中完成的。假设
已创建调试配置,请单击绿色错误图标旁边的箭头,然后选择“调试配置”。

nxf51434_2-1628846671441.png

 


在出现的对话框中,选择要使用的调试配置,然后选择“Linkserver 调试”选项卡。在“连接脚
本”字段中,将 MCUXpresso 指向连接脚本的位置。

nxf51434_3-1628846689411.png


这就是在 IDE 中需要完成的所有工作。现在,所选的调试配置应使用编写的脚本。
一些调试器将允许脚本的独立命令行运行,例如 JLink 调试器。由于 JLink 是我们遇到的最
受欢迎的外部调试器之一,因此下面提供了使用此脚本进行编程的示例。
//现在对 FOPT 进行编程
w4 0x40023004, 0x43840000 //43 选择程序索引命令。 84 选择 FOPT IFR 字段。
//用我们要写入的 FOPT 值填充 FCCOB 寄存器(4-7)。
//**(启动设置) **
w4 0x40023008, 0xfffff3ff //写入 0xFFFF_1FFF 以从内部 Flash 引导 M4。声明 NMI 引
脚将强制从 ROM 引导。
//用伪值写入 FCCOB 寄存器 8-B。
w4 0x4002300c, 0x00000000
//写入 FSTAT 寄存器以清除可能存在的任何错误。
w1 0x40023000, 0x70
//启动 flash 命令。
w1 0x40023000, 0x80
//等待 flash 命令完成。
Sleep1
//现在读回 FOPT
w4 0x40023004, 0x41840000 //43 选择程序索引命令。 84 选择 FOPT IFR 字段。
//用我们要写入的 FOPT 值填充 FCCOB 寄存器(4-7)。
//**(启动设置) **
w4 0x40023008, 0x00000000 //写入 0xFFFF_F1FF 以从内部 Flash 引导 M0+。声明
NMI 引脚将强制从 ROM 引导。

//用伪值写入 FCCOB 寄存器 8-B。
w4 0x4002300c, 0x00000000
//写入 FSTAT 寄存器以清除可能存在的任何错误。
w1 0x40023000, 0x70
//启动 flash 命令。
w1 0x40023000, 0x80
//等待 flash 命令完成。
Sleep1
//读回内存以验证重置后应该显示的 FOPT 设置。
mem32 40023000, 4
选项#4: 用户软件中的子例程
有时,系统的要求将阻止实施上述任何方法来对 IFR 值进行编程。在这种情况下,您可能需
要实现自己的子例程来对 IFR 进行编程。这样做的过程与调试器脚本方法基本相同,只是用
代码而不是外部脚本编写。要记住的一个关键是您可能需要擦除整个闪存。因此,此子例程
应放在 RAM 内存中。由于正在执行闪存操作,因此将其置于 RAM 中将防止发生某些闪存
错误。
结论
总之, IFR 寄存器是非易失性信息寄存器,用于控制 K32L3A MCU 的某些行为。 IFR 分为可
擦除 IFR 空间和不可擦除 IFR 空间,它们都不是主闪存阵列的一部分。对这些值进行编程需
要使用特殊的闪存命令,并且要求自上次批量擦除以来尚未写入这些值。通常,有四种不同
的编程 FOPT 寄存器设置的方法。四种方法是:
1.Kinetis Flash 工具
2.BLHost 命令行界面
3.调试器脚本
4.用户软件子程序
每种方法都有其优点,因此,您应该选择一种满足您需求并且最方便的方法。但是,无论选
择哪种方法,在写入可擦除 IFR 字段之前都不能对 IFR 值进行编程。在尝试对任何 IFR 字段
进行编辑之前,最好执行批量擦除(可以使用本文档中介绍的任何方法进行擦除)。

Labels (1)
No ratings
Version history
Last update:
‎08-13-2021 02:25 AM
Updated by: