Eu uso vários microcontroladores e microprocessadores há muitos e muitos anos, mas pareço estar frustrado pela série Kinetis KE (especificamente o S9KEAZN64AMLC).
17 de janeiro de 2015 TL; DR:
A Freescale confirma que a versão 2.0 do seu software Kinetis Design Studio não funciona com este dispositivo (incluindo sua própria placa de avaliação TRK-KEA64). Eles recomendam o uso do CodeWarrior MCU V10.6 por enquanto.
A Segger lançou a v4.96a (o "a" é importante, eu estava usando a v4.96), que corrige o problema e permite que você use uma placa de depurador Segger J-Link Lite CortexM com o KDS e tenha recursos completos de programa / depuração.
Antes de a Segger lançar a v4.96a, consegui atualizar o chip reprogramando o depurador OpenSDA na placa de avaliação barata FRDM-KL25Z da Freescale (US $ 15) ao atualizar o firmware do OpenSDA que acompanha o USBDM (usando a v4.10.6.240). Eu então usei o software "ARM Programmer" autônomo do USBDM. Não gastei muito tempo tentando fazer a depuração funcionar, pois sou proficiente o suficiente na depuração "oldschool" para não precisar dela. Certifique-se de exibir um programa "benigno" no alvo KL25 de bordo ou ele pode interferir na programação, pois a linha de redefinição do KL25 do alvo de bordo ainda está conectada ao depurador OpenSDA, mesmo com o corte J11 (consulte a publicação do blog de Keith Wakeham , link abaixo).
Um grande obrigado a Erich Styger por me ajudar muito graciosamente a determinar o problema e confirmar minhas descobertas por e-mail.
Agora, de volta à nossa pergunta programada regularmente:
Eu construí uma placa estúpida e simples de 3.3V. Possui alguns LEDs no PTA, uma conexão UART no PTC e as linhas SWD estão em suas linhas dedicadas. Não há literalmente nada extravagante ou engraçado neste fórum.
Estou usando um J-Link Lite para Cortex-M (J-Link LITE CortexM-9, consulte https://www.segger.com/jlink-lite-cortexm.html ) e, tanto no OSX quanto no Windows, recebo o mesmo resultado: o utilitário J-Link Commander pode identificar o chip, eu posso ler e gravar na SRAM e brincar com os periféricos com leituras e gravações manuais no endereço de E / S mapeado na memória correto. Porém, quando tento piscar o dispositivo, ele falha.
$ 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.
O J-Link Lite está perfeitamente bem (eu posso ler e gravar no nRF58122 SoC, outro processador Cortex-M0, com ele) e o dispositivo parece funcionar de outra maneira. Sei que o Kinetis está desbloqueado, pois são novos produtos de fábrica da DigiKey, mas mesmo assim o comando "kinetis unlock" no JLinkExe atinge o tempo limite sem nenhum erro ou informações úteis.
Neste momento, tenho certeza de que estou fazendo algo estúpido, mas estou perdido para o que poderia ser.
Alguém já trabalhou com esses dispositivos antes? Como você os está programando?
edite para adicionar explicação passo a passo:
Mais algumas informações:
Eu li que o pino NMI # está habilitado fora de redefinição (e verifiquei isso lendo SIM_SOPT), mas também que ele possui um pull-up interno quando ativado. Nesta parte em particular, o PTB4 está no pino 10, que não é de conexão no meu projeto. Desabilitar o pino da NMI não faz diferença. RST # é semelhante; Ele está conectado a um botão que aterra o pino e também vai ao J-Link Lite, mas não há pullup externo. Isso não deve importar, porque, como o NMI #, o pino do RST # possui um pullup interno que é ativado quando o PTA5 está configurado para ser redefinido.
Observando o relógio agora ... Fora da redefinição, o ICS é a fonte do relógio para o FLL e o BDIV no ICS_C2 está definido como 001 (o padrão de redefinição). Se bem entendi, isso significa que o oscilador interno de 32kHz é multiplicado por 1024 pela FLL e depois dividido por 2, tornando o ICSOUTCLK 32kHz * 1024/2 ou 16,8MHz. Posso verificar através da CLI do J-Link que a FLL está bloqueada lendo ICS_S:
J-Link>mem8 40064004 1
40064004 = 50
(LOCK e IREFST estão definidos, isso está correto.)
Em seguida, passo para verificar se o SIM tem o relógio ativado para o controlador flash, lendo SIM_SCGC. Também posso verificar rapidamente se o BUSDIV no SIM_BUSDIV está definido como zero, o que significa que o BUSCLK tem a mesma frequência do ICSOUTCLK (ou seja, não está sendo dividido):
J-Link>mem32 4004800c 1
4004800C = 00003000
J-Link>mem32 40048018 1
40048018 = 00000000
Até agora, tudo parece bem. O BUSCLK tem 16,8 MHz e o relógio do controlador de flash não está bloqueado.
Agora vamos para o controlador flash. O FCLKDIV fora da redefinição é zero e precisamos de um relógio de 1 MHz. A Tabela 18-2 no KEA64RM mostra que o FDIV deve ser definido como 0x10.
Fora de redefinição:
J-Link>mem8 40020000 1
40020000 = 00
Configurar o divisor e verificar se as coisas são boas:
J-Link>w1 40020000 10
Writing 10 -> 40020000
J-Link>mem8 40020000 1
40020000 = 90
FDIVLD está definido e o valor correto em FDIV é mostrado.
Antes de ir muito longe, vamos garantir que o flash não esteja protegido:
J-Link>mem8 40020001 1
40020001 = FE
KEYEN = 11 (desativado) e SEC = 10 (não garantido). Está bem. Vamos tentar verificar se o dispositivo está em branco:
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
Aqui vemos que os bits MGSTAT no FSTAT indicam que a verificação em branco falhou e também que erros não corrigíveis foram encontrados. Ímpar. Vamos tentar apagá-lo nós mesmos:
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
O comando apagar todos foi bem-sucedido. Agora vamos tentar um cheque em branco:
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
Agora o cheque em branco está bom?
Neste ponto, estou prestes a desistir, comer a perda desses protótipos e usar um processador da ST, onde nunca tive esse tipo de problema antes. A documentação do Kinetis é completa o suficiente, mas é muito densa e estou achando muito difícil começar. Posso alternar a E / S através de leituras de memória e acessar outros periféricos, mas não consigo descobrir o que há de errado com o controlador flash. Trabalho com micros há mais de 20 anos e esse tipo de dificuldade é algo que nunca encontrei antes.
20150102 editar:
Então ainda não vai aqui. Na verdade, comprei uma placa de avaliação FRDM-KL25Z (US $ 15 da DigiKey) e a modifiquei colocando o software CMSIS-DAP genérico no depurador OpenSDA e cortando o J11 conforme o blog de Keith Wakeham . Eu tenho o alvo on-board (o KL25Z) executando um programa simples, para que não interfira na linha de redefinição e posso ver meu SKEAZN64 com o OpenOCD e brincar com ele, mas, infelizmente, também não pode programá-lo. O software Kinetis Design Studio (KDS) não pisca meu Kinetis porque diz que está protegido e preciso fazer uma exclusão em massa, mas o OpenOCD (como parte do KDS) parece não saber como fazer isso. A versão mestra do git do OpenOCD que construí no meu Mac entende o Kinetis, mas não a série específica da KEA, então estou de volta à estaca zero.
Voltando ao J-Link ...
O @AdamHaun tinha uma pista realmente boa e, se eu definir o tipo de redefinição do J-Link (comando rsettype) para digitar '6' (Kinetis), o J-Link deve desativar o watchdog após a redefinição do núcleo. Olhando para o registro WDOG_CS1 (0x40052000), parece que é esse o caso, mas ainda não há dados. Uma operação de exclusão parece sair dos trilhos com o PC em 0xfffffffe e o código de erro -5, e um comando "unlock kinetis" funciona apenas se eu desativar o pino de redefinição usando SIM_SOPT (escrevendo o valor de 32 bits 0x00000008 para 0x40048004). Infelizmente, se eu fizer isso, a CPU não poderá mais ser interrompida novamente, provavelmente porque a interface SWD não pode usar a linha de redefinição para forçar o SWD DAP a um estado conhecido.
20150103 editar:
TENHO LED PISCANDO
REPETIR
TENHO LED PISCANDO
Versão TL; DR: coloque a imagem USBDM na placa FRDM-KL25Z (uma história por si só), use o aplicativo autônomo do ARM Programmer para enviar o teste automaticamente para a placa. Ciclo de poder e voilà.
A versão longa virá mais tarde. Agora tenho menos de 48 horas para escrever e depurar software para esta placa KEAZN64, concluir a modificação / teste de outro software que a acompanha e trabalhar em alguma documentação para outro cliente. Eu prometo que vai atualizar esta pergunta com uma resposta detalhada. Eu só queria compartilhar meu sucesso. Obrigado a todos por sua assistência. Talvez eu precise falar com os mods porque realmente gostaria de dar a recompensa a alguns de vocês em particular.