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

Мне нужна помощь с правильной инициализацией и запуском команд GDB / OpenOCD (внешние инструменты) для использования в Eclipse для отладки флэш-памяти и ОЗУ, а также с правильными модификациями или дополнениями, которые необходимо включить в make-файл для создания флэш-памяти и ОЗУ. для этого MCU, если это имеет значение конечно.

MCU: STM32F103VET6

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

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

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

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

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


person user690605    schedule 04.04.2011    source источник


Ответы (3)


Я работаю с той же цепочкой инструментов для программирования и отладки платы 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 debug (Native) я создаю новую конфигурацию, даю ей имя Project (необязательно) и абсолютный путь к двоичному файлу, который я хочу запрограммировать. На вкладке «Отладчик» я установил отладчик на Встроенный 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, сколько у вас точек останова и наблюдения. В разделе 20.3 руководства Open OCD говорится, что GDB не может запрашивать эту информацию, так что я говорю это сам. Следующая строка дает команду GDB подключиться к удаленной цели на локальном хосте через порт 3333. Последняя строка - это команда монитора, которая сообщает GDB передать команду цели, не предпринимая никаких действий. В данном случае целью является OpenOCD, и я даю ему команду halt. После этого я приказываю OpenOCD перейти в асинхронный режим работы. Поскольку некоторые из следующих операций требуют времени, полезно не блокировать OpenOCD и ждать каждой операции.

Дополнительное примечание №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, чтобы узнать, может ли он найти флеш-модуль и сообщить правильный адрес. Если он отвечает, что нашел флеш-память по адресу 0x08000000, значит, все в порядке. 0 в конце указывает, что нужно получить информацию о флэш-банке 0.

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

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

monitor mdw 0x40022020

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

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

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

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

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

Примечание № 5: Удаление бита из флэш-памяти означает установку его на 1.

Программирование вашего двоичного файла

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

Отладка GDB

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

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


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

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

person spade78    schedule 29.10.2011
comment
Отличный ответ! К сожалению, в большинстве руководств по OpenOCD объясняется только, как его установить. Между прочим, вы процитировали раздел руководства OpenOCD 20.3, но теперь он 21.3. Для людей, которые не работают с Eclipse, легко написать сценарий команд gdb с gdb -ex "commands here" - person Étienne; 01.06.2013
comment
Уважаемый @ spade78, я вижу, что вы хорошо разбираетесь в OpenOCD. Взгляните на мою проблему: stackoverflow.com/questions/38033130/. За это есть открытая награда. Надеюсь, ты сможешь мне помочь. - person K.Mulier; 17.07.2016

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

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

Когда я добавил «целевой сброс» в поле «Выполнить» программы установки отладчика Eclipse, внезапно все заработало. У меня не было этой проблемы с Kinetis K60.

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

person Mike Jones    schedule 30.03.2013

Что я использую после последнего предложения на вкладке Comannd - «Выполнить», это:

symbol-file STM3210CTest/test_rom.elf
thbreak main
continue

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

person German Ortiz    schedule 03.09.2012