Я использую различные микроконтроллеры и микропроцессоры в течение многих, многих лет, но я, кажется, зашел в тупик из серии Kinetis KE (в частности, S9KEAZN64AMLC).
17 января 2015 г. TL; DR:
Freescale подтверждает, что версия 2.0.0 их программного обеспечения Kinetis Design Studio не работает с этим устройством (включая их собственную плату TRK-KEA64 eval). В настоящее время они рекомендуют использовать CodeWarrior MCU V10.6.
Segger выпустил v4.96a («a» важен, я использовал v4.96), который исправляет проблему и позволяет вам использовать отладочную плату Segger J-Link Lite CortexM с KDS и иметь полную возможность программирования / отладки.
До того, как Segger выпустил v4.96a, я смог перепрограммировать чип, перепрограммировав отладчик OpenSDA на недорогой плате FRDM-KL25Z от Freescale за $ 15, перепрошив прошивку OpenSDA, которая поставляется с USBDM (используя v4.10.6.240). Затем я использовал отдельное программное обеспечение «ARM Programmer» от USBDM. Я не тратил много времени, пытаясь заставить работать отладку, так как я достаточно опытен в отладке "oldschool", чтобы не нуждаться в этом. Пожалуйста, убедитесь, что вы вставили «доброкачественную» программу во встроенный целевой KL25, или это может помешать программированию, поскольку линия сброса встроенного целевого KL25 по-прежнему подключена к отладчику OpenSDA даже с сокращением J11 (см. Сообщение в блоге Кейта Уэйкхэма) , связанный ниже).
Большое спасибо Эриху Стайгеру за то, что он очень любезно помог мне определить проблему и подтвердить мои выводы по электронной почте.
Теперь вернемся к нашему регулярно задаваемому вопросу:
Я построил простую и простую коммутационную плату 3.3 В. У него есть несколько светодиодов на PTA, соединение UART на PTC и линии SWD на выделенных линиях. В этой доске нет ничего необычного или смешного.
Я использую J-Link Lite для Cortex-M (J-Link LITE CortexM-9, см. Https://www.segger.com/jlink-lite-cortexm.html ) и под OSX и Windows я получаю тот же результат: утилита J-Link Commander может идентифицировать микросхему, я могу читать и записывать в SRAM и воспроизводить периферийные устройства с ручным чтением и записью по правильному адресу ввода-вывода, отображенному в памяти. Когда я пытаюсь прошить устройство, оно не работает.
$ 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 прекрасно (я могу читать и писать на nRF58122 SoC, другой процессор Cortex-M0, с ним), и устройство, кажется, работает иначе. Я знаю, что Kinetis разблокирован, так как они являются заводскими свежими запасами от DigiKey, но даже тогда команда «kinetis unlock» в JLinkExe истекает без каких-либо ошибок или полезной информации.
На данный момент я уверен, что я делаю что-то глупое, но я в растерянности, что бы это могло быть.
Кто-нибудь работал с этими устройствами раньше? Как вы их программируете?
изменить, чтобы добавить пошаговое руководство:
Еще немного информации:
Я прочитал, что вывод NMI # включен после сброса (и проверил это, прочитав SIM_SOPT), но также он имеет внутреннее подтягивание при включении. На этой конкретной части PTB4 находится на выводе 10, который в моем дизайне не используется. Отключение вывода NMI не имеет значения. RST # похож; Он подключен к кнопке, которая заземляет контакт, а также подключается к J-Link Lite, но нет внешнего подтягивания. Это не должно иметь значения, потому что, как и NMI #, вывод RST # имеет внутреннее подтягивание, которое включается, когда PTA5 настроен для сброса.
Теперь рассмотрим тактирование ... Из сброса ICS является источником синхронизации для FLL, а для BDIV в ICS_C2 установлено значение 001 (по умолчанию для сброса). Если я правильно понимаю, это означает, что внутренний генератор 32 кГц умножается на 1024 на FLL, а затем делится на 2, делая ICSOUTCLK 32 кГц * 1024/2 или 16,8 МГц. Я могу проверить через CLI J-Link, что FLL заблокирован, прочитав ICS_S:
J-Link>mem8 40064004 1
40064004 = 50
(LOCK и IREFST установлены, это правильно.)
Затем я продолжаю, чтобы проверить, что на SIM-карте включены часы для контроллера флэш-памяти, прочитав SIM_SCGC. Я также могу быстро проверить, чтобы убедиться, что BUSDIV в SIM_BUSDIV установлен в ноль, что означает, что BUSCLK имеет ту же частоту, что и ICSOUTCLK (т.е. она не делится):
J-Link>mem32 4004800c 1
4004800C = 00003000
J-Link>mem32 40048018 1
40048018 = 00000000
Пока все выглядит хорошо. BUSCLK имеет частоту 16,8 МГц и тактовая частота контроллера вспышки не установлена.
Теперь перейдем к контроллеру вспышки. Выход из сброса FCLKDIV равен нулю, и нам нужна тактовая частота 1 МГц. Таблица 18-2 в KEA64RM показывает, что 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 (необеспечено). Ok. Попробуем убедиться, что устройство пустое:
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
Здесь мы видим, что биты MGSTAT в FSTAT указывают, что проверка не выполнена, а также были обнаружены не поддающиеся исправлению ошибки. Странный. Давайте попробуем стереть это сами:
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
Команда erase all успешно выполнена. Теперь давайте попробуем незаполненный чек:
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 достаточно тщательна, но она очень плотная, и мне очень трудно начать работу. Я могу покачивать ввод-вывод через чтение памяти и получать доступ к другим периферийным устройствам, но я не могу понять, что не так с контроллером флэш-памяти. Я работаю с микрофонами более 20 лет, и с такими трудностями я никогда не сталкивался раньше.
20150102 редактировать:
Так что до сих пор не пойду сюда. Я на самом деле купил плату FRDM-KL25Z eval (15 долларов от DigiKey) и изменил ее, поместив стандартное программное обеспечение CMSIS-DAP в отладчик OpenSDA и вырезав J11 согласно блогу Кейта Уэйкхэма . У меня есть встроенная цель (KL25Z), запускающая простую программу, поэтому она не мешает линии сброса, и я могу видеть мой SKEAZN64 с OpenOCD и играть с ним, но, к сожалению, он не может запрограммировать его. Программное обеспечение Kinetis Design Studio (KDS) не будет прошивать мой Kinetis, потому что оно говорит, что оно защищено, и мне нужно выполнить массовое стирание, но OpenOCD (как часть KDS), похоже, не знает, как это сделать. Мастер-версия git OpenOCD, которую я построил на своем Mac, понимает Kinetis, но не конкретную серию KEA, поэтому я вернулся к исходной точке.
Возвращаясь к J-Link ...
У @AdamHaun была действительно хорошая подсказка, и если я установлю тип сброса J-Link (команда rsettype) на тип '6' (Kinetis), J-Link должен отключить сторожевой таймер после сброса ядра. Глядя на регистр WDOG_CS1 (0x40052000), кажется, что это так, но все еще нет игральных костей. Операция стирания, кажется, сбивается с компьютера при 0xfffffffe и код ошибки -5, а команда «unlock kinetis» работает только в том случае, если я отключаю вывод сброса с помощью SIM_SOPT (путем записи 32-битного значения от 0x00000008 до 0x40048004). К сожалению, если я это сделаю, то процессор не сможет снова остановиться, предположительно потому, что интерфейс SWD не может использовать линию сброса, чтобы принудительно установить DAP SWD в известное состояние.
20150103 изменить:
У меня мигает светодиод
ПОВТОРЕНИЕ
У меня мигает светодиод
Версия TL; DR: поместите образ USBDM на плату FRDM-KL25Z (история сама по себе), используйте автономное приложение ARM Programmer для отправки тестового файла .elf на плату. Силовой цикл и вуаля.
Длинная версия появится позже. Теперь у меня осталось менее 48 часов, чтобы написать и отладить программное обеспечение для этой платы KEAZN64, завершить модификацию / тестирование другого программного обеспечения, которое идет с ним, и поработать над некоторой документацией для другого клиента. Я обещаю , что будет обновлять этот вопрос с развернутым ответом. Я просто хотел поделиться своим успехом. Спасибо ВСЕМ за вашу помощь. Возможно, мне придется поговорить с модами, потому что я действительно хотел бы отдать награду нескольким из вас, в частности.
Ответы:
Я не могу найти никаких логических ошибок в вашей процедуре, но вот несколько советов:
есть также регистр FTMRH_FERSTAT (в 4002_0007h). Он должен сказать вам, что пошло не так ... но только в случае четности (или ошибок двойной четности). Я не уверен, что это что-то запишет на случай или удалит ошибки, но, вероятно, стоит проверить.
в документации KEA также упоминается, что прерывание может быть вызвано ошибками флэш-памяти (раздел «18.3.5 Прерывания флэш-памяти и EEPROM»). Я не знаю, происходит ли это, когда SEGGER стирает его, но это правдоподобное объяснение того, почему компьютер тоже меняется, поскольку вы видели ошибки, помеченные в регистре FSTAT. К сожалению, раздел документации KEA для контроллера прерываний («3.3.2 Конфигурация Nested Vectored Interrupt Controller (NVIC)») довольно смутно указывает в сторону веб-сайта ARM для полной документации. Я не смог выяснить, есть ли обработчик прерываний по умолчанию, настроенный (при загрузке) для ошибок флэш-памяти.
Вы выполняли стирание только на уровне секторов вручную, поэтому попробуйте вручную (например, самостоятельно записав соответствующий регистр) выполнить команду полного удаления флэш-памяти; единственный способ сделать это в одной команде - это «незащищенная команда флэш», описанная в разделе 18.3.9.10 (стр. 246) руководства. Это как «небезопасно» для устройства, так и для полной прошивки и стирания EEPROM. Вы можете опросить бит FSTAT (CCIF), чтобы увидеть, когда он предположительно завершен, и снова проверить флаги ошибок. РЕДАКТИРОВАТЬ: в руководстве также есть раздел «18.3.9.7 Команда« Удалить все блоки »».
попробуйте снизить частоту шины. Все, что выше 0,8 МГц, работает в соответствии с документацией. Я предлагаю это, потому что на форуме Freescale была одна тема, где внешняя вспышка работала нормально, но не выше определенной частоты, которая все еще находилась в хорошо документированном диапазоне. Таким образом, вполне возможно, что контроллер флэш-памяти в чипе ненадежен и не может работать на полном диапазоне указанных частот.
аналогично, твой другой чип. Не исключено, что с учетом того, сколько этих затрат (около 3 долларов) у вас плохая. Я помню, что у меня был встроенный чип x86, который работал нормально в большинстве случаев, но имел странные ошибки в некоторых инструкциях защищенного режима; моя проблема ушла с другим устройством той же марки. Мне не ясно, есть ли у Freescale (публично заявленные) степпинги и ошибки для этих устройств или нет.
Это все, что я могу придумать с точки зрения предложений по отладке, о которых не говорили другие на этой странице.
20150103 редактирование (я):
(Перемещенный материал здесь из моих комментариев и расширен)
Кажется, что не все серии Kinetis (официально, по крайней мере) протестированы со всеми флешерами. Довольно новая серия EA, которую вы на самом деле используете, кажется, официально поддерживается только собственной флеш-памятью Freescale / OEM Cyclone MAX; это единственный из перечисленных на странице Freescale для EA serires . Теперь, для старых Kinetis, таких как KL0, список намного длиннее, включая SEGGER . Я не знаю, просто ли это из-за отсутствия тестирования других флешеров для серии EA, или есть какая-то программная причуда, о которой знает только их Cyclone MAX. Я надеялся, что, возможно, это всего лишь Freescale, который медлит с перечислением других флешеров, но после проверки руководства по J-link (надеюсь, правильный), там нет ни серии Kinetis E или EA, перечисленной там (стр. 249), как протестированные, но только устройства Kinetis K10-K60 (и некоторые старые MAC7).
Стоит отметить, что программное обеспечение / прошивка PExDrv для Cyclone MAX имеет пакет обновления (v10.3) от 20.03.2014, который «добавляет поддержку производных MKE04Z64, MKE04Z128, MKE06Z64, MKE06Z128, SKEAZ64 и SKEAZ128». Еще одна подсказка - это то, что Freescale предлагает программное обеспечение с открытым исходным кодом загрузчика / флэш - загрузчика для Kinetis.Несмотря на то, что обновление было сделано совсем недавно в 12/2014, оно не отображает список поддерживаемых устройств серии E или EA [sub]. Так что я думаю, что между прошивками серии E / EA и другими Kinetis, такими как K10, есть что-то совершенно иное, хотя я понятия не имею, в чем именно заключается эта разница. Поэтому я думаю, что ожидать, что прошивка EA будет работать автоматически с чем угодно, кроме Cyclone MAX, вероятно, нереально в данный момент. Возможно, вы сможете в конечном итоге выяснить, как это сделать на уровне «голого металла» (прямые команды регистрации) из документации серии EA, но я согласен, что документация довольно тупая; в нем, безусловно, отсутствуют какие-либо пошаговые инструкции, являющиеся просто справочным руководством. Если бы загрузчик / flashloader с открытым исходным кодом Freescale поддерживал серию E / EA, вы
Ваш эксперимент с FRDM-KL25Z (который поставляется с серией Kinetis L) указывает в одном направлении, т. Е. Вы не можете поменять серию L на серию EA и использовать один и тот же флешер (в данном случае OpenSDA).
И если вы похожи на Кейта (блогера), который «считает [$] 100 долларов для программиста смехотворным», вы, вероятно, не будете удовлетворены перспективой понизить $ 900 + на этом Циклоне. Я не знаю, делает ли Freescale это специально для того, чтобы обуздать своих автомобильных покупателей или что ... Конечно, странно выглядит то, что инструменты для большинства серий Kinetis не работают с E / EA.
Также имейте в виду, что функция прошивки OpenSDA работает только под MS Windows .
Если вы хотите попробовать (взломать) больше плат, лучше подойдет одна с Kinetis серии E, например FRDM-KE02Z (13 долларов в Digi-Key); также использует OpenSDA, поэтому он может быть взломан. Насколько я могу судить, они не делают / продают доски с серией EA. Однако, похоже, что вы не можете использовать один процессор / плату OpenSDA для программирования другого типа Kinetis, чем тот, который установлен на его собственной плате , даже если оба процессора относятся к одной и той же (например, L) серии, но с разными номерами.
К сожалению, «Open» в OpenSDA означает только то, что спецификация SDA открыта, а не то, что они выдают исходный код как open-source; поэтому я даже не могу найти исходный код для программирования вспышки серии E.Видимо, я только наполовину прав насчет этого. OpenSDA v1 не с открытым исходным кодом, но v2 .Итак, вот пример с OpenSDAv2 . Это в основном просто CMSIS-DAP / mbed загрузчик и флешер. Так что он может не иметь тех же функций или поддерживать те же микросхемы, что и v1 ... и это действительно так, потому что flash_features.h не перечисляет ни одного MKE (Kinetis E-series), не говоря уже о SKE (EA-series) устройства. Таким образом, предложение Freescale для серии EA выглядит следующим образом: купите наш флешер Cyclone за 900 долларов или удачи в написании своего собственного из любых незавершенных частей открытого кода, которые мы выпустили.
Оказывается, однако, что есть проект с открытым исходным кодом, который может программировать по крайней мере E-серии Kinetis, а именно USBDM . Соответствующий бит из его журнала изменений :
И, судя по этой записи в журнале, E-серии выглядят странно. Для EA-серии (SKE) прямой поддержки нет, но эта кодовая база, вероятно, является лучшим выбором, если вы хотите взломать свой собственный флешер; или, возможно, вы можете убедить автора USBDM добавить поддержку серии EA (SKE). В качестве аппаратного обеспечения для USBDM оказывается, что вы можете использовать FRDM-KL25Z, который вы уже приобрели; но вам все равно придется взломать программное обеспечение USBDM для поддержки чипов SKE.
Основной файл конфигурации для USBDM выглядит довольно устрашающе. В USDBM для разных устройств серии MKE используются разные флешеры (базы кодов): то, что называется «FTMRE», используется для MKE04 и MKE06, а «FTMRH» используется для MKE02. Кратко изучив две кодовые базы, вы почти наверняка захотите кодовую базу FTRMH, а не FTRME. Последний имеет структуру FTMRH, отличную от вашего устройства SKEA64, например, делитель тактовых импульсов - это не первое, а 4-е поле. FTRME также устанавливает для шины FIDV значение 0x17 = 24 МГц, что кажется недопустимым для вашего чипа (стр. 224 в руководстве KEA64 предлагает максимальные 20 МГц). FTMRH устанавливает его в 0x0F = 16 МГц (как вы делаете), что кажется нормальным.
На данный момент (если вы не хотите покупать Cyclone MAX), вам лучше всего связаться с Podonoghue, чтобы ваш чип работал с его базой кода. Он, кажется, активен и вполне готов помочь с новыми устройствами (на форуме freescale) .
Также из этого исходного кода USDBM я могу предсказать, что ваш SEGGER не сможет правильно прошить свой SKEA, если он не получит свое собственное обновление прошивки. Почему я так говорю? Поскольку кодовая база USDBM FTMRH используется там только одним устройством, MKE02, о котором ваш SEGGER, похоже, ничего не знает (основываясь на его руководстве). Другие, более распространенные устройства, такие как серии Kinetis L и K, используют другую флеш-карту USDBM, основанную на кодовой базе FTFA. Если вы посмотрите на код FTFA , структура регистров контроллера флэш-памяти (также начинающаяся с 0x40020000) для них будет другой; первое поле - это даже не делитель часов, а статистический регистр и т. д. «Отличный» способ для Freescale создавать несовместимые устройства ... но, несомненно, благо для производителей флешеров.
источник
Вы пробовали это: Разблокировка и стирание FLASH с Segger J-Link
Предположительно, вы должны:
Что мне показалось интересным, так это то, что вы должны разблокировать его и стереть на следующем шаге, если вы хотите, чтобы разблокировка была постоянной:
EDIT1: добавлены неверные данные.
EDIT2: вы можете прочитать реестр Flash Security (FSEC)? Ты пробовал?
EDIT3: из использования функций безопасности и защиты флэш-памяти Kinetis, ред. 1, 6/2012
Также я наткнулся на посты, в которых упоминаются разные семейства кинетиков, требующие разных манипуляций с сигналом RESET при попытке чтения / записи регистра MDM-AP.
EDIT4: вы пытались добавить сильное подтягивание SWD_DIO? Это выстрел в темноте, но Freescale рекомендует его.
источник
Вы должны остановить процессор в первую очередь. Очевидно, что вы получаете симптом работающего процессора. Я использую openocd; перед прошивкой устройства использую команду "reset halt". Эта «остановка» является подкомандой «сброса» для остановки сразу после сброса, в то время как есть и отдельная команда остановки.
Так что ищите команду «reset halt», просто остановки будет недостаточно, потому что вам нужно перейти в состояние предварительной инициализации векторов, я полагаю.
источник
Я еще не упоминал об этом, поэтому я продолжу и предположу, что проблема в том, что эта часть имеет кеш, который включен при перезагрузке. Это согласуется с «странным» поведением, которое вы наблюдали при пустой проверке. Основной Flash был обновлен, но кеш не был. Чтобы это исправить, отключите кеш данных и инструкций, записав в
MCM_PLACR
at,F000_300Ch
а также очистите кеш, как вы это делаете. Это то же самое странное поведение, вероятно, сбило с толку и Сеггера.источник
Так как сообщение об ошибке касается значения ПК, звучит так, будто процессор куда-то сходит с рельсов. Это длинный выстрел, но вы пытались отключить сторожевой таймер?
источник