[i] МК не определяется по интерфейсу JTAG/SWD. Восстановление работы МК

ID статьи: 48357
Дата последнего изменения: 25.09.2024 10:29:16
Материал из настоящей статьи, относящийся к микросхемам К1986ВЕ92QI и К1986ВЕ1QI, распространяется в том числе на микроконтроллеры К1986ВЕ92FI, К1986ВЕ92F1I, К1986ВЕ94GI и К1986ВЕ1FI, К1986ВЕ1GI
Может произойти ситуация, когда после загрузки программы МК перестаёт определяться по интерфейсу JTAG/SWD. Как правило, связь с отладчиком нарушается из-за некорректных действий загруженной программы, а именно:

1. Выполнена некорректная инициализация тактирования ядра, из-за чего ядро работает либо на частоте, превышающей предельно-допустимое значение, либо ядро вовсе не затактировано. Такое может произойти, например, если выполнить настройку тактирования от генератора HSE, предварительно не включив сам HSE. При этом ядро, обычно, отображается в настройках отладчика используемой IDE, но не работает прошивка памяти, и не удается войти в режим отладки.

2. В МК, в которых выводы интерфейса JTAG/SWD совмещены с выводами портов ввода-вывода общего назначения, ПО переключает выводы JTAG/SWD, из-за чего нарушается протокол обмена данными с отладчиком. Подробнее про это описано в пункте " 5. Особенности работы с выводами, совмещенными с JTAG".

В обоих случаях причиной потери связи с МК служат некорректные действия программы, загруженной во Flash-память. Во всех МК после подачи питания сначала выполняется загрузочная программа (bootloader), которая по состоянию выводов MODE определяет режим работы МК. В этот момент, если интерфейс JTAG/SWD разрешён, то МК успешно определяется отладчиком. Далее, если на выводах MODE установлен режим исполнения программы из внутренней Flash-памяти, то управление передаётся пользовательской программе. При исполнении пользовательской программы связь с отладчиком может быть нарушена, и МК перестанет определяться по JTAG/SWD.

Решением данной проблемы является изменение режима MODE, чтобы пользовательская программа не была запущена. Далее необходимо выполнить очистку Flash-памяти, чтобы стереть некорректное ПО. На рисунке 1 в качестве примера приведён запуск МК К1986ВЕ92QI в зависимости от режима MODE.


Рисунок 1 - Режимы запуска МК серии К1986ВЕ92QI

Подробная информация о настройке каждого МК для восстановления связи с отладчиком приведена в соответствующих разделах статьи.

Содержание

1. Восстановление работы МК К1986ВЕ92QI и К1901ВЦ1QI
2. Восстановление работы МК К1986ВЕ1QI
3. Восстановление работы МК К1986ВК214/234
4. Восстановление работы МК MDR1206FI/AFI и К1986ВК025
5. Особенности работы с выводами, совмещёнными с JTAG/SWD
6. Методы защиты от блокировки интерфейса отладки

1. Восстановление работы МК К1986ВЕ92QI и К1901ВЦ1QI

Перед сменой режима MODE[2:0] необходимо снять все источники напряжения питания, чтобы в батарейном домене сбросился бит FPOR. Для этого необходимо отключить:

Для восстановления связи с отладчиком необходимо установить режим работы "Микропроцессор в режиме отладки", MODE[2:0] = 010-011, в котором не происходит запуск программы из внутренней Flash-памяти. Отладка в данном режиме доступна только через интерфейс JTAG_B. После старта МК в данном режиме необходимо стереть внутреннюю Flash-память, например, встроенными средствами среды разработки.

Если на плате интерфейс JTAG_B не доступен, то можно воспользоваться режимом "UART-загрузчик без отладки", MODE[2:0] = 110. Доступ к МК в данном режиме осуществляется только по интерфейсу UART, интерфейс JTAG/SWD не доступен.

На основе статьи "[i] Прошивка программы в Flash и запуск через UART" можно реализовать свой "прошиватель" или "стиратель" Flash-памяти по UART.

Подробный процесс старта МК К1986ВЕ92QI и К1901ВЦ1QI описан в статье "[i] Запуск МК К1986ВЕ92QI и К1901ВЦ1QI".

2. Восстановление работы МК К1986ВЕ1QI

В данных МК интерфейс JTAG/SWD выведен на отдельные выводы, не совмещённые с выводами портов ввода-вывода общего назначения, поэтому их некорректно переопределить нельзя. Потеря связи с отладчиком может быть вызвана некорректной инициализацией тактирования ядра.

Перед сменой режима MODE[2:0] необходимо снять все источники напряжения питания, чтобы в батарейном домене сбросился бит FPOR. Для этого необходимо отключить:

Для восстановления связи с отладчиком необходимо установить режим работы "UART загрузчик", MODE[2:0]=100-110, в котором после старта загрузочной программы будет запущена подпрограмма "UART загрузчик", ожидающая приёма команд по UART. Интерфейс отладки JTAG/SWD в режиме работы "UART-загрузчик" также будет доступен.

После старта МК в одном из режимов необходимо стереть внутреннюю Flash-память, например, встроенными средствами среды разработки.

В режиме "UART-загрузчик" Flash-память доступна только в режиме регистрового доступа, поэтому операции стирания и программирования будут выполняться, однако операция верификации будет завершаться с ошибками, так как чтение осуществляется в обычном режиме по шине ITCM.
В режиме "UART-загрузчик", MODE[2:0] = 100-110, доступ к МК, помимо JTAG/SWD, может осуществляется по интерфейсу UART. На основе статьи "[i] Прошивка программы в Flash и запуск через UART" можно реализовать свой "прошиватель" или "стиратель" Flash-памяти по UART.

Подробный процесс старта МК К1986ВЕ1QI описан в статье "[i] Запуск МК К1986ВЕ1QI".

3. Восстановление работы МК К1986ВК214/234

Данные рекомендации приведены для стандартной загрузочной программы, описанной в спецификации. Если используется загрузочная программа собственной разработки, то запрет передачи управления программе, расположенной в основной области Flash-памяти, выполняется в соответствии с запрограммированной загрузочной программой.

Перед сменой режима MODE[1:0] необходимо снять все источники напряжения питания, чтобы в батарейном домене сбросился бит FPOR. Для этого необходимо отключить:

Для восстановления связи с отладчиком необходимо установить режим работы "UART-загрузчик", MODE[1:0] = 01, 10, в котором после старта загрузочной программы будет запущена подпрограмма "UART-загрузчик", ожидающая приёма команд по UART. Интерфейс отладки SWD в режиме работы "UART-загрузчик" также будет доступен.

После старта МК в данном режиме необходимо стереть внутреннюю Flash-память, например, встроенными средствами среды разработки.

В режиме "UART-загрузчик" Flash-память доступна только в режиме регистрового доступа, поэтому операции стирания и программирования будут выполняться, однако операция верификации будет завершаться с ошибками, так как чтение осуществляется в обычном режиме по шине AHB.
В режиме "UART-загрузчик", MODE[1:0] = 01, 10, доступ к МК, помимо SWD, может осуществляется по интерфейсу UART. На основе статьи "[i] Прошивка программы в Flash и запуск через UART" можно реализовать свой "прошиватель" или "стиратель" Flash-памяти по UART.

Подробный процесс старта МК К1986ВК214/234 описан в статье "[i] Запуск МК К1986ВК214/234".

4. Восстановление работы МК MDR1206FI/AFI и К1986ВК025

Данные рекомендации приведены для стандартной загрузочной программы, описанной в спецификации. Если используется загрузочная программа собственной разработки, то запрет передачи управления программе, расположенной в основной области Flash-памяти, выполняется в соответствии с запрограммированной загрузочной программой.

Если на плате нет возможности изменить режим MODE[1:0], либо используется загрузочная программа собственной разработки, то можно выполнить стирание внутренней Flash-памяти с помощью OpenOCD, как приведено в статье "[i] Стирание некорректной программы из внутренней Flash-памяти МК MDR1206FI/AFI и К1986ВК025".

Перед сменой режима MODE[1:0] необходимо снять все источники напряжения питания, чтобы в батарейном домене сбросился бит FPOR. Для этого необходимо отключить:

Для восстановления связи с отладчиком необходимо установить режим работы "UART-загрузчик", MODE[1:0] = 01, 10, в котором после старта загрузочной программы будет запущена подпрограмма "UART-загрузчик", ожидающая приёма команд по UART. Интерфейс отладки JTAG в режиме работы "UART-загрузчик" также будет доступен.

После старта МК в данном режиме необходимо стереть или перепрограммировать внутреннюю Flash-память, например, встроенными средствами среды разработки.

В режиме "UART-загрузчик", MODE[1:0] = 01, 10, доступ к МК, помимо JTAG, может осуществляется по интерфейсу UART. На основе статьи "[i] Прошивка программы в Flash и запуск через UART" можно реализовать свой "прошиватель" или "стиратель" Flash-памяти по UART.

5. Особенности работы с выводами, совмещёнными с JTAG/SWD

Наиболее часто нарушение связи с отладчиком происходит из-за записи в биты регистров RXTX и OE выводов, совмещённых с JTAG/SWD. Согласно спецификации, раздел "Порты ввода-вывода":

"При работе в режиме отладки не допускается изменение функций записью 1 в регистры RXTX и OE выводов, совмещенных с выводами JTAG. Это может привести к блокировке интерфейса отладки.".

Поэтому в биты регистров RXTX и OE, которые используются интерфейсом JTAG/SWD, необходимо записывать всегда 0. Также не допускается изменение функции выводов, совмещённых с JTAG/SWD. Остальные выводы порта, неиспользуемые JTAG/SWD, можно использовать в пользовательской программе.

Необходимо обратить внимание на наиболее распространённые операции с регистрами контроллера порта ввода-вывода, которые приводят к блокировке интерфейса отладки.

1. Запись в регистры RXTX и OE с помощью операции типа "чтение-модификация-запись" (|=, &=, ^=), примеры приведены во фрагменте кода 1.

Фрагмент кода 1 – Некорректное изменение состояния выводов, которые НЕ совмещены с JTAG/SWD

MDR_PORTx->RXTX |= 1<<10; // Некорректная установка бита 10, который НЕ используется JTAG/SWD

MDR_PORTx->RXTX ^= 1<<14; // Некорректное переключение бита 14, который НЕ используется JTAG/SWD

MDR_PORTx->RXTX &= ~(1<<12); // Некорректный сброс бита 12, который НЕ используется JTAG/SWD

Операции, приведённые во фрагменте кода 1, выполняются в несколько действий: чтение-модификация-запись. Сначала считывается значение из регистра, при этом в этот момент на выводах, совмещённых с JTAG/SWD, может быть считана единица! Далее считанное значение модифицируется в соответствии со значением в правой части выражения, считанная единица в бите, используемом интерфейсом отладки, сохраняется. Выполняется запись модифицированного выражения, что приводит к блокировке отладки, хотя явно биты, совмещённые с JTAG/SWD, не изменялись.

Чтобы неявное изменение бит не происходило, к считанному значению необходимо применить маску, обнуляющую биты выводов, совмещённых с JTAG/SWD, такие примеры приведены во фрагменте кода 2.

Фрагмент кода 2 – Корректное изменение состояния выводов, которые НЕ совмещены с JTAG/SWD

MDR_PORTx->RXTX = (MDR_PORTx->RXTX & (~PORT_JTAG_Msk)) | 1<<10; // Корректная установка бита 10, который НЕ используется JTAG/SWD

MDR_PORTx->RXTX = (MDR_PORTx->RXTX & (~PORT_JTAG_Msk)) ^ 1<<14; // Корректное переключение бита 14, который НЕ используется JTAG/SWD

MDR_PORTx->RXTX = (MDR_PORTx->RXTX & (~PORT_JTAG_Msk)) & (~(1<<12)); // Корректный сброс бита 12, который НЕ используется JTAG/SWD

2. Для МК К1986ВЕ92QI и К1901ВЦ1QI использование режима BitBand с регистрами порта, в котором есть выводы, совмещённые с JTAG/SWD. BitBand реализует сброс/установку отдельных бит путём аппаратного выполнения операции типа "чтение-модификация-запись", только в отличие от пункта 1, шина на время выполнения всех действий заблокирована, и между отдельными операциями "чтение-модификация-запись" не происходит выполнение других инструкций, включая прерывание. Это дает атомарность переключения бита, но не решает проблему с выводами, совмещенными с JTAG. При аппаратном чтении также может быть возвращено не нулевое значение в битах, используемых JTAG/SWD, поэтому запись модифицированного значения может нарушить протокол взаимодействия с отладчиком.

6. Методы защиты от блокировки интерфейса отладки

Чтобы при тестировании программы интерфейс JTAG/SWD не оказался случайно заблокирован, можно воспользоваться несколькими простыми методами защиты.

1. Внесение задержки на пару секунд в начало функции main(), чтобы отладчик успел подключиться до того, как исполнение программы дойдёт до команд с некорректной инициализацией. Задержку можно реализовать в виде пустого цикла. В свойствах отладчика также необходимо выбрать подключение со сбросом. Тогда при подключении отладчик будет сбрасывать ядро и, пока происходит рестарт и исполнение введенной задержки, отладчик успеет остановить исполнение и выполнить необходимые задачи - загрузить FLM для программирования или зайти в режим отладки. Далее в режиме отладки по шагам можно найти инструкции, при которых происходит сбой, и диагностировать причину.

Это превентивная мера, задержку полезно использовать на начальной стадии реализации ПО, когда выполняется настройка тактирования и выводов GPIO. После отладки задержку необходимо удалить, чтобы не задерживать старт программы.

Рекомендованные настройки программатора представлены в статье - "[i] Настройки проекта на примере К1986ВЕ1QI", раздел "Настройки программатора".

2. В функциях SPL для работы с портами ввода-вывода введена программная защита, которая при помощи маски автоматически обнуляет биты, используемые JTAG/SWD. Защита активируется в файле "SPL_PREFIX_config.h" путём раскомментирования соответствующего макроопределения:

Файл "SPL_PREFIX_config.h" по умолчанию защищен от редактирования. Для изменения файла в "свойствах" необходимо снять галочку с атрибута "Только чтение".
3. В МК К1901ВЦ1QI, К1986ВК214/234, MDR1206FI/AFI и К1986ВК025, в которых выводы интерфейса отладки совмещены с выводами портов ввода-вывода, для установки и сброса отдельных бит в регистре RXTX рекомендуется использовать специальные регистры установки SET и сброса CLR бит. Данные регистры позволяют установить и сбросить отдельные биты путём выполнения только операции записи, а не операции типа "чтение-модификация-запись".

Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55