Freescale Kinetis KE: escritura en flash

He estado usando varios microcontroladores y microprocesadores durante muchos, muchos años, pero parece que la serie Kinetis KE (específicamente el S9KEAZN64AMLC) me bloquea.

17 de enero de 2015 TL; DR:

Freescale confirma que la versión 2.0.0 de su software Kinetis Design Studio no funciona con este dispositivo (incluida su propia placa de evaluación TRK-KEA64). Recomiendan usar CodeWarrior MCU V10.6 por el momento.

Segger ha lanzado v4.96a (la "a" es importante, estaba usando v4.96) que corrige el problema y le permite usar una placa de depuración Segger J-Link Lite CortexM con KDS y tener capacidad completa de programa/depuración.

Antes de que Segger lanzara la versión 4.96a, pude actualizar el chip al reprogramar el depurador OpenSDA en la placa de evaluación económica FRDM-KL25Z de Freescale ($15) al actualizar el firmware OpenSDA que viene con USBDM (usando la versión 4.10.6.240). Luego usé el software "ARM Programmer" independiente de USBDM. No pasé mucho tiempo tratando de que la depuración funcionara, ya que soy lo suficientemente hábil en la depuración "de la vieja escuela" como para no necesitarla. Asegúrese de mostrar un programa "benigno" en el KL25 de destino integrado o puede interferir con la programación, ya que la línea de reinicio del KL25 de destino integrado todavía está conectada al depurador OpenSDA incluso con el corte J11 (consulte la publicación de blog de Keith Wakeham , vinculado a continuación).

Muchas gracias a Erich Styger por ayudarme muy amablemente a determinar el problema y confirmar mis hallazgos por correo electrónico.

Ahora volvamos a nuestra pregunta programada regularmente:

He construido una placa de arranque de 3.3V estúpidamente simple. Tiene algunos LED en PTA, una conexión UART en PTC y las líneas SWD están en sus líneas dedicadas. Literalmente, no hay nada elegante o divertido en este tablero.

Estoy usando un J-Link Lite para Cortex-M (J-Link LITE CortexM-9, consulte https://www.segger.com/jlink-lite-cortexm.html ) y en OSX y Windows obtengo el mismo resultado: la utilidad J-Link Commander puede identificar el chip, puedo leer y escribir en SRAM y jugar con los periféricos con lecturas y escrituras manuales en la dirección de E/S asignada en memoria correcta. Sin embargo, cuando intento flashear el dispositivo, falla.

$ 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.

El J-Link Lite está perfectamente bien (puedo leer y escribir en el SoC nRF58122, otro procesador Cortex-M0) y el dispositivo parece funcionar. Sé que Kinetis está desbloqueado porque son existencias nuevas de fábrica de DigiKey, pero incluso entonces el comando "desbloqueo de kinetis" en JLinkExe se agota sin ningún error ni información útil.

En este momento, estoy seguro de que estoy haciendo algo estúpido, pero no sé qué podría ser.

¿Alguien ha trabajado con estos dispositivos antes? ¿Cómo los estás programando?

editar para agregar tutorial:

Más información:

Leí que el pin NMI # está habilitado fuera del reinicio (y lo verifiqué leyendo SIM_SOPT), pero también que tiene un pull-up interno cuando está habilitado. En esta parte en particular, PTB4 está en el pin 10, que no se conecta en mi diseño. Deshabilitar el pin NMI no hace ninguna diferencia. RST# es similar; Está conectado a un botón que conecta a tierra el pin y también va al J-Link Lite, pero no hay un pullup externo. Esto no debería importar porque, al igual que NMI#, el pin RST# tiene un pullup interno que se habilita cuando PTA5 está configurado para reiniciarse.

Mirando el reloj ahora... Fuera del reinicio, ICS es la fuente de reloj para el FLL y BDIV en ICS_C2 está configurado en 001 (el valor predeterminado de reinicio). Si entiendo correctamente, esto significa que el oscilador interno de 32kHz se multiplica por 1024 por el FLL y luego se divide por 2, lo que hace que ICSOUTCLK sea 32kHz * 1024 / 2 o 16.8MHz. Puedo verificar a través de J-Link CLI que el FLL está bloqueado leyendo ICS_S:

J-Link>mem8 40064004 1
40064004 = 50

(LOCK e IREFST están configurados, esto es correcto).

Luego paso a verificar que la SIM tiene el reloj habilitado para el controlador de flash leyendo SIM_SCGC. También puedo verificar rápidamente para asegurarme de que BUSDIV en SIM_BUSDIV esté configurado en cero, lo que significa que BUSCLK tiene la misma frecuencia que ICSOUTCLK (es decir, no se está dividiendo):

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

Hasta ahora, todo se ve bien. BUSCLK es de 16,8 MHz y el reloj del controlador de flash no está cerrado.

Ahora pasemos al controlador de flash. Fuera del reinicio, FCLKDIV es cero y necesitamos un reloj de 1 MHz. La tabla 18-2 en KEA64RM muestra que FDIV debe establecerse en 0x10.

Fuera de reinicio:

J-Link>mem8 40020000 1
40020000 = 00

Configurar el divisor y verificar que todo esté bien:

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

Se establece FDIVLD y se muestra el valor correcto en FDIV.

Antes de ir demasiado lejos, asegurémonos de que el flash no esté protegido:

J-Link>mem8 40020001 1
40020001 = FE

KEYEN = 11 (deshabilitado) y SEC=10 (no seguro). Está bien. Intentemos verificar que el dispositivo esté en blanco:

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

Aquí vemos que los bits MGSTAT en FSTAT indican que la verificación en blanco falló y también que se encontraron errores no corregibles. Raro. Intentemos borrarlo nosotros mismos:

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

El comando borrar todo tuvo éxito. Ahora probemos con un cheque en blanco:

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

¿Ahora el cheque en blanco está bien?

En este punto, estoy a punto de rendirme, aprovechar la pérdida de estos prototipos e ir con un procesador de ST donde nunca antes había tenido este tipo de problemas. La documentación de Kinetis es lo suficientemente completa, pero es muy densa y me resulta muy difícil comenzar. Puedo mover la E/S a través de lecturas de memoria y acceder a otros periféricos, pero no puedo descifrar qué es lo que está mal con el controlador flash. He estado trabajando con micros durante más de 20 años y este tipo de dificultad es algo que nunca antes había encontrado.

20150102 editar:

Así que todavía no vayas aquí. De hecho, compré una placa de evaluación FRDM-KL25Z ($ 15 de DigiKey) y la modifiqué colocando el software CMSIS-DAP genérico en el depurador OpenSDA y cortando J11 según el blog de Keith Wakeham . Tengo el objetivo incorporado (el KL25Z) ejecutando un programa simple para que no interfiera con la línea de reinicio y puedo ver mi SKEAZN64 con OpenOCD y jugar con él, pero desafortunadamente tampoco puede programarlo. El software Kinetis Design Studio (KDS) no muestra mi Kinetis porque dice que está protegido y necesito hacer un borrado masivo, pero OpenOCD (como parte de KDS) no parece saber cómo hacerlo. La versión maestra de git de OpenOCD que construí en mi Mac comprende Kinetis, pero no la serie específica de KEA, por lo que volví al punto de partida.

Volviendo al J-Link...

@AdamHaun tenía una pista realmente buena, y si configuro el tipo de reinicio de J-Link (comando rsettype) para escribir '6' (Kinetis), se supone que J-Link deshabilitará el perro guardián después de reiniciar el núcleo. Mirando el registro WDOG_CS1 (0x40052000) parece que ese es el caso, pero aún no hay dados. Una operación de borrado parece salirse de los rieles con PC en 0xffffffffe y código de error -5, y un comando "desbloquear kinetis" solo funciona si deshabilito el pin de reinicio usando SIM_SOPT (escribiendo el valor de 32 bits 0x00000008 a 0x40048004). Desafortunadamente, si hago eso, la CPU no se puede volver a detener, presumiblemente porque la interfaz SWD no puede usar la línea de reinicio para forzar el SWD DAP a un estado conocido.

20150103 edición:

TENGO LED PARPADEO

REPETIR

TENGO LED PARPADEO

Versión TL;DR: coloque la imagen USBDM en la placa FRDM-KL25Z (una historia en sí misma), use la aplicación independiente ARM Programmer para enviar el archivo .elf de prueba a la placa. Ciclo de encendido y listo.

La versión larga vendrá más tarde. Ahora tengo menos de 48 horas para escribir y depurar software para esta placa KEAZN64, terminar de modificar/probar otro software que la acompaña y trabajar en alguna documentación para otro cliente. Prometo actualizar esta pregunta con una respuesta detallada. Solo quería compartir mi éxito. Gracias a TODOS por su ayuda. Puede que tenga que hablar con los moderadores porque realmente me gustaría dar la recompensa a un par de vosotros en particular.

Pregunta estúpida, pero ¿estás seguro de que estás usando el j-link lite correcto? Están limitados a una plataforma. Yo mismo no he usado el incorrecto, pero así es como esperaría que fallara.
Dado que las etiquetas j-link y kinetis aquí prácticamente no tienen contenido (solo otra pregunta), probablemente debería intentar encontrar algún foro de soporte del fabricante o correo electrónico, soporte telefónico, etc. ¿quizás forum.segger.com ?
community.freescale.com/community/kinetis aparece como otro lugar donde puede encontrar personas con conocimientos sobre esto. community.freescale.com/thread/337779 parece ser muy similar, si no exactamente tu pregunta...
Por supuesto, tiene problemas con solo 100 kHz, así que quién sabe, podría ser otra cosa.
Además, desde el otro foro, SEGGER parece tener problemas con algunos pero no con todos los hardware de Kinetis: forum.segger.com/index.php?page=Thread&threadID=1986
@ScottSeidman sí; J-Link Lite, específico para la serie Cortex-M0. Este procesador específico también es compatible
@RespawnedFluff De hecho, tengo una pregunta casi idéntica en los foros de Kinetis: community.freescale.com/message/466015 . e.se tiene MUCHO más alcance y prefiero esta comunidad/sitio, así que pensé que no estaría de más preguntar aquí también.
@RespawnedFluff Tengo un correo electrónico para Segger, pero desafortunadamente con las vacaciones no creo que haya nadie por aquí por unos días todavía.
Los J-link lite están vinculados a FABRICANTES específicos, no a arquitecturas específicas. ¡Algo que funciona con Nordic NO funcionará con Kinetis! Necesita un programador específico de Kinetis o el J-Link completo
Mirando ahora, no estoy muy seguro de esto, pero sospecho que es el caso.
Las versiones OEM de J-link lite parecen tener esa limitación, por ejemplo, segger.com/jlink-oem-versions.html#freescale_jlink_lite solo funciona con Freescale. Pero hay versiones de Lite que no son OEM que no tienen tales limitaciones establecidas. Compare el enlace anterior con segger.com/jlink-lite-cortexm.html que debería funcionar con cualquier Cortex-M0. Ayudaría, por supuesto, si el OP especificara exactamente qué J-link Lite está usando...
@RespawnedFluff actualizó la pregunta para incluir la versión específica de J-Link. No es específico de OEM y establece directamente "Cualquier núcleo Cortex-M0/M0+/M1/M3/M4/M7 compatible".
Hmm, he mirado los documentos de Kinetics y no puedo encontrar ningún error lógico en el procedimiento que seguiste. Pero, ¿cuántos chips KEA has probado? A $ 3.xx cada uno, no es inconcebible que tengas uno malo con mal flash ...
@RespawnedFluff sí, tengo dos tableros construidos, ambos presentan el mismo problema. Ahora incorporé un FRDM_KL25Z como una interfaz de programación alternativa con el mismo resultado (ver edición)

Respuestas (5)

En realidad, no puedo encontrar ningún error lógico en su procedimiento, pero aquí hay algunas sugerencias:

  • también hay un registro FTMRH_FERSTAT (en 4002_0007h). Se supone que debe decirle qué salió mal... pero solo en el caso de paridad (o errores de doble paridad). No estoy convencido de que esto registre nada en caso de que borre errores, pero probablemente valga la pena echarle un vistazo.

  • la documentación de KEA también menciona que una interrupción puede ser provocada por errores de flash (sección "18.3.5 Interrupciones de flash y EEPROM"). No sé si eso es lo que sucede cuando SEGGER lo borra, pero es una explicación plausible de por qué la PC también cambia, ya que vio errores marcados en el registro FSTAT. Desafortunadamente, la sección de documentación de KEA para el controlador de interrupción ("3.3.2 Configuración del controlador de interrupción vectorial anidado (NVIC)") apunta vagamente en la dirección del sitio web de ARM para obtener la documentación completa. No pude averiguar si hay un controlador de interrupción predeterminado configurado (en el arranque) para errores de flash.

  • Solo ha realizado borrados a nivel de sector de forma manual, así que intente hacerlo manualmente (escribiendo usted mismo el registro correspondiente) emitiendo un comando de borrado de flash completo; la única forma de hacer esto en un solo comando parece ser el "Comando flash no seguro" documentado en la sección 18.3.9.10 (p. 246) del manual. Esto "desprotegirá" el dispositivo y hará un flash completo y un borrado de EEPROM. Puede sondear un bit FSTAT (CCIF) para ver cuándo supuestamente se completó y verificar los indicadores de error nuevamente después. EDITAR: también hay una sección "18.3.9.7 Comando Borrar todos los bloques" en el manual, duh.

  • pruebe con una frecuencia de reloj de bus más baja. Cualquier cosa por encima de 0,8 Mhz funciona de acuerdo con la documentación. Sugiero esto porque hubo un hilo en el foro de Freescale donde un flash externo funcionó bien, pero no por encima de cierta frecuencia que todavía estaba en el rango bien documentado. Por lo tanto, es posible que el controlador de flash en el chip sea defectuoso y no pueda operar en el rango completo de frecuencias indicadas.

  • Del mismo modo, tu chip es diferente. No es inconcebible que dado lo mucho que cuestan (alrededor de $3) tengas uno malo. Sí recuerdo tener un chip x86 incorporado que funcionaba bien en la mayoría de los casos, pero tenía errores extraños en ciertas instrucciones del modo protegido; mi problema desapareció con un dispositivo diferente de la misma marca. No me queda claro si Freescale tiene pasos y erratas (declarados públicamente) para estos dispositivos o no.

Esto es todo lo que puedo pensar en términos de sugerencias de depuración que otros no dijeron en esta página.

20150103 ediciones:

(Material movido aquí de mis comentarios y ampliado)

Parece que no todas las series Kinetis se prueban (oficialmente, al menos) con todas las luces intermitentes. La serie bastante nueva de EA que en realidad está utilizando parece ser compatible oficialmente solo con el propio flasher Cyclone MAX de Freescale/OEM; es el único que aparece en la página de Freescale para la serie EA . Ahora concedido, para Kinetis más antiguos como KL0, la lista es mucho más larga, incluido un SEGGER . No sé si eso se debe simplemente a la falta de pruebas de otros intermitentes para la serie EA o si en realidad hay alguna peculiaridad de programación involucrada que solo su Cyclone MAX conoce actualmente. Tenía la esperanza de que tal vez esto sea solo que Freescale está tardando en enumerar otros intermitentes, pero al consultar el manual de J-link(con suerte, el correcto), no hay ninguna serie Kinetis E o EA listada allí (p. 249) como probada, sino solo dispositivos Kinetis K10 a K60 (y algunos MAC7 más antiguos).

Vale la pena señalar que el software/firmware PExDrv para el Cyclone MAX tiene un paquete de servicio (v10.3) con fecha del 20/03/2014, que "agrega soporte para los derivados MKE04Z64, MKE04Z128, MKE06Z64, MKE06Z128, SKEAZ64 y SKEAZ128". Otra pista es que el propio software de cargador de arranque/cargador flash de código abierto de Freescale para Kinetis, a pesar de haberse actualizado incluso más recientemente en 12/2014, no incluye ningún dispositivo de la [sub]serie E o EA como compatible. Así que creo que hay algo lo suficientemente diferente con respecto al parpadeo entre la serie E/EA y otros Kinetis como el K10, aunque no tengo idea de cuál es exactamente esa diferencia. Por lo tanto, creo que esperar que el parpadeo de EA funcione automáticamente con cualquier cosa que no sea Cyclone MAX es probablemente poco realista en este momento. Es posible que eventualmente pueda descubrir cómo hacerlo en el nivel "bare metal" (comandos de registro directo) de la documentación de la serie EA, pero estoy de acuerdo en que la documentación es bastante obtusa; ciertamente carece de instrucciones paso a paso siendo solo un manual de referencia. Si el cargador de arranque/cargador flash de código abierto de Freescale fuera compatible con la serie E/EA,

Su experimento con el FRDM-KL25Z (que viene con una serie Kinetis L) apunta en la misma dirección, es decir, no puede intercambiar una serie L con una serie EA y usar el mismo flasher (OpenSDA en este caso).

Y si usted es como Keith (el bloguero) que "piensa que $100 dólares por un programador es ridículo", probablemente no estará satisfecho con la perspectiva de gastar más de $900 en ese Cyclone. No sé si Freescale hace esto a propósito para desplumar a sus clientes automotrices o qué... Seguramente parece extraño que las herramientas para la mayoría de la serie Kinetis no funcionen con el E/EA.

También tenga en cuenta que la función de flasheo de OpenSDA solo funciona bajo MS Windows , aparentemente.

Si está dispuesto a probar (hackear) más placas, una con Kinetis de la serie E podría ser una mejor idea, por ejemplo, FRDM-KE02Z ($13 en Digi-Key); también usa OpenSDA por lo que podría ser hackeable. No fabrican ni venden placas con la serie EA, por lo que sé. Sin embargo, parece que no puede usar un procesador/placa OpenSDA para programar un tipo de Kinetis diferente al de su propia placa , incluso si ambos procesadores están en la misma serie (por ejemplo, L), pero con números diferentes. Desafortunadamente, "Abrir" en OpenSDA solo significa que la especificación SDA está abierta, no que proporcionen el código fuente como fuente abierta; así que ni siquiera puedo encontrar el código fuente para programar un flash de la serie E. Aparentemente, solo tengo la mitad de razón en eso. OpenSDA v1 no es de código abierto, pero v2 es .

Así que aquí está la verdad sobre OpenSDAv2 . Básicamente es solo un cargador de arranque y flasher CMSIS-DAP/mbed. Por lo tanto, es posible que no tenga las mismas características ni admita los mismos chips que v1... y ese es el caso porque flash_features.h no incluye ningún MKE (Kinetis E-series) y mucho menos SKE (EA-series) dispositivos. En resumen, la propuesta de Freescale para la serie EA parece ser: compre nuestro Cyclone flasher de $900 o buena suerte escribiendo el suyo propio a partir de cualquier fragmento incompleto de código abierto que hayamos lanzado.

Sin embargo, resulta que hay un proyecto de código abierto que puede programar al menos el Kinetis de la serie E, a saber, USBDM . El bit relevante de su registro de cambios es:

V4.1.6.140 (abril de 2014)

Dispositivos Kinetis adicionales (MKE04, MKE06, MK64F)

  • Correcciones para dispositivos MKE (no se pudo programar excepto después de Mass Erase)

Y según esa entrada de registro, seguramente parece que la serie E es peculiar. No hay soporte directo para la serie EA (SKE), pero esa base de código es probablemente su mejor opción si desea piratear su propio flasher; o tal vez pueda convencer al autor de USBDM para que agregue compatibilidad con la serie EA (SKE). Como hardware para USBDM resulta que puedes usar el FRDM-KL25Z que ya has adquirido; pero aún debe piratear el software USBDM para admitir los chips SKE.

El archivo de configuración maestro para USBDM parece bastante desalentador. En USDBM, se usan diferentes flashes (bases de código) para diferentes dispositivos de la serie MKE: se usa algo llamado "FTMRE" para MKE04 y MKE06, pero se usa "FTMRH" para MKE02. Después de mirarme brevemente las dos bases de código, es casi seguro que desee la base de código FTRMH, no la FTRME. Este último tiene una estructura FTMRH diferente a la de su dispositivo SKEA64, por ejemplo, el divisor de reloj no es el primero sino el cuarto campo. FTRME también configura el bus FIDV a 0x17 = 24Mhz, lo que parece estar fuera de rango para su chip (la página 224 en el manual de KEA64 sugiere un máximo de 20Mhz). FTMRH lo establece en 0x0F = 16Mhz (como lo haces tú), lo que parece estar bien.

En este punto, (a menos que quiera comprar el Cyclone MAX), lo mejor que puede hacer es ponerse en contacto con Podonoghue para que su chip funcione con su base de código. Parece activo y bastante dispuesto a ayudar con nuevos dispositivos (en el foro de freescale) .

También a partir de ese código fuente de USDBM puedo profetizar que no hay forma de que su SEGGER pueda actualizar correctamente su SKEA por sí mismo a menos que obtenga su propia actualización de firmware primero. ¿Por qué digo eso? Porque la base de código FTMRH de USDBM es utilizada exactamente por un dispositivo allí, el MKE02, del cual su SEGGER tampoco parece saber nada (según su manual). Otros dispositivos más comunes, como las series Kinetis L y K, utilizan un flasher USDBM diferente basado en una base de código "FTFA". Si observa el código de FTFA , la estructura de registro del controlador flash (que también comienza en 0x40020000) es diferente para estos; el primer campo ni siquiera es un divisor de reloj, sino el registro de estadísticas, etc. "Excelente" manera para que Freescale haga dispositivos incompatibles... pero una gran ayuda para los fabricantes de luces intermitentes, sin duda.

FERSTAT no muestra nada útil como sospechabas; Lo había intentado desde el principio en toda esta debacle. Todas las interrupciones de flash están deshabilitadas de forma predeterminada, pero verifiqué si esto era quizás parte del problema. No hay dados allí tampoco. Tengo dos tableros y ambos actúan de la misma manera, pero he aprendido a lo largo de los años que es una cantidad de tiempo muy pequeña que el silicio es realmente el culpable, por lo que me estoy arrancando los pelos aquí. :-)
Intentaré bajar la frecuencia; los valores predeterminados de reinicio parecen ser para un reloj de bus de 16,78 MHz (32 kHz * 1024/2), por lo que seleccioné un divisor de reloj flash de 0x10 (32 kHz * 1024/2/16 es 1,048 MHz, que está dentro de las especificaciones, pero quizás un poco cerca del borde)
Su otra sugerencia, sobre el comando de desprotección (0xb) en lugar de borrar todo (0x8) ... tiene éxito, pero no puedo detener la CPU después y parece que tampoco puedo programar nada en flash después.
Les agradezco efusivamente por todo su esfuerzo para tratar de ayudar a este extraño de Internet. Me cuesta entender por qué este chip es tan difícil de usar, incluso cuando se usan programadores compatibles (J-Link y CMSIS-DAP) y el propio entorno y herramientas de desarrollo de Freescale. Me está volviendo loco.
Gracias por su investigación detallada y ayuda continua. De hecho, esto es exactamente lo que terminé haciendo: usar el FRDM-KL25Z con el firmware USBDM y el flash ARM independiente. Esto es lo que hizo que mi prueba de LED parpadeante entrara en el dispositivo. Lo curioso es que la lista de CPU compatibles con Segger menciona explícitamente el SKEAZN64xxx2, pero no funciona.

Probaste esto: Desbloqueo y borrado de FLASH con Segger J-Link

Supuestamente tienes que:

Para reprogramar los sectores FLASH protegidos con Segger J-Link, primero necesito desbloquear y borrar en masa el dispositivo. Para ello, existe la utilidad J-Link Commander que cuenta con una interfaz de línea de comandos para desproteger y borrar el dispositivo. Solo para borrar, J-Flash (y Lite) es una herramienta muy útil, especialmente para obtener una memoria 'limpia' del dispositivo.

Lo que me pareció interesante es que tienes que desbloquearlo y borrarlo en el siguiente paso si quieres que el desbloqueo sea permanente:

Pero parece que necesito hacer un desbloqueo, seguido de un borrado para que sea permanente. Para borrar el dispositivo, puedo usar la misma utilidad de línea de comando. Pero primero necesito especificar el nombre del dispositivo y luego puedo borrarlo (ejemplo para el KL25Z):

EDIT1: se agregaron datos incorrectos.

EDIT2: ¿puede leer el registro de Flash Security (FSEC)? ¿Has probado?

EDIT3: de Uso de las funciones de seguridad y protección flash de Kinetis, Rev. 1, 6/2012

Borrado masivo a través de Debugger/JTAG Los depuradores y las herramientas JTAG tienen un acceso muy limitado al dispositivo cuando un procesador está protegido. Los únicos registros a los que se puede acceder a través de JTAG son los registros de estado y control de MDM-AP. Para permitir que las herramientas de depuración desprotejan partes, el bit 0 del registro de control de MDM-AP se puede configurar para solicitar un borrado masivo del procesador. Para usar este método para deshabilitar la seguridad, FSEC[MEEN] debe establecerse en un valor distinto de 10 para permitir la capacidad de borrado masivo. Si el borrado masivo está deshabilitado, FSEC[MEEN] = 10, la memoria flash ignorará la solicitud de borrado masivo y el dispositivo no se podrá desproteger con este método. Muchos depuradores utilizarán automáticamente el bit 2 del registro de estado de MDM-AP para determinar si un dispositivo está protegido al intentar establecer una conexión. Se puede utilizar una ventana emergente del depurador para alertar de que el dispositivo está protegido y preguntar si se desea un borrado masivo para desproteger el dispositivo. Una vez que se complete y verifique el borrado masivo, se desactivará la seguridad. Algunos depuradores pueden programar automáticamente el campo de configuración flash para poner el flash en un estado no seguro después de que se complete el borrado masivo, FSEC = 0xFE.

También me topé con publicaciones que mencionan que diferentes familias de kinetis requieren diferentes manipulaciones de señal RESET al intentar leer/escribir el registro MDM-AP.

EDIT4: ¿intentaste agregar un pull-up fuerte en SWD_DIO? Es un tiro en la oscuridad, pero Freescale lo recomienda.

Gracias por tomarse el tiempo para ayudar a verificar y hacer sugerencias. FTMRH_FSEC (0x40020001) devuelve un valor de 0xfe, que es lo más desbloqueado/inseguro posible. Si leo flash en 0x0000400c, también puedo ver los bits de seguridad que muestran el mismo valor (que es donde FSEC obtiene los valores en el reinicio de encendido): J-Link> mem8 400 10 00000400 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF
J-Link tiene un comando "rsettype" con un valor Kinetis específico (6) que desactiva el temporizador de vigilancia al reiniciar. No detiene el procesador, pero puedo hacerlo con el comando "h". También puedo ver que si no uso rsettype 6, el perro guardián registra el informe de que el perro guardián está habilitado, lo que coincide con la documentación.
Probaría el pull-up, las dos placas que probó no lo tienen y si esto no funciona, entonces el Jlink es NOK.
Probé el pullup (4.7k, no estoy seguro de qué tan "fuerte" debería ser fuerte) pero no hizo ninguna diferencia.
4k7 está bien. Hiciste todo lo que pudiste. A partir de este momento, verifique el comportamiento con FRDM-KL25Z y luego envíe 1 millón de boletos a los muchachos de Jlink.

Primero debe detener el procesador. Es obvio que obtiene un síntoma de un procesador en ejecución. Yo uso openocd; antes de flashear el dispositivo, uso el comando "restablecer detener". Ese "detener" es un subcomando de "restablecer", para detenerse inmediatamente después del reinicio, mientras que también hay un comando de detención independiente.

Así que busque un comando de "restablecer detención", solo una detención no será suficiente porque supongo que debe llegar al estado de preinicialización de vectores.

Gracias por tu comentario, pero el segger detiene la CPU primero. También intenté detener manualmente la CPU antes de emitir estos comandos sin ningún cambio. Debería haberlo hecho obvio en mi pregunta.
No me di cuenta de que estabas diciendo que podría ser necesario detenerse antes de la inicialización de los vectores. Investigándolo, pero tengo problemas para entender por qué sería necesario. Gracias por la pista, todo ayuda

Todavía no lo he visto mencionado, así que seguiré adelante y especularé que el problema es que esta parte tiene un caché que se habilita al reiniciar. Esto es consistente con el comportamiento "extraño" que observaste con el cheque en blanco. El Flash subyacente se actualizó pero la memoria caché no. Para arreglar esto, apague tanto el caché de datos como el de instrucciones escribiendo MCM_PLACRen F000_300Chy también borre el caché mientras lo hace. Es probable que este mismo comportamiento extraño haya confundido al Segger también.

Esta fue una muy buena sugerencia. al reiniciar, MCM_PLACR se lee como 0x00000850, lo cual es un poco extraño (caché de datos deshabilitado, pero los bits 6 y 4 están reservados en la documentación). Intenté deshabilitar todo (especulación, caché del controlador, almacenamiento en caché de instrucciones) y luego borrar el caché escribiendo 0x0000bc00; volvió a leer 0x0000b850 pero no hubo cambios en el comportamiento.
Voy a estar muy interesado en escuchar cuando finalmente resuelva este problema. Mientras tanto, este chip ciertamente no estará en ninguno de mis diseños en el corto plazo. Perdón por su dolor, pero gracias por compartir la pregunta interesante.

Dado que el mensaje de error es sobre el valor de la PC, parece que la CPU se está descarrilando en alguna parte. Esta es una posibilidad remota, pero ¿ha intentado desactivar el temporizador de vigilancia?

Esa fue una sugerencia EXCELENTE; Pasé un tiempo después de leer tu respuesta probando esta teoría. Sin embargo, parece que cuando se ejecuta el "dispositivo skeazn64xxx2", el J-Link ya tiene esto en cuenta y desactiva el perro guardián después de reiniciar. Verifiqué esto comprobando el registro WDOG_CS1 con y sin especificar el dispositivo entre ciclos de energía. :-(
Hmm... está bien, la otra cosa que noté es que estás obteniendo errores corregibles durante el cheque en blanco. ¿Tu J-Link está desactivando el flash ECC? De lo contrario, eso podría causar problemas con la verificación de lectura y tal vez incluso desencadenar interrupciones inesperadas. (No estoy familiarizado específicamente con los MCU de Freescale, pero creo que este tipo de comportamiento es bastante común).