55297

[i] Стирание некорректной программы из внутренней Flash-памяти МК MDR1206FI/AFI и К1986ВК025

Дата последнего изменения: 25.09.2024 10:28:01
Может произойти ситуация, когда после загрузки программы МК перестаёт определяться по интерфейсу JTAG. Как правило, связь с отладчиком нарушается из-за некорректных действий загруженной программы: выполнена некорректная инициализация тактирования ядра или перенастроены выводы, совмещенные с интерфейсом JTAG. Для восстановления связи с отладчиком при использовании стандартной загрузочной программы необходимо на выводах MODE[1:0] задать режим работы "UART-загрузчик", подробнее описано в статье [i] МК не определяется по интерфейсу JTAG/SWD. Восстановление работы МК.

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

Содержание

1. Стирание некорректной программы с помощью OpenOCD
2. Режимы сброса МК в mdr_recovery
3. Использование mdr_recovery

1. Стирание Flash-памяти с помощью OpenOCD

В штатном режиме OpenOCD при подключении к МК выполняет ряд проверок, в ходе которых определяется возможность дальнейшего взаимодействия. Если МК корректно отвечает на все команды, то появляется возможность остановить ядро и выполнить программирование Flash-памяти. Однако в случае некорректных действий загруженной программы связь по интерфейсу JTAG может быть нарушена, из-за чего OpenOCD не сможет подключиться к МК.

Чтобы корректно выполнить подключение к МК, необходимо остановить ядро до того, как загруженная программа нарушит связь по интерфейсу JTAG. OpenOCD предоставляет обширный функционал для низкоуровнего взаимодействия с подсистемой отладки МК, поэтому имеется возможность выполнить максимально быструю остановку ядра, отправляя соответствующие команды по интерфейсу JTAG.

Для данного случая в сборку OpenOCD от АО "ПКК Миландр" был добавлен скрипт mdr_recovery, который после выполнения сброса МК в ручном режиме выполняет остановку ядра, пока некорректная программа не успела запуститься. Если остановка ядра прошла успешно, то выполняется стирание заданной области Flash-памяти.

На данный момент скрипт mdr_recovery поддерживает МК, построенные на базе ядра RISC-V: MDR1206FI, MDR1206AFI и К1986ВК025.

2. Режимы сброса МК в mdr_recovery

Остановка ядра возможна только в интервал времени до запуска некорректной программы, поэтому перед остановкой ядра требуется выполнить сброс МК. Так как на плате схема сброса может быть реализована разными способами, то скрипт mdr_recovery имеет несколько режимов сброса МК:

  • auto: автоматически сбрасывает МК с помощью отладчика по выводу SRST, который настроен в режим push-pull (если он поддерживается отладчиком);
  • auto_open_drain: автоматически сбрасывает МК с помощью отладчика по выводу SRST, который настроен в режим открытого стока;
  • manual: требует ручного сброса МК в течение 5 секунд после запуска скрипта (при частоте JTAG 400 кГц).

При использовании режимов auto и auto_open_drain выполняется сброс МК с помощью отладчика по выводу SRST, отличается только настройка вывода SRST.

В режиме auto вывод SRST настраивается в режим push-pull, если он поддерживается отладчиком (например, ft2232hl), в противном случае SRST настраивается в режим открытого стока. При настройке вывода SRST в режим push-pull сигнал сброса имеет быстрый фронт, таким образом точно известен момент времени, когда МК вышел из сброса, что позволяет максимально быстро выполнить остановку ядра. Однако перед использованием данного режима необходимо проверить, что на плате не будет конфликта драйверов на линии SRST, например, от супервизора, в противном случае необходимо использовать режим auto_open_drain или manual.

В режиме auto_open_drain вывод SRST настраивается в режим открытого стока. В данном случае фронт сигнала сброса будет определяться внешним резистором подтяжки к питанию на плате, поэтому точный момент выхода МК из сброса неизвестен. Чтобы выполнить остановку ядра сразу после выхода МК из сброса, скрипт mdr_recovery выполняет подключение к МК после снятия активного уровня сигнала сброса в интервале от 0 до 10 мс с шагом 1 мс. На каждом шаге выполняется 20 попыток подключения к МК с целью остановки ядра, так как время между снятием сброса и моментом подключения к МК немного варьируется от загруженности хост-системы.

Если в автоматическом режиме остановить ядро не получается, то необходимо использовать режим сброса manual. В данном режиме после запуска скрипта в течение 5 секунд (при частоте JTAG 400 кГц) выполняется непрерывная отправка команд остановки ядра. В течение данного интервала необходимо вручную выполнить сброс МК, например, по нажатию на кнопку RESET, если она предусмотрена на плате. Таким образом после выхода МК из сброса сразу же будут приняты команды остановки ядра.

3. Использование mdr_recovery

Для использования скрипта mdr_recovery необходимо запустить OpenOCD из терминала со следующими параметрами:

Фрагмент кода 1 - Формат запуска mdr_recovery
$ [path_to_openocd]/openocd -f interface/<adapter>.cfg -f tools/mdr_recovery.tcl -c "<commands>"

Список поддерживаемых команд приведен в таблице 1.

Таблица 1 - Команды mdr_recovery
Команда Параметр Список доступных параметров Описание
help - - Получить справку, затем выйти
get_target_list - - Вывести список поддерживаемых МК с доступными областями Flash-памяти для стирания, затем выйти
set_target target MDR1206FI
MDR1206AFI
К1986ВК025
Выбрать МК, по умолчанию "MDR1206FI"
set_reset_mode mode auto
auto_open_drain
manual
Выбрать режим сброса, по умолчанию "auto"
set_adapter_speed freq - Установить тактовую частоту JTAG в кГц, по умолчанию 400 кГц
erase_flash flash_mem MDR1206FI: main, info
MDR1206AFI: main, info
К1986ВК025: main
Стереть выбранную область Flash-памяти

Необходимо учитывать, что в списке команд "erase_flash" обязательно должна быть последней.

Пример использования mdr_recovery для стирания основной области Flash-памяти MDR1206AFI с автоматическим сбросом:

Фрагмент кода 2 - Пример 1 использования mdr_recovery
$ [path_to_openocd]/openocd -f interface/ftdi/mdr-ft2232hl.cfg -f tools/mdr_recovery.tcl -c "set_target MDR1206AFI; erase_flash main"

Пример использования mdr_recovery для стирания информационной области Flash-памяти MDR1206FI с ручным сбросом:

Фрагмент кода 3 - Пример 2 использования mdr_recovery
$ [path_to_openocd]/openocd -f interface/ftdi/mdr-ft2232hl.cfg -f tools/mdr_recovery.tcl -c "set_reset_mode manual; erase_flash info" Сохранить статью в PDF

Программное обеспечение

Теги

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