[i] МК не определяется по интерфейсу 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
Перед сменой режима MODE[2:0] необходимо снять все источники напряжения питания, чтобы в батарейном домене сбросился бит FPOR. Для этого необходимо отключить:
- основное питание Ucc;
- батарейное питание BUcc, если есть батарейка (не соединено с Ucc);
- отключить программатор, иначе он может запитать часть схемы, и батарейный домен сохранит своё состояние.
Если на плате интерфейс 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. Для этого необходимо отключить:
- основное питание Ucc;
- батарейное питание BUcc, если есть батарейка (не соединено с Ucc);
- отключить программатор, иначе он может запитать часть схемы, и батарейный домен сохранит своё состояние.
После старта МК в одном из режимов необходимо стереть внутреннюю Flash-память, например, встроенными средствами среды разработки.
Подробный процесс старта МК К1986ВЕ1QI описан в статье "[i] Запуск МК К1986ВЕ1QI".
3. Восстановление работы МК К1986ВК214/234
Данные рекомендации приведены для стандартной загрузочной программы, описанной в спецификации. Если используется загрузочная программа собственной разработки, то запрет передачи управления программе, расположенной в основной области Flash-памяти, выполняется в соответствии с запрограммированной загрузочной программой.
Перед сменой режима MODE[1:0] необходимо снять все источники напряжения питания, чтобы в батарейном домене сбросился бит FPOR. Для этого необходимо отключить:
- основное питание Ucc;
- батарейное питание BUcc, если есть батарейка (не соединено с Ucc);
- отключить программатор, иначе он может запитать часть схемы, и батарейный домен сохранит своё состояние.
Для восстановления связи с отладчиком необходимо установить режим работы "UART-загрузчик", MODE[1:0] = 01, 10, в котором после старта загрузочной программы будет запущена подпрограмма "UART-загрузчик", ожидающая приёма команд по UART. Интерфейс отладки SWD в режиме работы "UART-загрузчик" также будет доступен.
После старта МК в данном режиме необходимо стереть внутреннюю Flash-память, например, встроенными средствами среды разработки.
Подробный процесс старта МК К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. Для этого необходимо отключить:
- основное питание Ucc;
- батарейное питание BUcc, если есть батарейка (не соединено с Ucc);
- отключить программатор, иначе он может запитать часть схемы, и батарейный домен сохранит своё состояние.
Для восстановления связи с отладчиком необходимо установить режим работы "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" путём раскомментирования соответствующего макроопределения:
- К1986ВЕ92QI, К1901ВЦ1QI: файл "MDR32FxQI_config.h", макроопределение USE_JTAG_A или USE_JTAG_B;
- MDR1206FI/AFI, К1986ВК025: файл "MDR32VF0xI_config.h", макроопределение USE_JTAG;
- К1986ВК214/234: файл "MDR32F2xQI_config.h", макроопределение USE_SWD.