多年来,我一直在使用各种微控制器和微处理器,但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),此问题已得到纠正,并允许您将Segger J-Link Lite CortexM调试器板与KDS一起使用,并具有完整的程序/调试功能。
之前发布的套件含有Segger我v4.96a管理,以能够通过重刷OpenSDA重新编程飞思卡尔的便宜($ 15)FRDM-KL25Z评估板的OpenSDA调试器闪存芯片固件谈到与USBDM(使用v4.10.6.240)。然后,我使用了USBDM的独立“ ARM编程器”软件。我没有花太多时间尝试调试工作,因为我足够精通“老式”调试,因此不需要调试。请确保将“良性”程序刷新到板载目标KL25中,否则可能会干扰编程,因为即使通过J11剪切,板载目标KL25的复位线仍仍连接到OpenSDA调试器(请参见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。我可以通过阅读ICS_S,通过J-Link CLI验证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,闪存控制器时钟未设门。
现在,让我们进入闪存控制器。复位后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)上运行了一个简单的程序,因此它不会干扰复位线,并且我可以看到带有OpenOCD的SKEAZN64并对其进行操作,但不幸的是,它也无法对其进行编程。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),看来确实是这种情况,但仍然没有骰子。擦除操作似乎在PC的0xfffffffe和错误代码-5上脱颖而出,并且仅当我使用SIM_SOPT禁用复位引脚(通过将32位值0x00000008写入0x40048004)时,“解锁运动”命令才有效。不幸的是,如果我这样做,CPU再也无法停止运行,这大概是因为SWD接口无法使用复位线将SWDAP强制进入已知状态。
20150103编辑:
我有闪烁的LED
重复
我有闪烁的LED
TL; DR版本:将USBDM映像放置在FRDM-KL25Z板上(本身就是一个故事),使用ARM Programmer独立应用程序将测试.elf发送到板上。关机后再开机。
长版将在以后发布。现在,我有不到48小时的时间为此KEAZN64板编写和调试软件,完成对它附带的其他软件的修改/测试,并为另一个客户端编写一些文档。我保证我会用详细的答案更新这个问题。我只是想分享我的成功。谢谢大家的帮助。我可能必须与mods交流,因为我真的很想特别感谢你们中的几个。