Отладочная плата для STM32 aka B.M.O.W.

B.M.O.W.

Я по роду основной деятельности программист, очень много работал на ARM платформе (Symbian, Windows Mobile, Linux, you name it ;)) и вот недавно решил приложить свои профессиональные навыки к хобби — завести ручногоотладочную плату STM32. Развел «Орлом» одностороннюю плату по даташиту с джамперами переключения загрузчика, отключением часового и основного кварцев и всеми портами наружу + JTAG (20-ти пиновый, что конечно оверкилл, но я к таким привык).
Вид сверху: все вроде прилично ;), окромя рабочего бардака на столе…

Но плата-то односторонняя! Узрите чудовище Big Mess Of Wires!

И это еще не все распаяно… Надо учиться двустороннему ЛУТу, что тут сказать.
При запуске платы случилась история, которая заставила меня проникнуться уважением к продукции ST — я перепутал питание и землю на микроконтроллере, НО! он тупо не заработал и более никаких последствий :)!

Про запуск.


У меня JTAG на базе ft2232 (куплен на Ebay, клон OpenMoko DevBoard), немного расскажу про его настройку и использование в Линукс (у меня он живет в VMWare, так как OpenOCD плохо переносит Win платформу).

Итак, запускаем JTAG+OpenOCD: качаем исходники версии 0.5.0 (не ниже, иначе плакала поддержка современных STM32), устанавливаем libftdi-dev, далее пара заклятий в терминале:

$ ./bootstrap
$ ./configure --enable-maintainer-mode --enable-ft2232_libftdi
$ make && sudo make install

В аттаче лежит мой конфиг файл для OpenOCD (положите его директорию .openocd в домашнюю папку), при использовании замените vid pid и идентификационную строку моего JTAG на свои значения.
Далее подключаем плату к JTAG, JTAG к компу, запускаем демона (от рута) openocd и смотрим на экран на предмет ошибок. Если их нет, то в другом терминале коннектимся по телнету к нашему серверу:

$ telnet localhost 4444

Если все хорошо, смотрим, как у нас определился контроллер и его память:

> targets
///// тут он должен вывести все опознаные цели, то есть одну :)
> flash probe 0
///// а тут он должен опознать флэш проца и объем (но у меня почему-то говорит про 32К флэша, хотя у C4T6 его 16К вроде :))

So far, so good…

Программа

Меня обуяла лень и я решил отступить от «стандарта» железячего «Hello World» — то есть светодиодом мигать не будем :), но подцепимся с помощью GDB и посмотрим внутрь программы.
Итак, качаем и устанавливаем с сайта Codesourcery G++ Lite, последнюю версию — бесплатно же!
Далее, пользуемся бескорыстно стыреным исходником с этого замечательного сайта (кстати, эта часть повествования цельнотянута оттуда ;), все есть в аттаче) и собираем мега-прогу. Получаем на выходе main.bin и main.elf. Первый — чистый код для прошивки в контроллер, второй — он же, но с отладочной инфой, которая поможет нам побегать по проге.
Шьем контроллер (еще помните окно телнета?):

> reset halt
/// тормозим мозговую деятельность контроллера (можно просто halt, кстати)
> stm32x mass_erase 0
/// стираем все КЕМ
> flash write_bank 0 "а вот тут можно поставить ваш путь к файлу"main.bin 0
/// пишем программу

Теперь магия GDB:

$ arm-none-eabi-gdbtui --eval-command="target remote localhost:3333" main.elf

И вуаля, у нас окно с кодом и консолью GDB.

All hail ARM!

Если кто-то прочитает это, и этому кому-то будет интересно — на все вопросы отвечу, только печатку не просите, мне стыдно ;).
  • +1
  • 19 июня 2011, 17:20
  • DareDen
  • 1
Файлы в топике: stm32_bmow.zip

Комментарии (33)

RSS свернуть / развернуть
OMG!!!
Спасибо, теперь я знаю что я не самый хреновый паяльник во вселенной :)
А можно я задам вопрос: А зачем вам своя плата? почему не взять ту же дискавери?
0
Так то мы все тут падованы, так что мериться хреновостью не выйдет, да и довольно не плохо на самом деле всё.Хотя я в какойто момент решил, что если по второму слою больше 5 перемычек, то уже имеет смысл разводить двухстороннюю, если жаба на текстолит не душит, не так уж и сложно совмещать.
0
Спасибо за комплимент :), но паяю я на самом деле неплохо ;). Вот развожу плохо, но учусь.
Плата своя, потому что хочу все своими руками потрогать. Дискавери купить — никак свои mad skillz не улучшить, а тут и ЛУТ 0.3 через 0.2 и запайка LQFP-48, все вкусно и интересно.
0
Какую бумагу для лута использовал? Самому надо LQFP48 сделать)) Вот репу чешу.
0
Старую HP глянцевую :). Точнее не скажу, коробки от нее не сохранилось. Грел без нажима прямо бумагу около 2х минут, слегка проглаживая. Перевелось, как видно, нормально, только глянец пришлось кое-где иголкой прочистить, да большие полигоны разделить, а то они подплыли слегка — наверное все же перегрел немного.
0
Народ, кто из Минска. Скажите, где у нас можно взять хоть какой ARM? На жданах искал — ничего не нашел…
0
Попробуй на жданах узнать, кто на заказ возит. Там 1-2 мужика точно привезут! Правда сейчас просят уями. Глянь в магазине, но после обвала они мне не ответили, может тебе повезет. В октябре все нормально привезли за наличку на работу. Только цены у них высоковаты, даже по сравнению со жданами.
0
А чего ты решил кидать перемычки по bottom? Когда я разводил более простую платку под STM8 тоже одностороннюю, тоже не обошлось без перемычек, но их кинул поверху (на слой top), уже не так страшно получилось :)
we.easyelectronics.ru/STM8/otladochnaya-plata-dlya-kontrollerov-stm8s-v-korpuse-lqfp32.html
0
А она еще не готова :). Это, так сказать, отладочные перемычки :). Финальные естественно поверху пойдут.
0
А она еще не готова :). Финальные перемычки пойдут поверху, факт. Если, конечно, я не сделаю двухслойную к тому времени :).
0
Я вот тоже хочу попробовать двусторонний ЛУТ, всё никак… :)
0
Многое из того, что разведено МГТФ'ом, можно было развести
0
Дык я и не спорю :). Поэтому печатку и не выкладываю, ибо любой такую (и даже лучше) сделает.
0
А кто какой разъем под JTAG использует? А то мне надо тут тож его прикрутить к плате, а на 20-pin как-то место жалко. Может кто подскажет какой-нить стандартный 10-pin?;)
0
Стандарт — 20пин и 14пин. Например здесь.
0
Благодарю:) Стало быть всякого рода 10-pin это уже инициатива разработчиков.
0
Ну да. Я так понимаю, что 20,14 таковы, чтоб между двумя сигнальными проводами обязательно была земля (типа как 80pin IDE). А если сделать 10пин, то так уже не выйдет, но с короткими проводами будет работать нормально ИМХО.
0
:) тоже запилил себе платку на STM32, отдельно на разъемы вывел I2C/RS232/SWD/USB:


0
DareDen, можно по шагам расписать процесс подключения самого адаптера, установки драйверов. Под Windows все запускал в связке eclipse + gdb + openocd, сейчас хочу запустить отладку под Ubuntu. Установил libftdi-dev, openocd 0.5.0 но при запуске openocd с файлом конфигурации он не видит ftdi адаптер.
0
Подключите адаптер и выложите вывод dmesg на что-то типа pastebin.com, тогда попробую что-то подсказать.
0
Вывод dmesg: pastebin.com/j4mPmpYB
Openocd говорит следующее:
Error: The specified debug interface was not found (ft2232)
The following debug interfaces are available:
Runtime Error: /home/shkurkin/jtag/openocd.cfg:4:
in procedure 'script'
at file «embedded:startup.tcl», line 58
in procedure 'interface' called at file "/home/shkurkin/jtag/openocd.cfg", line 4

Файл openocd.cfg взят отсюда.
0
Диагноз ясен — openocd собран без поддержки ft2232. Обратите внимание на кусок кода

$ ./bootstrap
$ ./configure --enable-maintainer-mode --enable-ft2232_libftdi
$ make && sudo make install

Собирать надо именно так, иначе поддержки этого чипа не будет.
0
Что есть ./bootstrap?
P.S. В Linux новичек.
0
Выполнить файл (скрипт, скорее всего) bootstrap из текущей директории. Строчка полностью аналогичная следущей, ./configure (это тоже скрипт).
0
  • avatar
  • Vga
  • 30 сентября 2011, 14:07
Да, именно скрипт. Скачиваете исходники openocd, распаковываете, и выполняете в полученной директории эту последовательность команд.
0
В директории нет такого скрипта:
bash: ./bootstrap: Нет такого файла или каталога
Исходник брал отсюда:http://sourceforge.net/projects/openocd/
0
Ага, проверил — там теперь только configure — ну значит игнорируйте первую строчку и выполняйте остальные — должно сработать.
0
Теперь openocd говорит следующее:
Info: only one transport option; autoselect 'jtag'
adapter_nsrst_delay: 300
jtag_ntrst_delay: 300
1000 kHz
1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m3 reset_config sysresetreq
Error: unable to open ftdi device: device not found
in procedure 'init'

Еще в файле конфига в последней строке файл stm32.cfg заменил на stm32f1x.cfg. Теперь настройки target`а для STM32 в двух файлах для семейств F10x и F20x соответственно.
0
Нескромный вопрос — вы из под рута запускаете? Из под обычного юзера работать не будет.
0
Из под рута. Исправил конфиг т.к. у меня другой адаптер — самодельный на базе FT2232D. Соответственно другие параметры ft2232_vid_pid, ft2232_device_desc, ft2232_layout. Коннект к адаптеру появился. А таргет не видит, полезу в железо с осциллографом.
0
Переустановил openocd-0.5.0 конект к таргету появился.
DareDen, СПАСИБО!
0
:) Ну и слава Богу. Всегда пожалуйста.
0
В каталоге /etc/udev/rules.d создайте файл 45-ftdi2232.rules со следующим содержимым:

#Generic FT2232C/D device

#BUS!="usb", ACTION!="add", SUBSYSTEM!=="usb_device"
SYSFS{idProduct}=="6010", SYSFS{idVendor}=="0403", MODE="666", GROUP="plugdev"


И тогда Вы сможете работать с программаторами на основе FT2232D как обычный пользователь и под РУТом работать не обязательно.

Нужно правильно указать серийные номера
SYSFS{idProduct} и SYSFS{idVendor}.
Чтобы их увидеть, в командной строке запустите программу lsusb, которая высветит список всех USB-устройст, среди которых найдёте нужное Вам.
0
Да, вы совершенно правы, спасибо за уточнение. Но я обычно запускаю демона все же из под рута — привычка.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.