He estado utilizando varios microcontroladores y microprocesadores durante muchos, muchos años, pero parece que la serie Kinetis KE (específicamente el S9KEAZN64AMLC) me obstaculiza.
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 utilizar una placa de depuración Segger J-Link Lite CortexM con KDS y tener la capacidad completa de depuración / programa.
Antes de que Segger lanzara v4.96a logré flashear el chip reprogramando el depurador OpenSDA en la económica placa de evaluación FRDM-KL25Z de Freescale ($ 15) al actualizar el firmware OpenSDA que viene con USBDM (usando v4.10.6.240). Luego utilicé el software independiente "ARM Programmer" de USBDM. No pasé mucho tiempo intentando que la depuración funcionara, ya que soy lo suficientemente competente en la depuración de la "vieja escuela" como para no necesitarla. Asegúrese de mostrar un programa "benigno" en el KL25 objetivo de a bordo o puede interferir con la programación ya que la línea de reinicio del KL25 objetivo de la placa todavía está conectada al depurador OpenSDA incluso con el corte J11 (vea la publicación del blog de Keith Wakeham , vinculado a continuación).
Muchas gracias a Erich Styger por ayudarme muy gentilmente a determinar el problema y confirmar mis hallazgos por correo electrónico.
Ahora volvamos a nuestra pregunta programada regularmente:
He construido una placa de conexión 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 lujoso 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 bajo 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 correlacionada con la 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 nRF58122 SoC, otro procesador Cortex-M0, con él) y el dispositivo parece funcionar de otra manera. Sé que el Kinetis está desbloqueado ya que son existencias frescas de fábrica de DigiKey, pero incluso entonces el comando "desbloqueo de kinetis" en JLinkExe agota el tiempo de espera sin ningún error o 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 para restablecer (y verifiqué esto 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 es un no conectado en mi diseño. Deshabilitar el pin NMI no hace ninguna diferencia. RST # es similar; Está conectado a un botón que conecta el pin y también va al J-Link Lite, pero no hay pullup externo. Esto no debería importar porque, al igual que NMI #, el pin RST # tiene un pullup interno que se habilita cuando PTA5 se configura para reiniciarse.
Mirando el reloj ahora ... Sin reinicio, ICS es la fuente del reloj para el FLL y BDIV en ICS_C2 está configurado en 001 (el reinicio predeterminado). 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 de 32kHz * 1024/2 o 16.8MHz. Puedo verificar a través de la CLI de J-Link 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 para 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é establecido en cero, lo que significa que BUSCLK tiene la misma frecuencia que ICSOUTCLK (es decir, no se divide):
J-Link>mem32 4004800c 1
4004800C = 00003000
J-Link>mem32 40048018 1
40048018 = 00000000
Hasta ahora, todo se ve bien. BUSCLK es 16.8MHz y el reloj del controlador de flash no está cerrado.
Ahora pasemos al controlador de flash. Sin restablecer FCLKDIV es cero, y necesitamos un reloj de 1MHz. 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 las cosas es bueno:
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 avanzar demasiado, asegurémonos de que el flash no esté protegido:
J-Link>mem8 40020001 1
40020001 = FE
KEYEN = 11 (deshabilitado) y SEC = 10 (no seguro). Okay. 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 ha fallado y también que se encontraron errores no corregibles. Impar. 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 intentemos 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, comer la pérdida de estos prototipos e ir con un procesador de ST donde nunca he tenido este tipo de problemas antes. La documentación de Kinetis es lo suficientemente completa, pero es muy densa y me resulta muy difícil comenzar. Puedo mover las E / S a través de las lecturas de memoria y acceder a otros periféricos, pero no puedo entender por mi vida qué le pasa al controlador de 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 genérico CMSIS-DAP en el depurador OpenSDA y cortando J11 según el blog de Keith Wakeham . Tengo el objetivo a bordo (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 mostrará mi Kinetis porque dice que está protegido y que necesito borrarlo en masa, pero OpenOCD (como parte de KDS) no parece saber cómo hacerlo. La versión maestra git de OpenOCD que construí en mi Mac comprende Kinetis, pero no la serie KEA específica, así que vuelvo al punto de partida.
Volviendo al J-Link ...
@AdamHaun tenía una muy buena pista, 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 la PC en 0xfffffffe y el código de error -5, y un comando "desbloquear kinetis" solo funciona si desactivo el pin de restablecimiento usando SIM_SOPT (escribiendo el valor de 32 bits 0x00000008 a 0x40048004). Desafortunadamente, si hago eso, la CPU no puede detenerse nunca más, presumiblemente porque la interfaz SWD no puede usar la línea de reinicio para forzar el SWD DAP a un estado conocido.
20150103 editar:
HE PARPADEADO LED
REPETIR
HE PARPADEADO LED
Versión TL; DR: coloque la imagen USBDM en la placa FRDM-KL25Z (una historia por sí sola), use la aplicación independiente ARM Programmer para enviar la prueba .elf a la placa. Ciclo de potencia y voilà.
La versión larga vendrá más tarde. Ahora tengo menos de 48h para escribir y depurar software para esta placa KEAZN64, terminar de modificar / probar otro software que lo acompaña y trabajar en alguna documentación para otro cliente. Prometo que voy a 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 mods porque realmente me gustaría dar la recompensa a un par de ustedes en particular.