Ubuntu + Pinboard II STM32

Всем привет!

Чуть ниже «прелюдии» моя заметка самому себе о том, как очень быстро развернуть среду разработки для STM32 (с программатором CoLink от PinboardII) под Ubuntu. Заметка на 90% сперта из статьи reset (тынц ), остальные 10% — из «других» источников ;)

Описанная процедура проверена на свежепоставленной 13.10 x64 и дремучей 12.04 x86 (на пятилетнем нетбуке все заняло ~30 минут со скринами и, в основном, из-за тормознутого вайфая).


Итак, решил я переползти с AVR на STM32, взял свой верный PinboardII с модулем STM32, и пошел по инструкции «быстрый старт...». Убедился в том, что перемычки стоят правильно, воткнул шлейф между CoLink и платкой камня и… оппа — описанные в доке Keil / CoIDE — только под вынь… Типа, красноглазики сами разберутся.
Ок, смотрю, что написали более старшие товарищи — и понимаю, почему именно «красноглазики» — в статьях «скомпилять то, скопировать оттуда, закомментарить это»… Но ведь не может быть так, чтобы не было простого, быстрого пути? Почитал, попробовал — есть (правда, не без магии для отладки).

1. Устанавливаем пререквизиты.


sudo add-apt-repository ppa:webupd8team/java
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded


Из ppa:webupd8team/java мы будем ставить oracle-java7-installer для эксипса, из ppa:terry.guo/gcc-arm-embedded — gcc-arm-none-eabi — тулчейн для арма (да, я знаю, что это — не самый лучший вариант, зато быстро, работает, и без геморроя).
Для Ubuntu 13.10 надо будет поправить файлик /etc/apt/sources.list.d/terry_guo-gcc-arm-embedded-saucy.list:
заменить

deb http://ppa.launchpad.net/terry.guo/gcc-arm-embedded/ubuntu saucy main
# deb-src http://ppa.launchpad.net/terry.guo/gcc-arm-embedded/ubuntu saucy main

на

deb http://ppa.launchpad.net/terry.guo/gcc-arm-embedded/ubuntu raring main
# deb-src http://ppa.launchpad.net/terry.guo/gcc-arm-embedded/ubuntu raring main

(ну не все правки они сделали еще сделали под 13.10).
Далее обновим список пакетов

sudo apt-get update


И поставим все необходимое:


sudo apt-get install oracle-java7-installer build-essential gcc-arm-none-eabi gcc-arm-none-eabi openocd screen


oracle-java7-installer: ява для эклипса;
build-essential: вообще не уверен, что оно надо, но как-то меня терзают смутные сомнения, что безо всяких make и иже с ними все заработает ;)
gcc-arm-none-eabi: тулчейн от «ARM employees»
openocd: прослойка для прошивки и отладки

2. Эклипс

Качаем эклипс Kepler (предыдущие уже ARM поагином не поддерживаются) — Eclipse IDE for C/C++ developers под свою архитектуру, распаковываем его куда-нибудь (например, /opt/stm32/eclipse).
Скачиваем эклипс
Запускаем. Под 13.10 нас ждет сюрприз — либо запускаем его вот такой строкой

UBUNTU_MENUPROXY=; ./eclipse

Либо гуглим как создать ярлык запуска и т. п…

Ставим плагины (Help->Install New Software…)
1) C/C++ GDB Hardware Debugging (репа — Kepler, ищется по gdb)
Ставим поддержку gdb
перезапускаем эклипс, Help->Install New Software…;
2) GNU ARM плагин (все из gnuarmeclipse.sourceforge.net/updates — надо эту репу добавить).
Ставим плагин GNU ARM

3. Запустим OpenOCD:
Создадим файл openocd.cfg (я создал его проектонезависимым, в /opt/stm32/config/openocd.cfg):

##############################
#
#  www.easyelectroniks.ru    
#       PinBoard II 
#     ARM JTAG CoLink
#       STM32F103xx
#
##############################

##### CoLink
interface ft2232
ft2232_vid_pid 0x0403 0x6010
ft2232_layout "flyswatter"

#### STM32F103xx
source [find target/stm32f1x.cfg]

telnet_port 4444
gdb_port 3333

adapter_khz 1000

( Спасибо greycardinalrus ),
запустим openocd:

openocd -f /opt/stm32/config/openocd.cfg -c "init"


4. Создаем новый проект.
В эклипсе создадим новый проект (File->New->C Project) — а тут нас ждет приятный сюрприз — есть шаблон под наш камень ;)
Создание нового проекта
Камень STM32F103C8T6 (тот, что в модуле для пинборда) опознается как «Medium density, 64k flash, 20k ram»:
Новый проект - камень
Путь к тулчейну стоит искать где-то в районе /usr/lib/gcc/arm-none-eabi/4.8.3 (кто поручится, что цифры не поменяются?):
новый проект - тулчейн

Создался новый проект, который как раз умеет то, что нам надо — поморгать светодиодом. Правда он думает, что светик на C12, а у нас он на B5 (ну, у меня), так что «для теста» поменяем исходник:

#define BLINK_PORT      GPIOC
#define BLINK_PIN       12
#define BLINK_RCC_BIT   RCC_APB2Periph_GPIOC

на

#define BLINK_PORT      GPIOB
#define BLINK_PIN       5
#define BLINK_RCC_BIT   RCC_APB2Periph_GPIOB


Теперь сконфигурируем отладчик \ прошивчик (Run->Debug configurations...). Тут, к сожалению, без «магии» не обошлось — стандартные галки убедить заработать не удалось, пришлось вбивать команды вручную (поскольку openocd, в отличие от reset запускаю я ручками, а не из эксипса, путь к скомпилянному эльфу пришлось писать полный):

monitor reset halt
file /opt/stm32/workspace/ledblink/Debug/ledblink.elf
monitor flash write_image erase  /opt/stm32/workspace/ledblink/Debug/ledblink.elf 0 elf

Конфиг отладчика - скрин 1
Конфиг отладчика - скрин 2
Конфиг отладчика - скрин 3

Вот и все — жмем «debug» и все работает!

Как отметил reset , неплохо бы добавить еще одну конфигурацию отладки — с командами gdb
monitor reset halt
file /opt/stm32/workspace/ledblink/Debug/ledblink.elf

(то есть без последней строки) — просто для отладки, без перепрошивки.

UPD а вот CoLinkEx под линем запустать никак не удалось, даже зацепок в инете не нашел :(. Видимо, для «мелкого» SWD программатора придется брать ST-LINK, либо дискавери…

UPD2 только вот светодиод у меня начал моргать с частотой не 1 герц (как предполагалось), а в полтора раза чаще. Хотфикс (спасибо antonluba ):
редактируем файл src/system_stm32f10x.c
меняем строку 1056
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

на
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);


Либо я чего-то не понял, либо ребята из ST не предполагали, что DIHALT цЫничнейше зафигарит 12МГц кварц вместо 8МГц (хотя в дефайнах везде HSE_VALUE=12000000). Вот.

СтОит почитать:
Оригинальная статья reset
Дока к тулчейну
Дока к эклисовому ARM-плагину
  • +1
  • 08 января 2014, 03:08
  • vlbuel

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

RSS свернуть / развернуть
Спасибо за статью. Скажите, а если на этапе запуска OCD он мне говорит постоянно: «Polling target failed, GDB will be halted. Polling again in 6300ms» — куда копать? Помер программатор? Камень при этом послушно исполняет давно залитую в него программу.
0
Ну если openocd не вываливается, значит «программатор» вполне живой.
Если он на старте нормально определяет камень, значит все ок.
У меня сейчас при баловстве с usb тоже периодически openocd отваливается — я лечу это так: переключаю нижнюю перемычку boot, ребутаю камень и перезапускаю openocd, заливаюсь / отлаживаюсь (то есть все приходит в норму), а для «автономной» работы переключаю перемычку обратно.
Знаний объяснить такое поведение без слов «наверное» (или предложить более вменяемый способ) у меня не хватает ;(

Вот если бы вы кинули сюда вывод openocd со старта (первые строк 20), было бы проще сказать — то же у вас самое, или нет.
0
То, что после этого? Кстати, поправьте кавычки «init»

openocd -f /opt/stm32/config/openocd.cfg -c «init»
0
Ага. Сейчас еще и openocd на openocm везде заменю ;)
0
что-то протупил с openocd/openocm…
0
robot@volk:~$ openocd -f /opt/stm32/config/openocd.cfg -c «init»
Open On-Chip Debugger 0.5.0 (2011-12-03-10:15)
Licensed under GNU GPL v2
For bug reports, read
openocd.berlios.de/doc/doxygen/bugs.html
Info: only one transport option; autoselect 'jtag'
1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m3 reset_config sysresetreq
1000 kHz
Info: clock speed 1000 kHz
Error: JTAG scan chain interrogation failed: all zeroes
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway…
Error: stm32.cpu: IR capture error; saw 0x00 not 0x01
Warn: Bypassing JTAG setup events due to errors
Warn: Invalid ACK 0 in JTAG-DP transaction
Polling target failed, GDB will be halted. Polling again in 100ms
Polling target failed, GDB will be halted. Polling again in 300ms
0
ftdi'ку оно увидело, а уже камень — нет (нет строк с чем-то типа Info: JTAG tap: stm***.cpu tap/device found: 0x*****).
Я бы проверил подключение шлейфа, проверил бы что на ноги камня, на которые завязан JTAG, ничего не подключено.
Если и тут все в порядке — перевесил бы нижнюю перемычку boot и попробовал бы после ребута камня (чтобы камень загрузился в бутлоадер и не ремапил \ переконфигурял бы пины, не сваливался в слип и т.п.).
0
Мда. Попробовал еще раз — за год лежания на полочке он, похоже, умер.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.