Команды STM32 GDB/OpenOCD и инициализация для отладки Flash и Ram

Я ищу помощь с правильными командами инициализации и запуска GDB/OpenOCD (внешние инструменты) для использования в Eclipse для отладки flash и ram, а также правильные изменения или дополнения, которые необходимо включить в файл make для flash vs ram для этого mcu, если это имеет значение, конечно.

mcu: STM32F103VET6

Я использую Eclipse Helios с Zylin Embedded CDT, Yagarto Tools и Bins, OpenOCD.4 и имеет адаптер Olimex ARM-USB-OCD Jtag.

Я уже настроил ARM-USB-OCD и добавил его в качестве внешнего инструмента в Eclipse. Для инициализации OpenOCD я использовал следующую команду в Eclipse. Файл конфигурации платы ссылается на stm32 mcu:

"openocd -f interface/olimex-arm-usb-ocd-h.cfg -f board/stm32f10x_128k_eval.cfg"

Когда я запускаю это в Eclipse, все работает (интерфейс GDB, OpenOCD находит mcu и т.д.). Я могу также telnet в OpenOCD и запускать команды. Итак, я застрял на следующей части; инициализация и команды для отладки flash и ram, а также стирание флеш-памяти.

Я прочитал несколько руководств и просмотрел сеть, но не смог найти ничего особенного для этого процессора. Я новичок в этом, поэтому я мог бы не признать эквивалентный продукт для примера.

JimT

Ответ 1

Я работаю с одной и той же цепочкой инструментов для программирования и отладки платы STM32F107. Ниже приведены мои наблюдения, чтобы получить чип STM32Fxxx, запрограммированный и отлаженный под этой инструментальной цепочкой.


Начальная точка запуска

Итак, на данный момент у вас есть рабочее соединение OpenOCD с ARM-USB-OCD, и поэтому вы должны быть настроены на этом. Теперь работа заключается в получении комбинации Eclipse/Zylin/Yagarto GDB для правильного общения с STM32Fxxx через соединение OpenOCD/Olimex. Следует иметь в виду, что все команды OpenOCD для выдачи - это команды режима запуска. Сценарии конфигурации и параметры командной строки для вызова сервера OpenOCD являются командами режима конфигурации. После того, как вы выдаете команду init, сервер переходит в режим запуска, который открывает набор команд, которые вам понадобятся. Вы, вероятно, сделали это где-то еще, но я придерживаюсь опции "-c" init, когда я вызываю сервер OpenOCD следующим образом:

openocd -f /path to scripts/olimex-arm-usb-ocd-h.cfg -f /path to targets/stm32f107.cfg -c "init"

Следующие команды, которые я выдаю дальше, выполняются диалогом Eclipse Debug Configurations. В разделе отладки Zylin Embedded (Native) я создаю новую конфигурацию, даю ей имя, Project (необязательный) и абсолютный путь к двоичному файлу, который я хочу запрограммировать. На вкладке "Отладчик" я установил отладчик в Embedded GDB, укажу на двоичный путь Yagarto GDB, не установил командный файл GDB, установил команду GDB на Стандарт, а протокол - mi.


Вкладка "Команды" - подключение GDB к OpenOCD

Итак, следующая вкладка - это вкладка "Команды" и то, где лежит проблема. У вас есть два пространства инициализации и запуска. Не уверен точно, в чем разница, кроме как предположить, что они происходят до и после вызова GDB. В любом случае я не заметил разницы в том, как мои команды запускаются.

Но в любом случае, следуя примерам, которые я нашел в сети, я заполнил поле Initialize следующими командами:

set remote hardware-breakpoint limit 6
set remote hardware-watchoint-limit 4
target remote localhost:3333
monitor halt
monitor poll

Первые две строки говорят GDB, сколько точек останова и точек наблюдения у вас есть. Open OCD Manual Section 20.3 говорит, что GDB не может запросить эту информацию, поэтому я рассказываю об этом сам. Следующая строка команд GDB для подключения к удаленной цели в локальном хосте через порт 3333. Последняя строка - это команда монитора, которая сообщает GDB передать команду на цель, не предпринимая никаких действий. В этом случае целью является OpenOCD, и я даю ему команду остановить. После этого я говорю OpenOCD переключиться на асинхронный режим работы. Поскольку некоторые из следующих операций занимают некоторое время, полезно не иметь блок OpenOCD и ждать каждой операции.

Sidenote # 1: Если вы когда-либо сомневались в состоянии GDB или OpenOCD, вы можете использовать консоль отладки Eclipse для отправки команд GDB или OpenOCD (через команды монитора GDB) после вызывая эту конфигурацию отладки.


Вкладка "Команды" - настройка пользовательской Flash

Далее приведены команды, которые я даю в разделе "Команды запуска":

monitor flash probe 0
monitor flash protect 0 0 127 off
monitor reset halt
monitor stm32x mass_erase 0
monitor flash write_image STM3210CTest/test_rom.elf
monitor flash protect 0 0 127 on
disconnect
target remote localhost:3333
monitor soft_reset_halt

объясняется в следующих разделах...

Настройка доступа к флэш-памяти пользователя

Сначала я выдаю запрос OpenOCD, чтобы узнать, может ли он найти модуль Flash и сообщить правильный адрес. Если он отвечает, что он нашел флеш-память по адресу 0x08000000, тогда мы хорошо. 0 в конце указывает на получение информации о банке вспышки 0.

Sidenote # 2: В спецификациях конкретных деталей STM32Fxxx есть карта памяти в разделе 4. Очень полезно держать под рукой во время работы с чипом. Кроме того, когда все будет доступно как адрес памяти, вы узнаете этот макет, как задняя часть вашей руки, после небольшого времени программирования!

Итак, подтвердив правильность настройки вспышки, мы вызываем команду на выключение защиты от записи на флеш-банк. PM0075описывает все, что вам нужно знать о программировании флэш-памяти. Для этой команды вам необходимо знать флэш-банк, начальный сектор, конечный сектор и включить или отключить защиту от записи. Банк флэш-памяти определен в файлах конфигурации, которые вы передали в OpenOCD, и подтвержден предыдущей командой. Поскольку я хочу отключить защиту для всего флэш-пространства, я указываю сектора с 0 по 127. PM0075 объясняет, как я получил этот номер, поскольку он относится к тому, как флэш-память организована на 2 КБ страницы для моего (и вашего) устройства. Мое устройство имеет 256 Кбайт вспышки, поэтому я имею 128 страниц. У вашего устройства 512 Кбайт флеш-памяти, поэтому у вас будет 256 страниц. Чтобы убедиться, что защита вашего устройства от записи была отключена должным образом, вы можете проверить регистр FLASH_WRPR по адресу 0x40022020 с помощью команды OpenOCD:

monitor mdw 0x40022020

Полученное слово, которое он печатает, будет 0xffffffff, что означает, что все страницы имеют защиту от записи. 0x00000000 означает, что на всех страницах включена защита от записи.

Sidenote # 3: В связи с командами памяти я дважды скрепил свой чип, когда я возился с байтами опции в блоке, начиная с адреса 0x1ffff800. В первый раз я установил защиту чтения на вспышку (как трудно понять, что вы делаете, если вы это сделаете), второй раз я установил сторожевой таймер, который не позволял мне ничего делать после того, как сторожевой таймер продолжал стрелять! Исправлено его использование команд доступа к памяти OpenOCD. Мораль истории: С великой силой приходит большая ответственность.... Или другое дело, что если я застрелю себя в ногу, я все равно смогу исправить ситуацию через JTAG.

Sidenote # 4: Одна вещь, которая случится, если вы попытаетесь записать в защищенную флеш-память, будет установлен бит FLASH_SR: WRPRTERR. OpenOCD сообщит о более удобном для пользователя сообщении об ошибке.

Стирание вспышки

Поэтому после отключения защиты от записи нам нужно удалить память, которую вы хотите запрограммировать. Я делаю массовое стирание, которое стирает все, у вас также есть возможность стереть по сектору или адресу (я думаю). В любом случае вам нужно сначала стереть сначала, прежде чем программировать, поскольку аппаратные средства сначала проверяют стирание, прежде чем разрешить запись. Если бит FLASH_SR: PGERR (0x4002200c) когда-либо устанавливается во время программирования, вы знаете, что еще не удалили этот фрагмент памяти.

Sidenote # 5: Стирание бит во флэш-памяти означает установку его на 1.

Программирование двоичного кода

Следующие две строки после стирания записывают двоичное изображение на флеш и восстанавливают защиту от записи. Существует не так много, чтобы сказать, что не охвачено PM0075. В принципе, любая ошибка, возникающая при выпуске flash write_image, вероятно, связана с отключением защиты от флэш-памяти. Вероятно, это НЕ OpenOCD, хотя, если вам интересно, вы можете включить вывод отладки и следовать тому, что он делает.

Отладка GDB

Итак, наконец, после программирования я отключу GDB от удаленного соединения, а затем снова подключу его к цели, сделаю soft- reset, и мой GDB теперь готов к отладке. Эта последняя часть, которую я только что выяснил прошлой ночью, когда я пытался понять, почему после программирования GDB не будет нормально останавливаться на main() после reset. Он продолжал уходить в сорняки и взрываться.

Мое современное мышление и то, что я читал в руководствах OpenOCD и GDB, заключается в том, что удаленное соединение, в первую очередь, предназначено для использования между GDB и целью, которая уже настроена и запущена. Ну, я использую GDB для настройки до того, как я запустил, поэтому я думаю, что таблица символов или какая-то другая важная информация перепуталась во время программирования. В руководстве OpenOCD говорится, что сервер автоматически сообщает память и символы, когда GDB подключается, но вся эта информация, вероятно, становится недействительной, когда микросхема запрограммирована. Отключение и повторное подключение Я думаю, что обновляет информацию, необходимую GDB для правильной отладки. Таким образом, это привело меня к созданию другой конфигурации Debug, которая просто соединяет и сбрасывает цель, поскольку мне не обязательно программировать чип каждый раз, когда я хочу использовать GDB.


Уф! Готово! Вид долго, но это заняло у меня 3 выходных дня, чтобы понять, так что не слишком ужасно плохо, я думаю...

Конечное оповещение:Во время моей отладки времени я обнаружил, что вывод отладки OpenOCD бесценен для меня, понимая, что делает OpenOCD под обложками. Чтобы запрограммировать микросхему STM32x, вам нужно разблокировать регистры вспышки, перевернуть правильные биты и записать только пол-слова за раз. Некоторое время я спрашивал, работает ли OpenOCD правильно, но, просмотрев вывод отладки OpenOCD и сравнивая его с инструкциями PM0075, я смог подтвердить, что он действительно выполнил правильные шаги для выполнения каждой операции. Я также обнаружил, что я дублировал шаги, которые уже делал OpenOCD, поэтому я смог вырезать инструкции, которые не помогли! Итак, мораль этой истории: вывод отладки - ваш друг!

Ответ 2

Я изо всех сил пытался заставить JLink работать с STM3240XX и нашел выражение в документации сервера JLink GDB, в котором говорится, что после загрузки флешки вы должны выдать "target reset":

"При отладке во флэш-памяти указатель стека и ПК устанавливаются автоматически, когда цель reset после загрузки флешки. Без reset после загрузки указатель стека и ПК должны быть инициализированы правильно, как правило, в файл .gdbinit."

Когда я добавил "target reset" в поле "Запуск" отладчика "Настройка Eclipse", внезапно все сработало. У меня не было этой проблемы с Kinetis K60.

В документе также объясняется, как вручную вручную установить указатель стека и ПК, если вы не хотите выпускать reset. Это может быть не disconnect/connect, который решает проблему, но reset.

Ответ 3

То, что я использую после последнего предложения на вкладке Comannd - "Run" Commands:

symbol-file STM3210CTest/test_rom.elf
thbreak main
continue

Предложение thbreak main - это то, что заставляет gdb останавливаться на главном.