Używam różnych mikrokontrolerów i mikroprocesorów od wielu, wielu lat, ale wydaje mi się, że przeszkadza mi seria Kinetis KE (w szczególności S9KEAZN64AMLC).
17 stycznia 2015 TL; DR:
Freescale potwierdza, że wersja 2.0.0 ich oprogramowania Kinetis Design Studio nie działa z tym urządzeniem (w tym z własną płytą ewaluacyjną TRK-KEA64). Na razie zalecają używanie CodeWarrior MCU V10.6.
Segger wypuścił wersję 4.96a („a” jest ważne, korzystałem z wersji 4.96), która rozwiązuje problem i pozwala używać płyty debugera Segger J-Link Lite CortexM z KDS i mieć pełną możliwość programowania / debugowania.
Zanim Segger wypuścił wersję 4.96a, udało mi się sflashować układ, przeprogramowując debugger OpenSDA na niedrogiej (15 USD) płycie ewaluacyjnej FRDM-KL25Z Freescale, zmieniając oprogramowanie wbudowane OpenSDA z USBDM (przy użyciu wersji v.10.10.6.240). Następnie użyłem samodzielnego oprogramowania „ARM Programmer” USBDM. Nie spędzałem dużo czasu próbując uruchomić debugowanie, ponieważ jestem wystarczająco biegły w debugowaniu „oldschool”, aby go nie potrzebować. Upewnij się, że flashujesz „łagodny” program na pokładzie KL25 lub może to zakłócać programowanie, ponieważ linia resetu na pokładzie KL25 jest nadal podłączona do debuggera OpenSDA, nawet z cięciem J11 (patrz post na blogu Keitha Wakehama , link poniżej).
Ogromne podziękowania dla Ericha Stygera za bardzo, bardzo łaskawą pomoc w ustaleniu problemu i potwierdzeniu moich ustaleń przez e-mail.
Wróćmy do naszego regularnie zaplanowanego pytania:
Zbudowałem głupio prostą płytkę z wyłącznikiem 3,3 V. Ma kilka diod LED na PTA, połączenie UART na PTC, a linie SWD są na dedykowanych liniach. W tej desce nie ma dosłownie nic wyszukanego ani zabawnego.
Używam J-Link Lite dla Cortex-M (J-Link LITE CortexM-9, patrz https://www.segger.com/jlink-lite-cortexm.html ) i zarówno w OSX, jak i Windows otrzymuję ten sam wynik: narzędzie J-Link Commander może zidentyfikować układ, mogę czytać i zapisywać w pamięci SRAM oraz bawić się urządzeniami peryferyjnymi z ręcznymi odczytami i zapisami na poprawny adres we / wy odwzorowany w pamięci. Jednak gdy próbuję sflashować urządzenie, to się nie udaje.
$ 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 jest całkowicie w porządku (mogę czytać i pisać na nRF58122 SoC, innym procesorze Cortex-M0, z nim), a urządzenie wydaje się działać inaczej. Wiem, że Kinetis jest odblokowany, ponieważ są fabrycznie nowe od DigiKey, ale nawet wtedy polecenie „odblokowanie kinetis” w JLinkExe przekroczy limit czasu bez żadnego błędu lub użytecznych informacji.
W tej chwili jestem pewien, że robię coś głupiego, ale brakuje mi tego, co to może być.
Czy ktoś wcześniej pracował z tymi urządzeniami? Jak je programujesz?
edytuj, aby dodać instrukcję:
Więcej informacji:
Przeczytałem, że pin NMI # jest włączony po zresetowaniu (i zweryfikowałem to, czytając SIM_SOPT), ale także, że ma wewnętrzny pull-up, gdy jest włączony. W tej konkretnej części PTB4 znajduje się na pinie 10, co w moim projekcie nie ma połączenia. Wyłączenie pinu NMI nie ma znaczenia. RST # jest podobny; Jest podłączony do przycisku, który uziemia pin, a także przechodzi do J-Link Lite, ale nie ma zewnętrznego pullupu. Nie powinno to mieć znaczenia, ponieważ podobnie jak NMI #, pin RST # ma wewnętrzne pullup, który jest włączony, gdy PTA5 jest skonfigurowany do resetowania.
Patrząc na taktowanie teraz ... Po zresetowaniu ICS jest źródłem zegara dla FLL, a BDIV w ICS_C2 jest ustawiony na 001 (domyślne resetowanie). Jeśli dobrze rozumiem, oznacza to, że wewnętrzny oscylator 32kHz jest mnożony przez 1024 przez FLL, a następnie dzielony przez 2, co daje ICSOUTCLK 32kHz * 1024/2 lub 16,8 MHz. Mogę sprawdzić za pomocą interfejsu CLI J-Link, czy plik FLL jest zablokowany, czytając ICS_S:
J-Link>mem8 40064004 1
40064004 = 50
(LOCK i IREFST są ustawione, jest to poprawne.)
Następnie przechodzę do sprawdzenia, czy karta SIM ma włączony zegar kontrolera flash, czytając SIM_SCGC. Mogę również szybko sprawdzić, aby upewnić się, że BUSDIV w SIM_BUSDIV jest ustawiony na zero, co oznacza, że BUSCLK ma tę samą częstotliwość co ICSOUTCLK (tj. Nie jest dzielony):
J-Link>mem32 4004800c 1
4004800C = 00003000
J-Link>mem32 40048018 1
40048018 = 00000000
Jak dotąd wszystko wygląda dobrze. BUSCLK ma 16,8 MHz, a zegar kontrolera flash nie jest bramkowany.
Przejdźmy teraz do kontrolera flash. Po zresetowaniu FCLKDIV wynosi zero i potrzebujemy zegara 1MHz. Tabela 18-2 w KEA64RM pokazuje, że FDIV powinien być ustawiony na 0x10.
Po zresetowaniu:
J-Link>mem8 40020000 1
40020000 = 00
Konfigurowanie dzielnika i sprawdzanie rzeczy jest dobre:
J-Link>w1 40020000 10
Writing 10 -> 40020000
J-Link>mem8 40020000 1
40020000 = 90
FDIVLD jest ustawiony i wyświetlana jest poprawna wartość w FDIV.
Zanim przejdziemy za daleko, upewnijmy się, że lampa błyskowa nie jest chroniona:
J-Link>mem8 40020001 1
40020001 = FE
KEYEN = 11 (wyłączony) i SEC = 10 (niezabezpieczony). Dobrze. Spróbujmy sprawdzić, czy urządzenie jest puste:
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
Widzimy tutaj, że bity MGSTAT w FSTAT wskazują, że sprawdzenie próby ślepej nie powiodło się, a także znaleziono błędy, których nie można poprawić. Dziwny. Spróbujmy to usunąć sami:
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
Komenda wymazania wszystkich powiodła się. Teraz wypróbujmy czek in 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
Teraz czek in blanco jest w porządku?
W tym momencie jestem już gotowy się poddać, zjeść stratę na tych prototypach i przejść z procesorem z ST, w którym nigdy wcześniej nie miałem takich problemów. Dokumentacja Kinetis jest dość dokładna, ale jest bardzo gęsta i trudno mi zacząć. Mogę przełączać wejścia / wyjścia poprzez odczyty pamięci i uzyskiwać dostęp do innych urządzeń peryferyjnych, ale przez całe życie nie mogę zrozumieć, co jest nie tak z kontrolerem flash. Pracuję z micros od ponad 20 lat i tego rodzaju trudności nigdy wcześniej nie spotkałem.
20150102 edycja:
Więc nadal nie idź tutaj. Właściwie kupiłem płytę ewaluacyjną FRDM-KL25Z (15 USD od DigiKey) i zmodyfikowałem ją, umieszczając ogólne oprogramowanie CMSIS-DAP w debuggerze OpenSDA i wycinając J11 zgodnie z blogiem Keitha Wakehama . Mam na pokładzie docelowy (KL25Z) działający prosty program, więc nie koliduje on z linią zerowania i widzę mój SKEAZN64 z OpenOCD i bawię się nim, ale niestety nie może go również zaprogramować. Oprogramowanie Kinetis Design Studio (KDS) nie flashuje mojego Kinetisa, ponieważ mówi, że jest chroniony i muszę wykonać masowe wymazywanie, ale OpenOCD (jako część KDS) nie wie, jak to zrobić. Wersja git master OpenOCD, którą zbudowałem na moim Macu, rozumie Kinetis, ale nie konkretną serię KEA, więc wracam do sedna.
Wracając do J-Link ...
@AdamHaun miał naprawdę dobrą wskazówkę i jeśli ustawię typ resetowania J-Link (polecenie rsettype) na typ „6” (Kinetis), J-Link powinien wyłączyć watchdoga po zresetowaniu rdzenia. Patrząc na rejestr WDOG_CS1 (0x40052000) wydaje się, że tak jest, ale nadal nie ma kości. Wydaje się, że operacja kasowania znika z komputera z 0xfffffffe i kodem błędu -5, a polecenie „odblokuj kinetis” działa tylko wtedy, gdy wyłączę pin resetowania za pomocą SIM_SOPT (zapisując 32-bitową wartość 0x00000008 na 0x40048004). Niestety, jeśli to zrobię, procesora nie można już nigdy zatrzymać, prawdopodobnie dlatego, że interfejs SWD nie może użyć linii resetowania do wymuszenia znanego stanu SWD DAP.
20150103 edycja:
MAMY DIODĘ LED
POWTARZAĆ
MAMY DIODĘ LED
Wersja TL; DR: umieść obraz USBDM na płycie FRDM-KL25Z (historia sama w sobie), użyj samodzielnej aplikacji ARM Programmer, aby wysłać testową .elf na płytkę. Cykl zasilania i voilà.
Długa wersja pojawi się później. Mam teraz mniej niż 48 godzin na napisanie i debugowanie oprogramowania dla tej płyty KEAZN64, dokończyć modyfikowanie / testowanie innego oprogramowania, które się z nią wiąże, i pracować nad dokumentacją dla innego klienta. Obiecuję, że będzie aktualizować to pytanie ze szczegółową odpowiedź. Chciałem tylko podzielić się moim sukcesem. Dziękuję KAŻDEMU za pomoc. Być może będę musiał porozmawiać z modami, ponieważ naprawdę chciałbym dać nagrodę szczególnie niektórym z was.