[i] Стирание некорректной программы из внутренней Flash-памяти МК MDR1206FI/AFI и К1986ВК025
Если на плате нет возможности изменить режим на выводах 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