Я работаю с той же цепочкой инструментов, чтобы программировать и отлаживать плату STM32F107. Ниже приведены мои наблюдения по программированию и отладке микросхемы STM32Fxxx с помощью этой цепочки инструментов.
Начальная начальная точка
Итак, на данный момент у вас есть работающее соединение OpenOCD с ARM-USB-OCD, и вы должны быть полностью настроены на этом конце. Сейчас ведется работа по получению комбинации Eclipse / Zylin / Yagarto GDB для правильной связи с STM32Fxxx через соединение OpenOCD / Olimex. Следует иметь в виду, что все команды OpenOCD, которые нужно выдать, - это команды run mode . Сценариями конфигурации и параметрами командной строки для вызова сервера OpenOCD являются команды mode mode . После того, как вы введете команду 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 на Standard , а протокол до ми .
Вкладка «Команды» - подключить GDB к OpenOCD
Итак, следующая вкладка - вкладка Commands , и в этом суть проблемы. У вас есть два пробела Инициализировать и Выполнить . Не уверен точно, в чем разница, кроме как предположить, что они происходят до и после вызова GDB. В любом случае, я не заметил разницы в том, как выполняются мои команды.
Но в любом случае, следуя примерам, которые я нашел в сети, я заполнил поле Initialize следующими командами:
set remote hardware-breakpoint limit 6
set remote hardware-watchoint-limit 4
target remote localhost:3333
monitor halt
monitor poll
Первые две строки сообщают GDB, сколько у вас точек останова и наблюдения. Открыть руководство OCD Раздел 20.3 говорит, что GDB не может запрашивать эту информацию, поэтому я говорю это сам. Следующая строка указывает GDB подключиться к удаленной цели на локальном узле через порт 3333. Последняя строка - это команда монитора , которая указывает GDB передать команду цели без каких-либо действий. В этом случае целью является OpenOCD, и я даю ему команду halt . После этого я говорю OpenOCD перейти в асинхронный режим работы. Поскольку выполнение некоторых из следующих операций занимает некоторое время, полезно не иметь блока OpenOCD и ждать каждой операции.
Sidenote # 1: Если вы когда-либо сомневаетесь в состоянии GDB или OpenOCD, вы можете использовать консоль отладки Eclipse для отправки команд в GDB или OpenOCD (через команды монитора GDB) после вызова эта конфигурация отладки.
Вкладка «Команды» - Настройка пользовательской вспышки
Далее приведены команды, которые я даю в разделе Выполнить :
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.
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
Поэтому после отключения защиты от записи нам нужно стереть память, которую вы хотите запрограммировать.Я делаю массовое стирание, которое стирает все, у вас также есть возможность стирать по секторам или адресам (я думаю).В любом случае вам нужно сначала удалить данные перед программированием, так как аппаратные средства сначала проверяют удаление перед тем, как разрешить запись.Если бит FLASH_SR: PGERR (0x4002200c) когда-либо установлен во время программирования, вы знаете, что вы еще не стерли этот фрагмент памяти.
Sidenote # 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, поэтому я смог вырезать инструкции, которые не помогали! Итак, мораль этой истории: вывод отладки - твой друг!