飞思卡尔 Kinetis KE - 写入闪存

电器工程 编程 闪光 工具 j-链接 动能
2022-02-03 16:11:11

多年来,我一直在使用各种微控制器和微处理器,但我似乎被 Kinetis KE 系列(特别是 S9KEAZN64AMLC)所阻碍。

2015 年 1 月 17 日 TL;DR:

飞思卡尔确认其 Kinetis Design Studio 软件 v2.0.0 不适用于此设备(包括他们自己的 TRK-KEA64 评估板)。他们建议暂时使用 CodeWarrior MCU V10.6。

Segger 发布了 v4.96a(“a”很重要,我使用的是 v4.96),它纠正了问题并允许您使用带有 KDS 的 Segger J-Link Lite CortexM 调试器板并具有完整的编程/调试功能。

在 Segger 发布 v4.96a 之前,我设法通过重新烧写 USBDM 随附的 OpenSDA 固件(使用 v4.10.6.240)在飞思卡尔的廉价(15 美元)FRDM-KL25Z 评估板上重新编程 OpenSDA 调试器来烧写芯片。然后我使用了 USBDM 的独立“ARM Programmer”软件。我没有花太多时间尝试让调试工作,因为我在“老派”调试方面足够精通,不需要它。请确保将“良性”程序烧写到板载目标 KL25 中,否则它可能会干扰编程,因为板载目标 KL25 的复位线仍然连接到 OpenSDA 调试器,即使 J11 被切断(参见 Keith Wakeham 的博客文章,链接如下)。

非常感谢Erich Styger非常非常亲切地帮助我确定问题并通过电子邮件确认我的发现。

现在回到我们定期安排的问题:

我已经建立了一个简单的 3.3V 分线板。它在 PTA 上有一些 LED,在 PTC 上有一个 UART 连接,SWD 线在它们的专用线上。这块板实际上没有什么花哨或有趣的地方。

我正在使用适用于 Cortex-M 的 J-Link Lite(J-Link LITE CortexM-9,请参阅https://www.segger.com/jlink-lite-cortexm.html),并且在 OSX 和 Windows 下我都得到了结果相同:J-Link Commander 实用程序可以识别芯片,我可以读取和写入 SRAM,并通过手动读取和写入正确的内存映射 I/O 地址来使用外围设备。但是,当我尝试刷新设备时,它失败了。

$ JLinkExe
SEGGER J-Link Commander V4.94c ('?' for help)
Compiled Oct 31 2014 20:08:55
DLL version V4.94c, compiled Oct 31 2014 20:08:48
Firmware: J-Link Lite-Cortex-M V8 compiled Jul 17 2014 11:40:12
Hardware: V8.00
S/N: 518107921
Feature(s): GDB
VTarget = 3.332V
Info: Could not measure total IR len. TDO is constant high.
Info: Could not measure total IR len. TDO is constant high.
No devices found on JTAG chain. Trying to find device on SWD.
Info: Found SWD-DP with ID 0x0BC11477
Info: Found Cortex-M0 r0p0, Little endian.
Info: FPUnit: 2 code (BP) slots and 0 literal slots
Cortex-M0 identified.
Target interface speed: 100 kHz

J-Link>device skeazn64xxx2
Info: Device "SKEAZN64XXX2" selected (64 KB flash, 4 KB RAM).
Reconnecting to target...
Info: Found SWD-DP with ID 0x0BC11477
Info: Found SWD-DP with ID 0x0BC11477
Info: Found Cortex-M0 r0p0, Little endian.
Info: FPUnit: 2 code (BP) slots and 0 literal slots

J-Link>r
Reset delay: 0 ms
Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit.

J-Link>erase
Erasing device (SKEAZN64xxx2)...

(...several second pause while it communicates with the MCU...)



****** Error: PC of target system has unexpected value after erasing sector. (PC = 0xFFFFFFFE)!
---------------------------------------------------------------------- Registers -------------------------------------------------------------------------------------
    PC   = FFFFFFFE
Current: R0   = 00F3E3BE, R1   = 00000001, R2   = 4004801C, R3   = 00000001
    R4   = 00000000, R5   = 00000000, R6   = 000000F4, R7   = 1FFFFD61
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Info: J-Link: Flash download: Total time needed: 2.174s (Prepare: 0.894s, Compare: 0.000s, Erase: 0.736s, Program: 0.000s, Verify: 0.000s, Restore: 0.542s)
ERROR: Erase returned with error code -5.

J-Link Lite 非常好(我可以用它读取和写入另一个 Cortex-M0 处理器的 nRF58122 SoC)并且该设备似乎可以正常工作。我知道 Kinetis 已解锁,因为它们是 DigiKey 的工厂新鲜库存,但即便如此,JLinkExe 中的“kinetis unlock”命令也会超时,没有任何错误或有用信息。

在这个时间点上,我确定我正在做一些愚蠢的事情,但我对它可能是什么感到茫然。

以前有人用过这些设备吗?你是如何对它们进行编程的?

编辑以添加演练:

更多信息:

我读到 NMI# 引脚在复位后被启用(并通过读取 SIM_SOPT 验证了这一点),而且在启用时它具有内部上拉电阻。在这个特定的部分,PTB4 位于引脚 10 上,这在我的设计中是无连接的。禁用 NMI 引脚没有任何区别。RST# 类似;它连接到一个将引脚接地的按钮,也连接到 J-Link Lite,但没有外部上拉。这应该无关紧要,因为与 NMI# 一样,RST# 引脚有一个内部上拉电阻,当 PTA5 配置为复位时启用该上拉电阻。

现在查看时钟...在复位后,ICS 是 FLL 的时钟源,ICS_C2 中的 BDIV 设置为 001(复位默认值)。如果我理解正确,这意味着 32kHz 内部振荡器由 FLL 乘以 1024,然后除以 2,使得 ICSOUTCLK 为 32kHz * 1024 / 2 或 16.8MHz。我可以通过 J-Link CLI 通过读取 ICS_S 来验证 FLL 是否已锁定:

J-Link>mem8 40064004 1
40064004 = 50

(LOCK 和 IREFST 已设置,这是正确的。)

然后我继续通过读取 SIM_SCGC 来验证 SIM 是否为闪存控制器启用了时钟。我还可以快速检查以确保 SIM_BUSDIV 中的 BUSDIV 设置为零,这意味着 BUSCLK 与 ICSOUTCLK 频率相同(即它没有被分频):

J-Link>mem32 4004800c 1
4004800C = 00003000
J-Link>mem32 40048018 1
40048018 = 00000000

到目前为止,一切看起来都很好。BUSCLK 为 16.8MHz,flash 控制器时钟没有门控。

现在让我们继续讨论闪存控制器。复位后 FCLKDIV 为零,我们需要一个 1MHz 的时钟。KEA64RM 中的表 18-2 显示 FDIV 应设置为 0x10。

未复位:

J-Link>mem8 40020000 1
40020000 = 00

设置分隔线并验证一切都很好:

J-Link>w1 40020000 10
Writing 10 -> 40020000
J-Link>mem8 40020000 1
40020000 = 90

FDIVLD 已设置并显示 FDIV 中的正确值。

在走得太远之前,让我们确保闪光灯没有受到保护:

J-Link>mem8 40020001 1
40020001 = FE

KEYEN = 11(禁用)和 SEC=10(不安全)。好的。让我们尝试验证设备是否为空白:

J-Link>mem8 40020006 1
40020006 = 80
J-Link>w1 40020002 0
Writing 00 -> 40020002
J-Link>w1 4002000a 1
Writing 01 -> 4002000A
J-Link>mem8 40020006
J-Link>w1 40020006 80
Writing 80 -> 40020006
J-Link>mem8 40020006 1
40020006 = 83

在这里,我们看到 FSTAT 中的 MGSTAT 位指示空白检查失败,并且发现了不可纠正的错误。奇怪的。让我们尝试自己擦除它:

J-Link>w1 40020002 0
Writing 00 -> 40020002
J-Link>w1 4002000a 8
Writing 08 -> 4002000A
J-Link>w1 40020006 80
Writing 80 -> 40020006
J-Link>mem8 40020006 1
40020006 = 80

擦除所有命令成功。现在让我们尝试一张空白支票:

J-Link>w1 40020002 0
Writing 00 -> 40020002
J-Link>w1 4002000a 1
Writing 01 -> 4002000A
J-Link>w1 40020006 80
Writing 80 -> 40020006
J-Link>mem8 40020006 1
40020006 = 80

现在空白支票可以吗?

在这一点上,我准备放弃,吃掉这些原型的损失,并使用 ST 的处理器,我以前从未遇到过此类问题。Kinetis 文档足够详尽,但内容非常密集,我发现入门非常困难。我可以通过内存读取来调整 I/O 并访问其他外围设备,但我一生都无法弄清楚闪存控制器出了什么问题。我从事 micros 工作已经 20 多年了,这种困难是我以前从未遇到过的。

20150102 编辑:

所以还是不去这里。我实际上已经购买了 FRDM-KL25Z 评估板(DigiKey 15 美元)并通过将通用 CMSIS-DAP 软件放在 OpenSDA 调试器上并按照Keith Wakeham 的博客切割 J11 对其进行了修改。我已经让板载目标(KL25Z)运行了一个简单的程序,因此它不会干扰重置线,我可以看到我的 SKEAZN64 与 OpenOCD 并使用它,但不幸的是它也无法对其进行编程。Kinetis Design Studio (KDS) 软件不会刷新我的 Kinetis,因为它说它受到保护并且我需要进行批量擦除,但 OpenOCD(作为 KDS 的一部分)似乎不知道如何执行此操作。我在我的 Mac 上构建的 OpenOCD 的 git master 版本理解 Kinetis,但不理解特定的 KEA 系列,所以我回到了原点。

回到J-Link...

@AdamHaun 有一个非常好的线索,如果我将 J-Link 重置类型(rsettype 命令)设置为类型“6”(Kinetis),J-Link 应该在重置核心后禁用看门狗。查看 WDOG_CS1 寄存器 (0x40052000) 看起来确实如此,但仍然没有骰子。擦除操作似乎在 0xffffffffe 和错误代码 -5 时与 PC 脱轨,并且“解锁 kinetis”命令仅在我使用 SIM_SOPT 禁用复位引脚时才有效(通过将 32 位值 0x00000008 写入 0x40048004)。不幸的是,如果我这样做,CPU 将无法再次停止,大概是因为 SWD 接口无法使用复位线来强制 SWD DAP 进入已知状态。

20150103 编辑:

我有闪烁的 LED

重复

我有闪烁的 LED

TL;DR 版本:将 USBDM 映像放在 FRDM-KL25Z 板上(一个故事完全独立),使用 ARM Programmer 独立应用程序将测试 .elf 发送到板上。电源循环和瞧。

长版稍后会出现。我现在有不到 48 小时的时间来编写和调试这个 KEAZN64 板的软件,完成修改/测试其他软件,并为另一个客户处理一些文档。我保证我用详细的答案更新这个问题。我只是想分享我的成功。谢谢大家的帮助。我可能不得不和模组谈谈,因为我真的很想把赏金特别送给你们中的几个。

4个回答

我实际上在您的程序中找不到任何逻辑错误,但这里有一些建议:

  • 还有一个 FTMRH_FERSTAT 寄存器(位于 4002_0007h)。它应该告诉你出了什么问题……但仅限于奇偶校验(或双校验错误)的情况。我不相信这会记录任何内容以防万一或删除错误,但可能值得一试。

  • KEA 文档还提到闪存错误可能会触发中断(“18.3.5 闪存和 EEPROM 中断”部分)。我不知道当 SEGGER 擦除它时是否会发生这种情况,但这是一个合理的解释,说明为什么 PC 也会发生变化,因为您确实看到 FSTAT 寄存器中标记了错误。不幸的是,中断控制器的 KEA 文档部分(“3.3.2 嵌套向量中断控制器 (NVIC) 配置”)相当模糊地指向 ARM 网站的完整文档方向。我无法弄清楚是否为闪存错误设置了默认中断处理程序(在启动时)。

  • 您只手动完成了扇区级别的擦除,因此请尝试手动(如通过自己编写适当的寄存器)发出完整的闪存擦除命令;在单个命令中执行此操作的唯一方法似乎是手册第 18.3.9.10 节(第 246 页)中记录的“不安全闪存命令”。这将“不安全”设备并执行完整的闪存和 EEPROM 擦除。您可以轮询 FSTAT 位 (CCIF) 以查看它应该何时完成,然后再次检查错误标志。编辑:手册中还有一个“18.3.9.7 擦除所有块命令”部分,呃。

  • 尝试较低的总线时钟频率。根据文档,高于 0.8 Mhz 的任何内容都有效。我建议这样做是因为飞思卡尔论坛上有一个线程可以正常使用外部闪存,但不高于仍处于正常记录范围内的某个频率。因此,芯片中的闪存控制器可能很脆弱,无法在规定的整个频率范围内运行。

  • 同样,你的另一个芯片。考虑到这些成本(大约 3 美元),你得到一个坏的并不是不可想象的。我确实记得有一个嵌入式 x86 芯片在大多数情况下都可以正常工作,但在某些保护模式指令上却出现了奇怪的错误;我的问题在同一品牌的不同设备上消失了。我不清楚飞思卡尔是否(公开声明)这些设备的步进和勘误表。

这就是我能想到的关于调试建议,其他人在这个页面上没有说过。

20150103 编辑:

(将材料从我的评论移到此处并扩展)

似乎并非所有 Kinetis 系列都(至少正式地)对所有闪光灯进行了测试。您实际使用的相当新的 EA 系列似乎只有飞思卡尔自己的/OEM Cyclone MAX 闪光灯官方支持;它是飞思卡尔页面上唯一列出的 EA 系列现在,对于像 KL0 这样的旧 Kinetis,列表要长得多,包括 SEGGER我不知道这是否仅仅是因为缺乏对 EA 系列的其他闪光灯的测试,或者是否实际上涉及一些只有他们的 Cyclone MAX 目前知道的编程怪癖。我希望这可能只是飞思卡尔在列出其他闪光灯时速度很慢,但是在查看J-link 手册时(希望是正确的),那里也没有列出 Kinetis E 或 EA 系列(第 249 页),但只有 Kinetis K10 到 K60 设备(以及一些较旧的 MAC7)。

值得注意的是,Cyclone MAX 的 PExDrv 软件/固件有一个服务包 (v10.3),日期为 2014 年 3 月 20 日,其中“增加了对 MKE04Z64、MKE04Z128、MKE06Z64、MKE06Z128、SKEAZ64和 SKEAZ128 衍生产品的支持。” 另一个线索是飞思卡尔自己的 Kinetis开源引导加载程序/闪存加载程序软件,尽管最近在 12/2014 进行了更新,但并未列出任何支持的 E 或 EA [子] 系列设备。因此,我认为 E/EA 系列和其他 Kinetis(如 K10)之间的闪烁在闪光方面存在很大差异,尽管我不知道这种差异到底是什么。因此,我认为在这一点上,期望 EA 闪烁能够自动与 Cyclone MAX 以外的任何设备一起工作可能是不现实的。您可能最终能够从 EA 系列文档中弄清楚如何在“裸机”级别(直接注册命令)执行此操作,但我同意该文档非常迟钝;它当然缺少任何分步说明,只是参考手册。如果飞思卡尔的开源引导加载程序/闪存加载程序支持 E/EA 系列,你

您对 FRDM-KL25Z(Kinetis L 系列附带)的实验指向相同的方向,即您不能将 L 系列与 EA 系列交换并使用相同的闪光灯(在本例中为 OpenSDA)。

如果你像 Keith(博主)一样“认为 100 美元给一个程序员是荒谬的”,你可能不会对在 Cyclone 上投入 900 美元以上的观点感到满意。我不知道飞思卡尔这样做是否是为了骗取他们的汽车客户或其他什么...... Kinetis 系列的大多数工具不适用于 E/EA,这确实看起来很奇怪。

还要注意 OpenSDA 的闪烁功能显然只能在 MS Windows 下工作

如果您愿意尝试(破解)更多电路板,那么带有 E 系列 Kinetis 的电路板可能会更好,例如 FRDM-KE02Z(Digi-Key 售价 13 美元);还使用 OpenSDA,因此它可能是可破解的。据我所知,他们不制造/销售 EA 系列的电路板。但是,您似乎不能使用一个 OpenSDA 处理器/板来编程与其自己板上的 Kinetis 类型不同的 Kinetis 类型,即使两个处理器属于相同(例如 L)系列,但编号不同。不幸的是,OpenSDA 中的“开放”仅意味着 SDA 规范是开放的,而不是他们将源代码作为开源提供;所以我什至找不到对 E 系列闪存进行编程的源代码。显然,我只说对了一半。OpenSDA v1 不是开源的,但 v2 是.

所以这是OpenSDAv2的内幕。它基本上只是一个 CMSIS-DAP/mbed 引导加载程序和闪存。因此,它可能没有与 v1 相同的功能或支持相同的芯片......而事实证明确实如此,因为flash_features.h没有列出任何 MKE(Kinetis E 系列),更不用说 SKE(EA 系列)设备。总之,飞思卡尔对 EA 系列的建议似乎是:购买我们 900 美元的 Cyclone flasher 或者祝你好运,从我们发布的任何不完整的开源代码中编写自己的。

然而事实证明,有一个开源项目至少可以对 E 系列 Kinetis 进行编程,即USBDM其变更日志中的相关位是:

V4.1.6.140(2014 年 4 月)

其他 Kinetis 器件(MKE04、MKE06、MK64F)

  • MKE 设备的修复(除了批量擦除后无法编程)

根据该日志条目,E 系列肯定显得古怪。没有对 EA 系列 (SKE) 的直接支持,但如果您想破解自己的 flasher,那么该代码库可能是您最好的选择;或者您可以说服 USBDM 的作者添加 EA 系列 (SKE) 支持。事实证明,作为 USBDM 的硬件,您可以使用您已经获得的 FRDM-KL25Z;但是你仍然需要破解 USBDM 软件来支持 SKE 芯片。

USBDM的主配置文件看起来相当令人生畏。在 USDBM 中,不同的闪光灯(代码库)用于不同的 MKE 系列设备:称为“FTMRE”的东西用于 MKE04 和 MKE06,但“FTMRH”用于 MKE02。在简要查看了这两个代码库之后,您几乎肯定想要FTRMH 代码库而不是 FTRME 代码库。后者具有与您的 SKEA64 设备不同的 FTMRH 结构,例如,时钟分频器不是第一个字段而是第四个字段。FTRME 还将总线 FIDV 设置为 0x17 = 24Mhz,这似乎超出了您的芯片的范围(KEA64 手册中的第 224 页建议最大 20Mhz)。FTMRH 将其设置为 0x0F = 16Mhz(就像您所做的那样),这似乎没问题。

在这一点上,(除非你想购买 Cyclone MAX)你最好的选择是联系 Podonoghue 让你的芯片与他的代码库一起工作。他似乎很活跃并且非常愿意帮助使用新设备(在飞思卡尔论坛上)

此外,从那个 USDBM 源代码中,我可以预言,除非它首先获得自己的固件更新,否则您的 SEGGER 无法自行正确刷新您的 SKEA。我为什么这么说?因为那里只有一个设备使用 USDBM 的 FTMRH 代码库,即 MKE02,您的 SEGGER 似乎对此一无所知(根据其手册)。其他更常见的设备(如 Kinetis L 和 K 系列)使用基于“FTFA”代码库的不同 USDBM 闪光器。如果您查看FTFA 的代码,闪存控制器寄存器结构(也从 0x40020000 开始)对于这些是不同的;第一个字段甚至不是时钟分频器,而是统计寄存器等。飞思卡尔制造不兼容设备的“好”方式……但无疑是闪光灯制造商的福音。

你试过这个吗:用 Segger J-Link 解锁和擦除闪存

据称,您必须:

为了使用 Segger J-Link 重新编程受保护的 FLASH 扇区,我需要首先解锁并批量擦除设备。为此,有一个 J-Link Commander 实用程序,它有一个命令行界面来取消保护和擦除设备。仅用于擦除,J-Flash(和 Lite)是一个非常有用的工具,尤其是用于获得“干净”的设备内存。

我发现有趣的是,如果您希望解锁是永久的,您必须在下一步中解锁并擦除它:

但似乎我需要解锁,然后擦除以使其永久化。要擦除设备,我可以使用相同的命令行实用程序。但我需要先指定设备名称,然后才能擦除它(以 KL25Z 为例):

EDIT1:添加了错误的数据。

EDIT2:你能读懂闪存安全(FSEC)寄存器吗?你试过了吗?

EDIT3:来自使用 Kinetis 安全和闪存保护功能,修订版 1,6/2012

通过调试器/JTAG 进行批量擦除 当处理器受到保护时,调试器和 JTAG 工具对器件的访问非常有限。可以通过 JTAG 访问的唯一寄存器是 MDM-AP 状态和控制寄存器。为了允许调试工具对部件进行解密,可以设置 MDM-AP 控制寄存器的位 0 以请求对处理器进行批量擦除。为了使用此方法禁用安全性,必须将 FSEC[MEEN] 设置为 10 以外的值以允许批量擦除功能。如果禁用整体擦除,FSEC[MEEN] = 10,则整体擦除请求将被闪存忽略,并且无法使用此方法对设备进行解密。许多调试器会自动使用 MDM-AP 状态寄存器的第 2 位来确定在尝试建立连接时设备是否安全。调试器弹出窗口可用于提醒设备已安全,并询问是否需要批量擦除以解除设备安全。批量擦除完成并验证后,将禁用安全性。一些调试器可能会自动对闪存配置字段进行编程,以在批量擦除完成后将闪存置于不安全状态,FSEC = 0xFE。

此外,我偶然发现一篇文章提到不同的 kinetis 系列在尝试读/写 MDM-AP 寄存器时需要不同的 RESET 信号操作。

EDIT4:您是否尝试在 SWD_DIO 上添加强上拉?这是在黑暗中拍摄,但飞思卡尔推荐它。

您必须先停止处理器。很明显,您会遇到正在运行的处理器的症状。我使用openocd;在闪烁设备之前,我使用“reset halt”命令。该“halt”是“reset”的子命令,用于在重置后立即停止,同时也有一个独立的停止命令。

所以寻找一个“重置暂停”命令,仅仅暂停是不够的,因为我猜你必须进入向量的预初始化状态。

我还没有看到它提到过,所以我会继续推测问题在于这部分有一个在重置时启用的缓存。这与您在空白支票中观察到的“奇怪”行为一致。底层 Flash 已更新,但缓存未更新。MCM_PLACR要解决此问题,请通过写入at来关闭数据和指令缓存,F000_300Ch并在执行此操作时清除缓存。同样的奇怪行为也可能使 Segger 感到困惑。