24454

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

Дата последнего изменения: 14.07.2021 08:22:03
Может произойти ситуация, когда после загрузки программы МК перестаёт определяться по интерфейсу JTAG/SWD. Как правило, связь с отладчиком нарушается из-за некорректных действий загруженной программы, а именно:

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

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

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

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

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

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

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

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

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

Более подробно данный вариант стирания записанного ПО описан в статье "Восстановление работы МК 1986ВЕ93У на отладочной плате".

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

Для МК серии 1986ВЕ9х стирание, программирование и верификацию внутренней Flash-памяти можно осуществить с помощью утилиты «1986UARTWSDL», предоставленной пользователем Vasili на форуме.

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

Подробный процесс старта МК 1986ВЕ9х и 1901ВЦ1Т описан в статье «Запуск МК 1986ВЕ9х и 1901ВЦ1Т».

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

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

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

  • основное питание Ucc;
  • батарейное питание BUcc, если есть батарейка (не соединено с Ucc);
  • отключить программатор, иначе он может запитать часть схемы, и батарейный домен сохранит своё состояние.
Для восстановления связи с отладчиком необходимо установить один из режимов работы:

1) «Микроконтроллер с режимом отладки», MODE[2:0] = 000, при этом также необходимо задать на выводе ITCMLAEN напряжение низкого уровня, чтобы старт МК выполнялся из внешней памяти.

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

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

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

Стирание, программирование и верификацию внутренней Flash-памяти можно осуществить с помощью утилиты «1986BE1UARTWSD», предоставленной пользователем Vasili на форуме.

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

Подробный процесс старта МК 1986ВЕ1Т и 1986ВЕ3Т описан в статье «Запуск МК 1986ВЕ1Т и 1986ВЕ3Т».

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

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

  • основное питание Ucc;
  • батарейное питание BUcc, если есть батарейка (не соединено с Ucc);
  • отключить программатор, иначе он может запитать часть схемы, и батарейный домен сохранит своё состояние.

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

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

В режиме «UART загрузчик» Flash-память доступна только в режиме регистрового доступа, поэтому операции стирания и программирования будут выполняться, однако операция верификации будет завершаться с ошибками, так как чтение осуществляется в обычном режиме по шине AHB.

В режиме «UART загрузчик», MODE[1:0] = 01, 10, доступ к МК, помимо SWD, может осуществляется по интерфейсу UART. 

Стирание, программирование и верификацию внутренней Flash-памяти МК 1986ВЕ4У можно осуществить с помощью утилиты «1986VE4WSD», предоставленной пользователем Vasili на форуме.

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

Подробный процесс старта МК 1986ВЕ4У и К1986ВК214/234 описан в статье «Запуск МК 1986ВЕ4У и К1986ВК214/234».

4. Особенности работы с выводами, совмещёнными с 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. Использование режима BitBand с регистрами порта, в котором есть выводы, совмещённые с JTAG/SWD. BitBand реализует сброс/установку отдельных бит путём аппаратного выполнения операции типа «чтение-модификация-запись», только в отличии от пункта 1, шина на время выполнения всех действий заблокирована, и между отдельными операциями "чтение-модификация-запись" не происходит выполнение других инструкций, включая прерывание. Это дает атомарность переключения бита, но не решает проблему с выводами, совмещенными с JTAG. При аппаратном чтении также может быть возвращено не нулевое значение в битах, используемых JTAG/SWD, поэтому запись модифицированного значения может нарушить протокол взаимодействия с отладчиком.

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

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

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

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

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

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

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

Теги

Была ли статья полезной?