多年来,我一直在使用各种微控制器和微处理器,但我似乎被 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 板的软件,完成修改/测试其他软件,并为另一个客户处理一些文档。我保证我会用详细的答案更新这个问题。我只是想分享我的成功。谢谢大家的帮助。我可能不得不和模组谈谈,因为我真的很想把赏金特别送给你们中的几个。