STM32: Урок 1 — Настраиваем IDE


Сегодня я расскажу, как подготовить рабочую среду для разработки под ARM Cortex-M3 микроконтроллеры STM32F10x. Среда должна в себя включать компилятор, редактор кода, отладчик, прошивалку микроконтроллера, а также должна быть удобна для использования. Ну и должна дружить с платами STM32VLDiscovery и STM32L-Discovery, само собой.Выбор IDE для ARM довольно большой, и можно их условно разделить на две группы — коммерческие и некоммерческие.

Коммерческие:

Некоммерческие:

Наверняка есть ещё, ведь IDE для ARM не сделал, похоже, только ленивый. Коммерческие IDE обычно довольно хороши, и большая их часть основана на Eclipse, но у всех них есть общие недостатки: они стоят денег (вот это новость!), их бесплатные версии имеют ограничения по объёму кода, не все поддерживают плату STM32VLDiscovery, а версии для Linux почти никто не делает (есть пара 30-дневных trial-версий). А в популярной, не знаю, почему, среде Keil ещё и редактор кода, судя по его виду и удобству, написан во времена Windows 95.

У кого много денег (или начальство на работе купило IDE), и кто не собирается слезать с Windows — спокойно берите эти жлобские поделки (: и мучайтесь/радуйтесь с ними, а я, не будучи буржуем de facto, предлагаю обратить внимание на бесплатные среды разработки. Конечно же, у них тоже есть и плюсы, и минусы — о них я расскажу в первую очередь.

Конструктор самоделкина

 [Eclipse] Офигенный редактор кода: подсветка синтаксиса, авто-дополнение и авто-завершение кода, всплывающие подсказки, рефакторинг (легко заменить название функции/переменной во всём проекте сразу).

 [Eclipse/ARM Plugin] Интеграция с отладчиком: можно устанавливать точки останова в программе (breakpoints), выполнять программу пошагово, менять содержимое регистров и памяти, смотреть ассемблерный листинг… Всё, как положено.

 [CodeBench] Сочетание компилятора GCC и отладчика GDB, а также других программ из этой сборки, даёт компактный, быстрый код и отличные возможности отладки и анализа кода.

 Всё компоненты «конструктора» есть под Windows и Linux. Думаю, вполне реально собрать и для Mac OS X, если сильно захотеть.

 Не заточен под какие-либо определённые семейства МК. В будущем можно будет писать хоть под полноценные процы вроде Cortex-A9.

 Большой объём работы при первоначальной настройке. Большая часть статьи будет посвящена этому, но для ленивых в конце статьи ссылки на готовые сборки IDE (:

CoIDE

Судя по всему, сделана китайцами, но на удивление качественно.

 Эта среда основана на Eclipse, так что имеет все плюсы оной.

 Создавать проекты очень легко, пользуясь мастером — всего в несколько шагов.

 Добавление новых библиотек в проект реализовано проще некуда.

 Настроить свойства проекта и отладки — пару раз клацнуть мышкой.

 Скачал, установил, пользуешься. Никакой возни с настройкой.

 Нет версий для Linux или MacOS (пишут, для Linux что когда-нибудь сделают).

 Пути к файлам в проекте забиты как абсолютные, а не относительные, так что простой перенос папки с проектом в другое место не прокатит — проект не соберётся.

 Тонкие настройки Eclipse спрятаны так глубоко, что для их поиска может понадобиться помощь проктолога.

Такие дела, коллеги. Ну что ж, сделаем так: по умолчанию будем использовать «конструктор», а если у кого не заработает — ставьте CoIDE. Для обоих вариантов я опишу настройку и создание проекта.

Конструктор: покрасноглазим

Внимание: потребуются навыки более чем продвинутого пользователя. У кого их нет, ну или времени и/или желания собирать всё это — в конце статьи вас ждут ссылки на готовые сборки конструктора для Windows и Linux, можете переходить к разделу «Создание скелетного проекта» (пользователям Windows ещё нужно прочитать про установку драйвера WinUSB ниже). Остальным советую поставить на воспроизведение что-то вроде плейлиста боссовских тем из игры Painkiller или другую спокойную добрую музыку. Кто доберётся до финиша без мухляжа, получит стопицот очков опыта.

Для начала объясню, почему конструктор состоит именно из таких деталей, как написано выше:

  • Чтобы в принципе разрабатывать софт для каких-либо МК, нам нужен компилятор и отладчик. Это Sourcery CodeBench Lite Edition — компилятор GCC, отладчик GDB и ещё несколько полезных утилит для работы с исполняемыми файлами.
  • Наши бесценные программы нужно как-то заливать на МК, да и сам GDB ничего не знает о внутренностях конкретных МК. Проект stlink служит посредником между GDB и отладчиком ST-Link, установленным на плате STM32VLDiscovery, а также содержит утилиту для прошивки.
  • Нужна приличная IDE, на дворе 2011 год, как-никак — не в Notepad/vim же код писать и отлаживать? Eclipse — отличная IDE, но настраивать её с нуля для разработки под ARM не очень весело, да и специфика тут своя, а для этого есть ARM Plugin для Eclipse.

Далее, для сборки и тестирования софта нам нужно будет работать в консоли в Unix-окружении. В Linux для этого всё изначально есть, а в Windows нужно установить MinGW с MSYS, после чего запустить MSYS.

Sourcery CodeBench Lite Edition

Итак, начнём с того, без чего процесс сборки может потерять всякий смысл — это набор софта для компиляции и отладки наших будущих программ, и это в данном случае Sourcery CodeBench Lite Edition (бывшая Sourcery G++ Lite). В нём для нас заботливо собраны (и протестированы) GCC, GDB и прочие стандартные утилиты GNU для работы с кодом и исполняемыми файлами. В принципе, всё это можно собрать и самому из исходников, но это два часа возни и ожидания на ПК средней мощности, а за нас всё сделали задаром.

Скачать CodeBench можно на сайте компании-разработчика как в виде инсталлятора (рекомендую), так и простым архивом, но если у вас Arch Linux, то можно поставить пакет из AUR:

yaourt -S aur/arm-2011-arm-none-eabi

После установки проверьте, что компилятор запускается и работает, откомпилировав незатейливый исходник на C, назвав его, скажем, x.c:

int main()
{
}

командой

arm-none-eabi-gcc x.c

В результате вы увидите сообщение типа:

/usr/bin/../lib/gcc/arm-none-eabi/4.5.2/../../../../arm-none-eabi/bin/ld:
warning: cannot find entry symbol _start; defaulting to 00008018

Тут компилятор всего лишь жалуется, что не определена точка входа, ведь для МК недостаточно просто написать функцию main(), чтобы она начала выполняться. Впрочем, сейчас это неважно.

stlink

Далее нам нужно средство отладки и прошивки для нашей платы. На STM32VLDiscovery установлен отладчик ST-Link версии 1, а на STM32L-Discovery — ST-Link 2, которые поддерживаются в нескольких IDE и утилитах для прошивки МК, но, как это обычно бывает, только под Windows. Но в мире есть добрые люди! Один такой добрый человек — Fabien Le Mentec — относительно недавно при поддержке компании ST Microelectronics начал работу по поддержке ST-Link в Linux, и его проект stlink содержит GDB-сервер и утилиту для прошивки. Если кто не в курсе: отладчик GDB умеет отлаживать удалённо, подключаясь по сети (по TCP/IP) к программе-серверу, которая работает с реальным железом. Разработчик Karl Palsson допилил поддержку ST-Link v1 в своём форке, ну а я портировал этот проект под Windows, заодно поправив косяки с работой по сети и добавив поддержку рестарта при отключении клиента.

Для сборки stlink необходима библиотека libusb-1.0 с заголовочными файлами, которую в Linux можно установить из репозиториев:

# Ubuntu
sudo apt-get install libusb-1.0-0-dev

# Arch Linux
sudo pacman -S libusb

Версию libusb-1.0.8 для Windows можно скачать с нашего сервера, установить её можно так:

tar jxvf libusb-1.0.8-windows.tar.bz2
cd libusb-1.0.8
./configure --prefix=/mingw
make
make install

Если у вас ещё не установлена система контроля версий Git, то самое время её установить — скачав с официального сайта или, в Linux, через пакетный менеджер:

# Ubuntu
sudo apt-get install git

# Arch Linux
sudo pacman -S git

Перейдите в папку, где вы хотите держать stlink (у меня это /home/burjui/devel в Linux и c:\tmp в Windows), клонируйте stlink из репозитория, перейдите в папку проекта, скомпилируйте проект и установите GDB-сервер:

# Windows
cd c:	mp
git clone git://github.com/burjui/stlink.git -b server-restart
cd stlink
make CC=gcc CONFIG_WIN32=1
cp ./gdbserver/st-util.exe /mingw/bin

# Linux
cd /home/burjui/devel
git clone git://github.com/burjui/stlink.git -b server-restart
cd stlink
make
sudo ln -s /home/burjui/devel/stlink/gdbserver/st-util /usr/local/bin

В Linux вам ещё потребуется сделать пару действий, чтобы устройство корректно определялось:

  • Нужны права на запись в устройство ST-Link для обычного пользователя:
    sudo cp 49-stlinkv* /etc/udev/rules.d/
    sudo udevadm control --reload-rules

    Демон udevd перечитает правила из /etc/udev/rules.d/ и при подключении платы создаст в /dev файл устройства с осмысленным именем типа stlinkv1_4 и с нужными правами.

  • ST-Link версии 1 использует кривую эмуляцию SCSI, чтобы притворяться флешкой, а нам это — лишняя палка в колесо. Устраняем:
    sudo cp stlink_v1.modprobe.conf /etc/modprobe.d
    sudo modprobe -r usb-storage && sudo modprobe usb-storage

    Драйвер usb-storage перезагрузился, а modprobe, прочитав /etc/modprobe.d/stlink_v1.modprobe.conf, попросила драйвер не работать с ST-Link. Драйвер на просьбу отреагирует отладочным сообщением ядра:

    $ dmesg | tail -n 2
    [82914.808449] usb 6-4: new full speed USB device number 4 using ohci_hcd
    [82914.981001] usb-storage 6-4:1.0: device ignored

А в Windows потребуется немного шаманства, чтобы установить драйвер WinUSB, необходимый для работы libusb в этой ОС. Подключите плату STM32VLDiscovery, далее скачайте программу Zadig и запустите её с правами администратора. В меню Options поставьте галочку List All Devices:

Выберите из выпадающего списка устройство USB Mass Storage Device с USB ID, равным 0483 3744 (ST-Link) или 0483 3748 (ST-Link 2), и нажмите кнопку Replace Driver:

Программа предупредит, что это опасно, но мы не боимся опасностей и жмём Yes:

Если ничего «опасного» не произойдёт, можно будет порадоваться успешной установке:

Осталось переподключить плату — и можно испытывать GDB-сервер и в Windows, и в Linux. Наберите команду:

st-util -1

Ключ «-1» указывает, что нам нужно подключить ST-Link именно версии 1. Если у вас STM32L-Discovery, на которой ST-Link 2, то этот ключ указывать не нужно. Если всё пройдёт успешно, вывод программы будет выглядеть так:

2011-11-23T18:29:57 INFO src/stlink-common.c: Loading device parameters....
2011-11-23T18:29:57 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device
2011-11-23T18:29:57 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB),
Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2011-11-23T18:29:57 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
Chip ID is 10016420, Core ID is  1ba01477.
KARL - should read back as 0x03, not 60 02 00 00
init watchpoints
Listening at *:4242...

Сервер запущен, попробуем к нему подключиться. В другом окне с консолью запустите GDB для ARM:

arm-none-eabi-gdb

В появившемся приглашении наберите команду:

target extended-remote localhost:4242
# GDB понимает и сокращения:
# tar ext :4242

В GDB результат будет выглядеть так:

(gdb) target extended-remote localhost:4242
Remote debugging using localhost:4242
0x0800061c in ?? ()
(gdb)

В st-util:

GDB connected. -- ключевой момент!
recv: qSupported:multiprocess+;qRelocInsn+
query: Supported;multiprocess+;qRelocInsn+
send: PacketSize=3fff;qXfer:memory-map:read+
recv: !
send: OK
recv: Hg0
...

Чтобы в будущем не набирать каждый раз в консоли ‘st-util -1’ для запуска GDB-сервера, советую сделать ярлык с аргументом «-1» после пути к .exe’шнику (или shell script в Linux).

Eclipse + ARM plugin

Вы ещё живы? Ничего, осталось совсем немного.

Так как ARM Plugin поддерживает Eclipse версии не старше, чем Helios (3.6.x), то её и поставим с официального сайта, взяв самую свежую версию на данный момент — 3.6.2 (Helios SR2). Нам нужна Eclipse IDE for C/C++ Developers, которая также широко известна по более короткому названию — Eclipse CDT. Качайте версию под свою ОС и распаковывайте, куда захочется. Мне захотелось в /home/burjui/apps/eclipse, например.

Запускайте Eclipse и выбирайте пункт меню Help→Install New Software… Не слишком очевидно, не правда ли? Далее действуем в соответствии с инструкциями по установке плагина, а именно жмём кнопку Add и в появившемся окне Add Repository вписываем имя плагина — например, ARM Plugin. Качаем zip-архив с плагином (нам нужна именно версия 0.5.3, более свежая требует Eclipse 3.7.x, а там поломали отладку), жмём кнопку Archive и выбираем скачанный архив, после чего жмём ОК.

Eclipse скачает с сервера информацию о доступных пакетах и покажет нам доступный к установке плагин. Ставим напротив него галочку и жмём Next:

После этого мы увидим типичное малоинформативное окно в стиле «просто нажми Next», а следом — лицензионное соглашение, с которым мы, разумеется, уже согласны — просто жмём Finish:

После этого процесс установки, наконец, начнётся:

Но посреди него нас попросят подтвердить, что мы абсолютно безбашенные и действительно хотим установить софт без цифровой подписи:

Когда установка завершится, Eclipse предложит перезапуск:

Ну вот, теперь у нас есть полноценная среда разработки для ARM.

Создаём скелетный проект

Поди, уже расслабились? Самое интересное — впереди.

Опять же, для ленивых в конце статьи есть ссылка на архив с проектом, а самые смелые могут продолжить сеанс интеллектуального мазохизма за компанию.

В Eclipse на стартовой странице выбираем Workbench, в меню выбираем пункт File→New→C Project. В появившемся окне слева выбираем ARM Cross Target Application/Empty Project, справа — Sourcery G++ Lite:

Проект я назвал так для STM32VLDiscovery, а для STM32L-Discovery я бы назвал его stm32ld_template.

STM32VLDiscovery

Для работы с этой платой скачаем библиотеку STM32F10x Standard Peripheral Library с сайта ST (копия у нас). Последняя на данный момент версия для STM32F10x — 3.5.0, так что после распаковки у нас будет папка STM32F10x_StdPeriph_Lib_V3.5.0. Создайте в папке с проектом подпапки CMSIS и StdPeripheralDriver, скопируйте в них указанные файлы и папки из STM32F10x_StdPeriph_Lib_V3.5.0:

В CMSIS:

  • core_cm3.h и core_cm3.c
    из Libraries/CMSIS/CM3/CoreSupport
  • stm32f10x.h, system_stm32f10x.c и system_stm32f10x.h
    из Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x
  • startup_stm32f10x_md_vl.s
    из Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7
    При этом расширение имени файла нужно сменить с ‘.s’ на ‘.S’ — это нужно, чтобы Eclipse понял, что это файл с кодом на ассемблере.

В StdPeripheralDriver:

  • Папки inc и src из Libraries/STM32F10x_StdPeriph_Driver

Также в CMSIS нужно создать файл stm32f10x_conf.h следующего содержания:

#ifndef STM32F10X_CONF_H_
#define STM32F10X_CONF_H_
/* ------------------- */

#ifndef USE_FULL_ASSERT
 #define assert_param(x)
#endif

/* ------------------- */
#endif

В папке с проектом создайте файл main.c с минимальным кодом бесконечного цикла:

#include <stm32f10x.h>

int main()
{
 do __NOP(); while (1);
}

Туда же закиньте файл stm32f100rb.ld. Щёлкните правой кнопкой по проекту в Eclipse, и в контекстном меню нажмите Refresh — тогда Eclipse увидит новые файлы и папки и добавит их в проект.

STM32L-Discovery

Для этой платы последовательность действий такая же, только будут меняться имена папок и файлов, а местами и содержимое.

Так как на этой плате установлен микроконтроллер STM32L152RBT6, то и качать мы будем STM32L1XX Standard Peripheral Library (копия). Распаковываем архив, получаем папку STM32L1xx_StdPeriph_Lib_V1.0.0 и копируем из неё:

В CMSIS:

  • core_cm3.h и core_cm3.c
    из Libraries/CMSIS/CM3/CoreSupport
  • stm32l1xx.h, system_stm32l1xx.h и system_stm32l1xx.с
    из Libraries/CMSIS/CM3/DeviceSupport/ST/STM32L1xx
  • startup_stm32l1xx_md.s
    из Libraries/CMSIS/CM3/DeviceSupport/ST/STM32L1xx/startup/gcc_ride7
    Не забываем сменить расширение имени файла с ‘.s’ на ‘.S’.

В StdPeripheralDriver:

  • Папки inc и src из Libraries/STM32L1xx_StdPeriph_Driver

В CMSIS нужно создать файл stm32l1xx_conf.h следующего содержания:

#ifndef STM32L1XX_CONF_H_
#define STM32L1XX_CONF_H_
/* ------------------- */

#ifndef USE_FULL_ASSERT
 #define assert_param(x)
#endif

/* ------------------- */
#endif

В папке с проектом создайте файл main.c с минимальным кодом бесконечного цикла:

#include <stm32l1xx.h>

int main()
{
  do __NOP(); while (1);
}

Туда же закиньте файл stm32l152rb.ld. Щёлкните правой кнопкой по проекту в Eclipse, и в контекстном меню нажмите Refresh — тогда Eclipse увидит новые файлы и папки и добавит их в проект.

Общая настройка

Настроим проект так, чтобы всё это компилировалось, заливалось на МК и отлаживалось. Выбираем в меню пункт Project→Properties, в окне в левой панели выбираем раздел C/C++ Build→Settings, справа вверху из списка Configuration выбираем пункт [ All configurations ] и начинаем шерстить по подразделам настроек.

Target Processor

Выбираем Processor — cortex-m3, ставим галочку Thumb (-mthumb).

C Compiler/Preprocessor

Добавим два определения для препроцессора языка C, которые необходимы для библиотек в StdPeripheralDriver: USE_STDPERIPH_DRIVER, а также STM32F10X_MD_VL или STM32L1XX_MD для STM32VLDiscovery и STM32L-Discovery, соответственно. Щёлкаем плюсик и вводим первое значение, второе — так же.

C Compiler/Directories

Здесь укажем, в каких папках проекта у нас лежат заголовочные файлы библиотек. Жмём плюсик и, чтобы пути к папкам считались относительно папки с проектом, жмём кнопку Workspace… и выбираем в проекте папку CMSIS:

Аналогично добавляем папку StdPeripheralDriver/inc.

C Compiler/Optimization

Здесь ставим галочки:

  • Function sections (-ffunction-sections)
  • Data sections (-fdata-sections)

C Linker/General

В поле Script file (-T) указываем путь к скрипту stm32f100rb.ld или stm32f152rb.ld для STM32VLDiscovery и STM32L-Discovery, соответственно — желательно, в таком же формате, как и папки в предыдущем случае, но без кавычек.

Ставим галочки:

  • Do not use standart start files (-nostartfiles)
  • Remove unused sections (-Xlinker —gc-sections)

Здесь всё, жмём ОК.
Протестируем сборку проекта. Выбираем в меню отладочную сборку — Project→Build Configurations→Debug, запускаем сборку — Project→Build Project.

Если после окончания сборки в нижней панели на вкладке Problems ничего не написано, значит, сборка прошла успешно.

Теперь осталось только настроить отладчик. Создаём в папке проекта файл gdb_commands_debug следующего содержания:

tar ext :4242
load Debug/stm32vld_template.elf

и ещё один похожий — gdb_commands_release:

tar ext :4242
load Release/stm32vld_template.elf

Идём в Run→Debug Configurations…, правым кликом на разделе C/C++ Application вызываем меню, в котором выбираем пункт New. Настроим созданную конфигурацию.

Раздел Main:

  • Name: Debug
  • C/C++ Application: Debug/stm32vld_template.elf
  • Build Configuration: Debug
  • Выбираем опцию Enable auto build

Раздел Debugger, вкладка Main:

  • GDB debugger: arm-none-eabi-gdb
  • GDB command file: gdb_commands_debug

Жмём Apply. Полученная конфигурация будет у нас отладочной: после сборки проекта в прошивке будет много «лишнего» кода, который необходим для отладки, но заметно раздувает размер прошивки.

Аналогично создаём релизную конфигурацию, при сборке которой прошивка будет содержать только необходимый код:

  • Name: Release
  • C/C++ Application: Release/stm32vld_template.elf
  • Build Configuration: Release
  • Выбираем опцию Enable auto build
  • GDB debugger: arm-none-eabi-gdb
  • GDB command file: gdb_commands_release

И в приведённых выше файлах, и в настройке конфигураций вместо stm32vld_template нужно написать имя проекта, если оно у вас отличается.

Ну, теперь-то с настройкой покончено! Напоследок проверим, как работает отладка. Для этого запускаем GDB-сервер (‘st-util -1’) и в меню жмём Run->Debug Configurations…, выбираем конфигурацию Debug и жмём кнопку Debug внизу окна. Сервер должен отреагировать кучей сообщений в консоли:

Eclipse же в это время попросит разрешения открыть «отладочную перспективу». Рекомендую не только согласиться, но и поставить галочку, чтобы IDE больше не спрашивала, а сразу открывала перспективу. «Перспективами» в Eclipse называются наборы настроек расположения окон: положение, стиль (отдельно или табом в родительском окне) и пр. Отладочная перспектива, возникшая перед нами, отличается наличием окон, специфичных для отладки — Breakpoints, Registers, Disassembly, Debug, Memory и пр. Перечисленные мной окна наиболее информативны и полезны для отладки. Расположение окон по умолчанию ужасно, поэтому я при первой же отладке привёл всё вот к такому виду:

Если вы дошли до этого момента, и всё заработало — честь вам и хвала. Теперь понимаете, за что просят деньги разработчики коммерческих IDE?

А вот я ещё нет. Пойму, когда:

  • Будут версии для Linux.
  • Когда не надо будет писать письмо, чтобы узнать цену IDE (цена будет написана большими буквами на сайте, и чтоб не более 50$).
  • Когда будут поддерживаться все популярные программаторы-отладчики. Для этого всего-то нужно дописать поддержку трёх-четырёх в проект OpenOCD.

Ибо настроил я всю эту бодягу за денёк, а остальные две недели патчил stlink, писал статью и тестировал сборки, так что мне не понятно, за что тут платить бабло, если работы от силы на день, и то — без руководства (;

Но если вдруг у вас ничего не заработает даже в приготовленной мной сборке IDE, тогда следующий раздел — для вас.

CoIDE: как два пальца об асфальт

Ну, тут полная халява. Если провести аналогию с автомобилями, то CoIDE нельзя превратить в бульдозер или велосипед по выбору, зато тачка очень удобная — сел и поехал.

Идём на страничку IDE, качаем по ссылке «Download directly» внизу страницы, устанавливаем, куда душе угодно, и запускаем. При первом запуске CoIDE покажет мастер создания проекта, в котором нужно выбрать производителя нашего микроконтроллера — ST:

Далее появится список МК, в котором нужно выбрать STM32F100RB, установленный на плате STM32VLDisvovery:

Появится окно так называемого «репозитория», в котором установкой галочек можно выбирать подключаемые к проекту библиотеки. При этом учитываются зависимости между библиотеками, что не может не радовать. В следующем уроке мы будем разбирать порты ввода-вывода (GPIO) так что отметим соответствующую библиотеку. Так как мы ещё не создали ни одного проекта, CoIDE предложит нам создать новый, на что мы согласимся:

По умолчанию папка для проектов располагается в установочной папке CoIDE и называется «workspace». Вообще, это не очень хороший вариант, я бы советовал создать отдельную папку где-нибудь в «Моих документах» или ещё где, но это личное дело каждого, а я решил ничего не трогать — в своей виртуальной машине в VirtualBox я могу мусорить сколько душе угодно (:
Скелетный проект по причине, изложенной в начале статьи (про плюсы и минусы), создавать бессмысленно, так что сразу сделаем проект для следующей статьи и назовём его stm32vld_quickstart:

Вот и всё, первый проект создан, можно даже приступать к кодингу. Но приступим мы к нему в следующей статье, а пока можете глянуть на файловую структуру проекта:

  • cmsis — тут лежит стандартная библиотека CMSIS, общая для всех Cortex-M3
  • cmsis_boot — название странноватое, ведь там лежит не только код первичной инициализации микроконтроллера, но и пара заголовочных файлов от стандартной библиотеки STM32F10x
  • stm_lib — STM32F10x Standart Peripheral Library, уже описанная при настройке Eclipse
  • build.xml — настройки сборки проекта, руками туда лучше не лазить, да и CoIDE сама этот файл не открывает, а показывает окно настроек проекта.
  • link.ld и memory.ld — скрипты линковщика, как stm32f100rb.ld, упоминавшийся выше, только зачем-то разделённый на два файла.
  • main.c — исходный код, пока ещё девственно чистый

Слева, кроме структуры проекта, так же показывается модель МК, для которой мы пишем, и список подключенных библиотек — идеально для склеротиков вроде меня (:

Теперь нужно зайти в Debug→Debug Configuration… и установить параметры отладки/прошивки:

  • Adapter: ST-Link
  • Port: SWD
  • Max Clock(Hz): 1M (1 МГц)

Теперь выбираем в меню Debug→Debug и CoIDE скомпилирует проект, зальёт прошивку на МК и запустит отладку:

Вот и вся настройка. Конечно, за простоту приходится платить, но в данном случае не деньгами, а минусами, перечисленными в начале статьи. Ну да ладно, зато оно работает сразу (:

Ссылки и прочее

Итак, на данный момент я сделал и протестировал три сборки IDE — для 32- и 64-битной Linux 32-битной Windows, а для 64-битной Windows будет чуть позже — нужно собрать GCC и компанию.
Среду разработки я назвал, не мудрствуя лукаво — RoboCraft ARM IDE (для краткости просто RC-ARM), версия 0.1
Впрочем, это не официальное название, оно пока просто для удобства — чтобы не писать «ну вон та первая сборка IDE, которую я слепил во второй статье» (:

  • Linux: 32-bit (i686), 64-bit (x86_64)
    Распаковываем, заходим в консоли в папку с IDE, в подпапку stlink и выполняем команды (все флешки и прочие mass-storage устройства должны быть размонтированы):

    sudo cp 49-stlinkv* /etc/udev/rules.d/
    sudo udevadm control --reload-rules
    
    sudo cp stlink_v1.modprobe.conf /etc/modprobe.d
    sudo modprobe -r usb-storage && sudo modprobe usb-storage

    Также нужно установить libusb-1.0, 32-битную версию libncurses-5 (для GDB) и make.
    Всё, отныне больше ничего для настройки делать не придётся. В папке с IDE лежат два скрипта — start-ide.sh и start-stlink.sh. Первый устанавливает переменные окружения, чтобы Eclipse увидел GCC для ARM, и запускает Eclipse, в котором уже установлен ARM Plugin. Второй запускает утилиту stlink, которая должна быть запущена всё время, пока вы пользуетесь отладкой и прошивкой. Самые хитрые могут добавить вызов второго скрипта в первый и не париться (:

  • Windows: 32-bit (i686)
    Распаковываем и устанавливаем драйвер WinUSB по инструкции в статье. По идее, больше ничего делать не надо. В папке лежат два bat-файла, аналогичные упомянутым выше скриптам: start-ide.bat запускает Eclipse, start-stlink.bat — утилиту stlink. Библиотеку libusb-1.0 я положил в дистрибутив, т.к. в Windows нет пакетного менеджера и готового пакета для её установки. Так же включена утилита make, используемая Eclipse для сборки проектов.

Во всех сборках присутствует Java Runtime Environment 6 update 29, необходимая для работы Eclipse, и IDE подхватывает JRE автоматически.

Об ошибках в работе IDE прошу писать в соответствующую тему на форуме.

Все необходимые файлы для скелетного проекта:

Распакуйте нужный архив и настройте проект, как написано в статье, только без копирования файлов. После настройки проект соберётся и в Windows, и в Linux, при условии, что IDE настроена правильно. При смене IDE на другую версию (точнее, ARM Toolchain) могут перестать собираться уже настроенные проекты из-за того, что ARM Plugin хранит в настройках проекта пути к стандартным заголовочным файлам компилятора — в этом случае нужно удалить файлы настроек из папки с проектом (их имена начинаются с точки) и выполнить настройку заново.

Чтобы добавить проект в свой workspace, в Eclipse выберите в меню Project→Import, а в появившемся окне выбрать General→Filesystem и указать распакованную из архива папку или сам архив. Как я уже упоминал, для CoIDE скелетный проект создавать смысла нет, т.к. в CoIDE создать проект не сложнее, чем подумать об этом, ну, и с копированием проектов в ней проблемы.

Для тех, кто решил когда-нибудь потом приготовить IDE по этому рецепту, привожу список ингредиентов:

  • Eclipse 3.6.2 (Helios SR2)
    Это последняя стабильная версия Eclipse на данный момент.
  • Java Runtime Environment 6u29
    По ссылке доступна самая свежая версия JRE, на данный момент это 6u29. Oracle уверяет, что последующие версии JRE будут совместимы с текущей — ну что ж, поверим на слово (как будто выбор есть).
  • GNU ARM Eclipse Plugin 0.5.3
    Нужна именно эта версия, т.к. более поздние уже требуют Eclipse 3.7.x, а там поломали отладку. Ну или что-то я не так делал, хотя и то же самое, что для Eclipse 3.6. На всякий случай сохранил в укромном месте (:
  • Sourcery CodeBench Lite Edition 2011.03-42, arm-none-eabi
    Пойдёт, по-хорошему, любая другая правильная сборка GCC + GDB + binutils для ARM — например, Yagarto или вообще собранная из исходников собственноручно. Лишь бы работала правильно.
  • stlink на GitHub, ветка server-restart
    Забирать так:

    git clone git://github.com/burjui/stlink.git -b server-restart

    Сборки:

    На данный момент нужен именно мой репозиторий, а не оригинал, и именно ветка server-restart — в ней есть патчи, позволяющие утилите работать непрерывно, а не завершаться после каждого дисконнекта. В будущем, когда мои патчи попадут в основную ветку, я обновлю пост.
    Сейчас утилита работает довольно медленно — прошивает всего около 500 байт в секунду, но это пока не начали работу по оптимизации.

  • Zadig
    Там лежат все версии этой утилиты. Если кто забыл, она для установки драйвера WinUSB под Windows, чтобы библиотека libusb-1.0 имела прямой доступ к ST-Link.
  • MinGW + MSYS
    Unix-like среда для разработки под Windows с использованием GCC.

Уфф… Вроде, всё. Ошибки, неточности, советы, вопросы принимаются. За сим откланиваюсь и лечу писать quickstart. Уж это я успею меньше, чем за две недели 😀


156 комментариев на «“STM32: Урок 1 — Настраиваем IDE”»

    • З.Ы. И где найти пример проекта Eclipse для этого МК?

    • Проект берите тот же, что и в статье а рабочий скрипт я залил к нам. Просто киньте скрипт в папку и измените имя скрипта в настройках проекта. Вообще, кстати, никто не мешает создать таким образом прошивки для разных кристаллов на основе одного проекта — достаточно создать дополнительные build-конфигурации с другими скриптами в настройках.

    • И спасибо, что упомянули про эту плату, чуть позже обновлю пост.

    • Ой, чуть не забыл — на вашей плате установлен отладчик ST-Link версии 2, так что запускать stlink нужно без аргументов, т.е. просто:

      st-util

      Когда у меня в распоряжении появится STM32L-Discovery, обязательно буду проверять все примеры кода на ней и в следующую сборку RC-ARM положу всё необходимое, если понадобится.

  1. Добрый день.
    У Вас получилась самая подробная статья по настройке эклипса из всех что я видел в нете. Я вот под stm32l настраивал, наверное, дня три потратил. Жаль, что Вы статью чуть раньше не написали 🙂

    • О да, первый раз с нуля настроить — это как мозаику из 1000 частей собрать: нужна куча времени и терпения. Кстати, а для прошивки вы какой утилитой пользуетесь, и под какой ОС?

    • Для прошивки в винде STMicroelectronics ST-LINK Utility 2.2 там есть как гуевая так и консольная утилита. Для отладки ST-LINK_gdbserver, который взял из Atollic TrueSTUDIO.

  2. Из статьи не совсем понятно, какие действия необходимо выполнить под виндами, чтоб работать в эклипсе. Саму эклипс и плагин установил, а вот с остальным как-то не все понятно.

    • Вот это мне всегда больше всего нравится. Спрашиваешь — что да как, растолкуйте, отвечают — берите готовую сборку. Я понять хочу, что и как, разобраться, откуда что берется и что для чего нужно, причинно-следственные взаимосвязи. Если статья в том числе и для начинающих — зачем к готовой ссылке отсылать.
      Намного понятнее (для меня лично) было бы, если бы изложение шло в таком виде:
      Для windows: качаем то-то и то-то. устанавливаем первое, второе, третье. подкручиваем/настраиваем первое, второе третье так-то и так-то. профит.

      Для linux: качаем то-то и то-то, устанавливаем то-то и то-то, настраиваем то и это. профит.
      А из всего вышенаписаного каменный цветок у меня как-то не получается. 🙁

    • настройка самого проекта в эклипсе абсолютно идентична, что под виндой, что под линухом. С чем именно возникают затруднения?

    • Да не то чтобы затруднения. MinGW надо ставить лишь затем, чтобы собрать Sourcery CodeBench Lite Edition и прикрутить ST-Link c GDB-сервером?

    • MinGW + MSYS и Git нужны для сборки stlink и libusb-1.0, а CodeBench просто ставится, и всё.
      В будущем MinGW и компания очень пригодятся для решения аналогичных задач, коль в винде своей нормальной консоли нет.
      Хотя про выкладывание stlink для винды в собранном виде отдельно от IDE я как-то не подумал — моя вина. Держите, библиотека libusb в комплекте.

    • А в сборке, которую презентовал mcsa, такого нету?

    • Я в сборку положил всё, что нужно для её работы под виндой, включая stlink и libusb. Я лишь забыл выложить их отдельно для пользователей Windows, у которых по умолчанию нет ни компилятора, ни утилиты make.

    • Т.е. скачанную сборку можно просто распаковать в директорию с установленной Eclipse, и все?

    • Сборка содержит вообще все необходимые программы: Eclipse с установленным GNU ARM Plugin, CodeBench, stlink.
      Специально для пользователей Windows в сборке также присутствуют libusb, make и Zadig.

  3. ВНИМАНИЕ!

    Кто уже прочитал статью — перечитайте, я её обновил:
    — Исправил ошибки в описании настройки проекта, а именно в описании копирования файлов из Standard Peripheral Driver.
    — Добавил установку правил udev в Linux.
    — Пересобрал 32-битную версию RC-ARM IDE для Linux в связи с кривой версией stlink (залил нормальную). Заменил CodeBench на самосборную версию ARM toolchain с более свежим компилятором и остальными утилитами. Кто качал — скачайте заново.
    — Добавил 64-битную сборку RC-ARM IDE для Linux.
    — Перезалил скелетный проект. Теперь там лежат только файлы, необходимые для проекта, а настройку проекта нужно выполнить вам.
    — Добавил в нужные части статьи описание настройки IDE и проекта для платы STM32L-Discovery с микроконтроллером STM32L152RBT6: настройку проекта (копирование файлов и настройку опций компилятора и компоновщика) и ремарку относительно запуска stlink.

  4. Присоединяюсь к коллегам! Статья супер!, жаль что только что нашёл её )) Пришлось через CoIDE учиться работать. Сейчас на Линукс буду переезжать )))

    • Вообщем скопировал архив, импортировал проект, попробовал собрать и получил ошибку:

      make all 
      Building file: ../main.c
      Invoking: ARM Sourcery Linux GCC C Compiler
      /home/cool/Документы/prog/STM32/robocraft-arm-ide-0.1-linux-i686/arm-toolchain/bin/../libexec/gcc/arm-none-eabi/4.6.2/cc1: error while loading shared libraries: libppl_c.so.4: cannot open shared object file: No such file or directory
      arm-none-eabi-gcc -O0 -Wall -Wa,-adhlns="main.o.lst" -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -mcpu=cortex-m3 -mthumb -g3 -gdwarf-2 -o"main.o" "../main.c"
      make: *** [main.o] Ошибка 1
      

      У меня одного эта ошибка происходит??? Кто нибудь может подсказать ??

    • Какой инструментарий нужно выбирать при создании проекта ?? Снимок окна
      Я все выбирал, везде ошибки. В итоге решил остановиться на «Sourcery G++ Lite» (исходя из инструкции). Ошибка которая выпадает, описана выше.
      Чего-то в проекте не хватает??

    • Вы хоть намекните, какой у вас дистрибутив.

    • Хм, установите gcc-multilib. На знаю точно, как в вашем дистре называется пакет, но обычно так.

    • На каком дистрибутиве работаете вы??

    • Жаль, но похоже в моём дистрибутиве официально нет утилит для разработки под ARM… Жаль…

    • Я про обычный gcc-multilib, не для ARM. И я вам в личку написал, прочитайте.

    • Специально зарегистрировался (:

      Последняя КУбунта.
      Мультилиб и либЮсб поставил.
      Всё равно ошибка:

      **** Build of configuration Debug for project New ****
      
      make all 
      Building file: ../main.c
      Invoking: ARM Linux GCC C Compiler
      arm-elf-gcc -O0 -Wall -Wa,-adhlns="main.o.lst" -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -mcpu=cortex-m3 -mthumb -g3 -gdwarf-2 -o"main.o" "../main.c"
      /bin/sh: arm-elf-gcc: команду не знайдено
      make: *** [main.o] Помилка 127
      
    • Памажите люби добрые! (:
      А то держать виртуалку с виндой, ради одного КоКоса, несколько некомильфо…

    • Хм… Первый этап пройден, неправильно выбрал тип проекта.
      Но компилироваться от этого не начало:

      **** Build of configuration Debug for project New ****
      
      make all 
      Building file: ../main.c
      /bin/sh: /home/knkd/bin/arm-ide/arm-toolchain/bin/arm-none-eabi-gcc: No such file or directory
      Invoking: ARM Sourcery Linux GCC C Compiler
      arm-none-eabi-gcc -O0 -Wall -Wa,-adhlns="main.o.lst" -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -mcpu=cortex-m3 -mthumb -g3 -gdwarf-2 -o"main.o" "../main.c"
      make: *** [main.o] Помилка 127
      

      Теперь делает вид, что не находит файл /home/knkd/bin/arm-ide/arm-toolchain/bin/arm-none-eabi-gcc, хоть он именно в этом месте и находится.

    • Также при попытке запустить любой исполняемый файл из arm-toolchain:

      knkd@knkd:/opt/arm-ide/arm-toolchain/bin$ ls -l
      
      -rwxr-xr-x 1 knkd knkd  639592 2011-12-08 00:50 arm-none-eabi-addr2line
      -rwxr-xr-x 1 knkd knkd  663888 2011-12-08 00:50 arm-none-eabi-ar
      -rwxr-xr-x 1 knkd knkd 1207472 2011-12-08 00:50 arm-none-eabi-as
      -rwxr-xr-x 1 knkd knkd  296472 2011-12-08 00:50 arm-none-eabi-c++
      -rwxr-xr-x 1 knkd knkd  635048 2011-12-08 00:50 arm-none-eabi-c++filt
      -rwxr-xr-x 1 knkd knkd  294104 2011-12-08 00:50 arm-none-eabi-cpp
      -rwxr-xr-x 1 knkd knkd   27952 2011-12-08 00:50 arm-none-eabi-elfedit
      -rwxr-xr-x 1 knkd knkd  296472 2011-12-08 00:50 arm-none-eabi-g++
      -rwxr-xr-x 1 knkd knkd  292568 2011-12-08 00:50 arm-none-eabi-gcc
      -rwxr-xr-x 1 knkd knkd  292568 2011-12-08 00:50 arm-none-eabi-gcc-4.6.2
      -rwxr-xr-x 1 knkd knkd   31752 2011-12-08 00:50 arm-none-eabi-gcov
      -rwxr-xr-x 1 knkd knkd 3820904 2011-12-08 00:50 arm-none-eabi-gdb
      -rwxr-xr-x 1 knkd knkd 3820872 2011-12-08 00:50 arm-none-eabi-gdbtui
      -rwxr-xr-x 1 knkd knkd  702920 2011-12-08 00:50 arm-none-eabi-gprof
      -rwxr-xr-x 1 knkd knkd  955600 2011-12-08 00:50 arm-none-eabi-ld
      -rwxr-xr-x 1 knkd knkd  955600 2011-12-08 00:50 arm-none-eabi-ld.bfd
      -rwxr-xr-x 1 knkd knkd  647976 2011-12-08 00:50 arm-none-eabi-nm
      -rwxr-xr-x 1 knkd knkd  827240 2011-12-08 00:50 arm-none-eabi-objcopy
      -rwxr-xr-x 1 knkd knkd 1010792 2011-12-08 00:50 arm-none-eabi-objdump
      -rwxr-xr-x 1 knkd knkd  663888 2011-12-08 00:50 arm-none-eabi-ranlib
      -rwxr-xr-x 1 knkd knkd  327472 2011-12-08 00:50 arm-none-eabi-readelf
      -rwxr-xr-x 1 knkd knkd  867688 2011-12-08 00:50 arm-none-eabi-run
      -rwxr-xr-x 1 knkd knkd  639496 2011-12-08 00:50 arm-none-eabi-size
      -rwxr-xr-x 1 knkd knkd  639496 2011-12-08 00:50 arm-none-eabi-strings
      -rwxr-xr-x 1 knkd knkd  827240 2011-12-08 00:50 arm-none-eabi-strip
      knkd@knkd:/opt/arm-ide/arm-toolchain/bin$ ./arm-none-eabi-gcc
      bash: ./arm-none-eabi-gcc: No such file or directory
      knkd@knkd:/opt/arm-ide/arm-toolchain/bin$ 
      
    • Постараюсь исправить — как раз пересобираю toolchain. Собственно, поэтому и пишу в такое время (:
      Только вот скажите, вы сборку уже свежую качали, после прочтения моего комментария об обновлении статьи? И какая у вас Kubuntu — i686 или x86_64?

    • И да, последняя — это 11.10 или какая там? Ведь есть же LTS и обычный дистр. Мне нужно точно знать — мне ж качать и на виртуалку ставить (:

    • Кубунта 11.10 х64.
      Качал после обновления, часов в пять-шесть.
      Грешил на настройки дистрибутива, но хеллоуворды из домашнего каталога вполне запускаются.
      Да и в /опт ничего не изменилось.

      Кстати. Тулчайн отдельно (поставленный инсталлятором) работает.
      Может ему нужны какие-то еще переменные окружения?

    • Не, это сборка кривая, я уже такой баг ловил с stlink. Сегодня надеюсь пересобрать окончательно, чтобы работало везде. Тут у кого-то на Alt Linux 6.0 запускается, но не хватает библиотеки ppl. Везде не слава богу, короче (:
      Фигово, что вменяемых инструкций по сборке GCC под для arm-none-eabi нет, только устаревшие и с недосказанностями. Сижу вот, прокачиваю интуицию с интеллектом — авось, завершу квест за день ((:

  5. ВНЕЗАПНО
    Т.к. RoboCraft ARM IDE 0.1 пока в стадии тестирования и правки (не у всех работает ARM toolchain), об ошибках в работе IDE (включая будущие версии) пишем на форум в соответствующую тему, туда же переносим отсюда обсуждение текущих косяков. Нафлудили тут мы все уже порядком (:

    • Нужно, чтобы у ассемблерного исходника было расширение .S (именно в верхнем регистре) — тогда IDE будет его воспринимать правильно. А дальше добавляешь файл в проект, как обычно.

    • Всего-то )) Спасибо!
      А отладка пошагово будет работать по каждой строчке асм-кода?

    • Да, только не выключайте отладочную инфу в свойствах проекта и используйте F5 (Step into): почему-то F6 (Step over) работает некорректно для ассемблера — вместо перехода на следующую инструкцию выходит из функции, написанной на ассемблере, т.е. ведёт себя, как Step out.

  6. burjui, спасибо за ответы выше.

    Сейчас встала гораздо бОльшая проблема. Настроил всё по инструкции, только для F4-discovery. Собираю этот пустой проект, получаю на выходе debug elf аж 8 мегабайт! Release elf около 300 кб, что тоже ни в какие ворота не лезет.

    Периверал либу и CMSIS брал с сайт st.com. Скрипт линкера брал отсюда. Может, в этом скрипте проблема? Я если честно не разбираюсь в нем. Тупо скопировал.

    • Сам спросил, сам ответил ))) Забыл галочку поставить на remove unused sections ))

    • А вы так не переживайте насчёт размера ELF (:
      Сейчас вот посмотрел на ELF для своей демки для HD44780 — 6.8 МБ, и это с порезанными секциями. А размер кода для камня всего-то 32 КБ. Но это и понятно: сишного кода довольно много, да ещё проект с libc линкуется — а она-то без -ffunction-sections скомпилена.

  7. Еще проблемы:

    Через eclipse отладка не запускается. Открываю в консоли gdb, соединяюсь с 4242, всё ок.
    Пишу load Debug/template.elf и получаю:
    Loading section .interp, size 0x13 lma 0x0
    Load failed

    А если в консоли gdb написать «file Debug/template.elf», то получаю:
    Reading symbols from Debug/template.elf…(no debugging symbols found)…done.

    • Так наоборот же надо:

      file Debug/template.elf
      load

      Команда file устанавливает текущий файл и читает из него отладочную информацию, а команда load (имя файла указывать не обязательно после выполнения file) уже загружает код в МК.

    • Собственно, после load так же точно появляется load failed.

      Кстати, в проекте stlink есть утилита st-flash. С помощью нее флеш читается и пишется нормально. Чтобы прошить МК, минуя gdb, это мн надо эльф загнать в МК?

    • Стоп, а вы какой gdb используете, обычный? Нужно arm-none-eabi-gdb! В МК можно только бинарники заливать — ни hex, ни elf, а именно бинарник, который можно получить так:

      arm-none-eabi-objcopy -O binary xxx.elf xxx.bin
      arm-none-eabi-objcopy -I ihex -O binary xxx.hex xxx.bin
    • ну естественно использую arm-none-eabi-gdb. Кстати, если скомпилить пример blink, который идет с проектом stlink, то он нормально загоняется в МК через arm-none-eabi-gdb. Но только если он слинкован под sram. Если линковать под флеш, то он тоже загоняется в МК, но выполняться отказывается.

      obj-copy попробую сейчас

    • Полученный бинарник загоняется, но не работает ((( Наверное, с адресами где-то косяк. Но вот как понять, где…

    • Да я уже брал и свежую версию. Проблема явно где-то в линковке. Я с дискавери перед всеми экспериментами слил содержимое флеш памяти, которое по дефолту было. И вот если этот бинарник залить обратно, то он работает как и раньше. Следовательно — проблема в самих бинарниках (ну или в эльфах, из которых они получаются)

    • Тогда могу только посоветовать прошерстить директорию example в stlink, а заодно SPL для STM32F4 — в обоих есть как рабочие примеры, так и скрипты линкера.

      P.S. Только что вспомнил: я же для STM32F4DISCOVERY писал простейшую зажигалку светодиодов. Держите архив с проектом.

    • Ваш проект не собирается даже ((
      tmp/ccyubkA9.s: Assembler messages:
      /tmp/ccyubkA9.s:571: Error: registers may not be the same — `strexb r0,r0,[r1]’
      /tmp/ccyubkA9.s:599: Error: registers may not be the same — `strexh r0,r0,[r1]’
      make: *** [CMSIS/core_cm3.o] Ошибка 1

    • И кстати, пример из stlink тоже перестал работать

    • Ага, заметил неладное в выводе gdb-сервера:

      2012-02-23T22:00:08 INFO src/stlink-common.c: Attempting to write 16384 (0x4000) bytes to stm32 address: 134217728 (0x8000000)
      2012-02-23T22:00:08 INFO src/stlink-common.c: Erasing flash page at addr: 0x8000000
      2012-02-23T22:00:08 INFO src/stlink-common.c: Successfully unlocked flash
      EraseFlash — Sector:0x0 Size:0x4000
      2012-02-23T22:00:08 INFO src/stlink-common.c: Finished erasing 1 pages of 16384 (0x4000) bytes
      2012-02-23T22:00:08 INFO src/stlink-common.c: Successfully unlocked flash
      flash_do: page 08004000
      2012-02-23T22:00:10 INFO src/stlink-common.c: Attempting to write 16384 (0x4000) bytes to stm32 address: 134234112 (0x8004000)
      2012-02-23T22:00:10 INFO src/stlink-common.c: Erasing flash page at addr: 0x8004000
      2012-02-23T22:00:10 INFO src/stlink-common.c: Successfully unlocked flash
      EraseFlash — Sector:0x1 Size:0x4000
      2012-02-23T22:00:11 INFO src/stlink-common.c: Finished erasing 1 pages of 16384 (0x4000) bytes
      2012-02-23T22:00:11 INFO src/stlink-common.c: Successfully unlocked flash
      flash_do: page 08008000
      2012-02-23T22:00:13 INFO src/stlink-common.c: Attempting to write 16384 (0x4000) bytes to stm32 address: 134250496 (0x8008000)
      2012-02-23T22:00:13 INFO src/stlink-common.c: Erasing flash page at addr: 0x8008000
      2012-02-23T22:00:13 INFO src/stlink-common.c: Successfully unlocked flash

      Как видите, это отличается от вашего лога. Как же всё это вылечить, блин

    • Не вижу тут ничего неладного — запись идёт по правильным адресам (начало флеша — 0x08000000), только размер страницы отлитчается — 16 КБ вместо 1 КБ, но это особенность флеша на High-density кристаллах.

    • Ну ладно, в этом действительно нет проблемы скорее всего. Но и без этого куча проблем.
      А вас не затруднит собрать эльф для F4? Выше я писал, что у меня ваш проект не собирается.

    • Заказал себе STM32F4DISCOVERY, т.к. нашел по вкусной цене, хотя изначально хотел L или VL

      Настройка IDE и отладчика сильно будет отличаться от описанной? Использую Ubuntu, до этого с STM дела не имел.

    • качайте готовую сборку из по ссылке в статье. у меня тоже ubuntu, все по инструкции делал, но оно так и не взлетело, дня три промучился. Скачал готовое, и через 5 минут уже работал. Видимо, работает только в данном тонком сочетании конкретных версий по

    • Отличаться будет настройка проекта:
      1) Тип процессора «cortex-m4»
      2) Другая библиотека периферии — STM32F4 DSP and standard peripherals library
      3) Определение STM32F10X_MD_VL можно просто выкинуть нафиг
      4) Ну и в настройках линкера и в проекте заменить stm32f100rb.ld на соответствующий скрипт, который можно аналогичным описанному в статье способу позаимствовать из папки с SPL. Выше я давал ссылку на проект — там скрипт есть, но немного неполный: я ещё не разобрался с CCM — Core Coupled Memory. Имейте ввиду, данные в CCM доступны только из кода, и недоступны периферии через DMA (так сказано в даташите).

      Также немного будет отличаться работа с периферией. Я STM32F4xx пока не исследовал детально, но, к примеру, режим GPIO там разделён на два поля: одно для pull-up/open-drain, другое для выбора прямого управления или чяерез альтернативные функции.

    • Ясно, спасибо.

      По поводу периферии — не страшно, понятно, что другой чип, но документация у них нормальная, попробую разобраться. Главное IDE настроить, чтобы можно было спокойно ковырять.

      Осталось только дождаться, когда посылочка приедет.

    • Приехали вчера дискавери, как обычно ночь без сна 🙂

      В итоге многое удалось — stlink цепляется к плате, сервер запускается, GDB работает. Тестовый проект для F4 собирается без ошибок (конечно были мелочи, типа не все библиотеки скопировал). Но проверить всё в куче из-под IDE не успел, уже тупил, засыпая 🙂

      Собственно есть вопрос: я брал скрипт линкера сайта ST, по началу линкер ругался на какой-то не найденный файл, проанализировал его, закомментил последнюю строку — заработало. Потом посмотрел ваш скрипт — он сильно отличается от этого. Хотелось бы узнать, что делает этот скрипт, на что он влияет (просто я с GCC дела не имел, хотя на Си опыт программирования есть небольшой)? Или ссылки какие почитать про него?

    • Вот тут неплохо написано. Если хочется более подробной инфы — только гуглить. Вкратце: скрипт линкера описывает этому самому линкеру (компоновщику), как организовать секции кода и данных в ELF-файле, т.е. как собрать из кучи объектных файлов один — откуда брать какие секции, в каком они будут порядке, впо каким адресам памяти и т.п. Напоминаю, что ELF — это Executable and Linkable Format: предназначен для хранения и компоновки кода и данных, попутно это стандартный формат для исполняемых и объектных файлов в Linux.

    • Можно еще небольшой вопрос, я не надоел? 🙂

      Настроил IDE, запускаю отладку. Светодиод на ST-LINKе начинает мигать, на дискавери идёт демо-программа. При том я могу ей управлять — остановить, посмотреть состояние регистров и т.д.
      Всё отлично, но почему не залилась моя программа? Или там что-то хитрое надо сделать?

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

    • Скажем так, иногда, всё же, нужно в чём-то разбираться самому. Одно из двух — либо вы один из тех, у кого просто волею судьбы всё из рук валится и ничего не работает (не везёт), либо вы невнимательно читаете статьи и ленитесь решать проблемы самостоятельно. Хотелось бы верить, что первое.

      Что касательно описанной вами проблемы — уж извините, но я не телепат, и не могу знать, почему у вас не залилась программа. Причин может быть дофига и больше: не запустили stlink, не настроили или настроили неправильно отладочную конфигурацию, пытаетесь заливать не ту прошивку, прошивка заливается по неверным адресам, прошивка не заливается вообще (ошибка stlink, МК или бог знает, чего ещё), да барабашка код по дороге в МК украл. Могли бы намекнуть логами stlink, например (:
      Только, ради бога, не надо постить все логи в комменты — можно написать в личку или дать ссылку на файл.

      В конце концов, скоро невозможно будет читать эту ветку комментариев из-за её чудовищного размера.

    • Да нормально я читаю статьи, просто МК у меня другой, и повторять 1:1 не выйдет. Плюс это первое знакомство с ARM и аппаратной отладкой, и много непонятного, например — что он льёт в контроллер? hex? bin? elf? На что смотреть, если есть проблемы?
      Допустим я и подумать не мог, что можно отлаживать уже прошитый код в МК независимо от исходника.

      Конкретно в моём случае проблема была в коде. Ну понятно, пустышку он не скомпилит, поэтому взял ваш под F4 со светодиодами, но он и его не компилил — ошибок нет, а на выходе пусто. Пока не обратил внимание на варнинг. Пришлось добавить в код Reset_Handler — hex заполнился данными, и при запуске дебага демка благополучно затёрлась, т.е. МК прошился.

      Ладно, не буду больше надоедать, спасибо вам за статью и за ответы!

    • Спасибо, вечером приду с работы, попробую.

      Если опять не взлетит, скачаю вашу сбору IDE. Может быть, у меня другие версии компонентов конструктора, и в них не работает.

    • Можно. Для этого во время отладки вызовите окно «Registers».

    • Уже открыто. Но там я вижу только регистры РОН, f0-f7, lr, pc, sp, и еще парочку.

    • А, точно, вы же про периферию. Ну тогда окно «Expressions», там добавляйте интересующую периферию и смотрите/изменяйте. Я так TIM3 добавлял, а потом менял счётчик таймера и разрешал/запрещал его работу. Только программу на паузу ставить нужно.

  8. burjui, большое спасибо за статью!
    Однако у меня с github возникло взаимонедопонимание:

    $ git clone git://github.com/burjui/stlink.git -b server-restart
    Initialized empty Git repository in /home/user/devel/stlink/.git/

    это означает, что проблемы у github или у меня?

    • Делаю то же самое:

      $ git clone git://github.com/burjui/stlink.git -b server-restart
      Cloning into 'stlink'...
      remote: Counting objects: 3924, done.
      remote: Compressing objects: 100% (1371/1371), done.
      Receiving objects:  17% (678/3924), 860.00 KiB | 78 KiB/s

      Даже не знаю, почему у вас создаётся пустой репозиторий o_O
      На всякий случай проверьте версию git — вдруг у вас слишком старая (хотя всё равно чуднó):

      $ git --version
      git version 1.7.9.2
    • а в вашей «готовой сборке IDE» не придется клонировать ветку из гита? может мне тогда стоит воспользоваться ей?

    • Не придётся, но там старая версия stlink, так что я в скором времени сделаю новую сборку с более свежими версиями софта.

      Кстати, необязательно именно через git получать свежие сорцы — на GitHub можно скачать выбранную ветку в виде zip-архива: нужно выбрать в списке «branch: server-restart» и нажать кнопку «ZIP». На всякий случай даю ссылку. При переходе по этой ссылке GitHub генерит zip-архив со свежими сорцами и отдаёт его.

    • Вообще у меня на работе все в Keil прогают под ARM 🙂

  9. может кто скинуть\сделать пример для stm32l152rbt6(stm32l-discovery) по работе с usart? хотябы чтоб просто плата и комп обменивались инфой в 1 байт

  10. Подскажите, пожалуйста, как линковать под RAM?

    Сам смотрю на свой комментарий где-то выше, вижу, что я там писал, что линковал под RAM, а сейчас хоть убей не могу вспомнить, как я это делал 😀

    • А я так вообще не пробовал (:
      В принципе, можно в скрипте линкера всем секциям прописать место назначения ram вместо flash. Но я бы не стал этим маяться, т.к. SRAM обычно мало, а flash-память достаточно быстра и число перезаписей до отказа очень большое.

    • Об этом я уже тоже подумал )) Сейчас на работе сижу, дома попробую.
      В оперативку хочу линковать для отладочных целей, чтобы скорость увеличить и ресурс флешки поэкономить. Насчет ресурса не знаю, может мне его и на годы хватит, но вот скорость так себе. 1 кб/сек — это предел, обычно медленнее. Когда при отладке программы приходится перепрошивать МК по 100 раз на день, то даже 5-10 сек ожидания начинают напрягать.

      А памяти у меня хватает. F4 же ))))

  11. burjui, спасибо за статью и сборки, все работает отлично. Попробовал новую версию st-util под линукс — самолет.
    Пытаюсь собрать свежий st-util под винду, компилятор ругается на отсутствие libusb.h
    При этом libusb встал в mingw правильно — в lib и include все есть. Пробовал в исходнике подправить на #include <libusb-1.0/libusb.h>, тоже без эффекта. mingw, libusb, и пр скачаны по вашим ссылкам.
    Куда копать?

    • Копать в лучше вниз, метра на полтора — туда бросьте директорию stlink и закопайте. С недавних пор (версия 0.6.0) в OpenOCD появилась поддержка ST-Link обеих версий, работает на всех STM32, скорость прошивки под 17 КБайт/с. Офигенно, в общем. Т.к. версия девелоперская, даже не бета, для винды один чувак сборки делает. Сама прога просто конфетка — и GDB-сервером прикидывается, и telnet-сервером (можно команды вручную выполнять — reset, halt, прошивку, очистку).

      Пожалуй, напишу на следующей неделе пост на тему склеивания OpenOCD с Eclipse (:

    • Понятно. Уже видел, что она есть, но не знал что можно под винду собрать. Огромное спасибо за ссылку.

    • Попробовал OpenOCD по вашей ссылке в комплекте с ZylinCDT. Завелся с первого раза, загрузка — космический корабль :). Инструкции по этой ссылке//www.indigresso.com/wiki/doku.php?id=opentag:tools:gnu_arm_eclipse">по этой ссылке
      Тот ld скрипт, который Вы давали для stm32lxx — глючный. Взял от TrueStudio, полет нормальный.

    • А да, что касается непосредственно stlink, там проблема в include path. Вы именно в MSYS собирали (правильно) или просто в cmd.exe с прописанным PATH до MinGW (не очень)?

    • Я собирал из msys. Но это наверное уже не важно :).

  12. Большое спасибо за статью
    Проблема возникла только одна (Ubuntu 12.04)
    не определен тип
    В Eclipse
    Type ‘uint8_t’ could not be resolved misc.h /stm32vld_template/StdPeripheralDriver/inc
    Насколько я понимаю uint8_t — часть стандартной библиотеки,
    а вот тут electronix.ru/forum/lofiversion/index.php/t99096.html
    идут активные споры что у производителя arm свое определение uint8_t
    Я только начинаю с этим делом разбираться, наздеюсь что ктонибудь подскаже в какую сторону рыть

    • Проблему решил но повилась другая…

      Failed to execute MI command:
      -gdb-set target-async off
  13. Подскажите пожалуйста, что я делаю не так.
    Отладочную плату STM32f4Discovery включаю в компьютеры, но она определяется, как неизвестное устройство, при чём, как в Linux (Ubuntu 12.04 amd64), так и в Windows 7 (x64), и в Windows XP. Это всё разные компьютеры, так что системы — точно не виноваты.
    Возможно как-то поправить ситуацию? Или плата бракованная/неправильно прошитая?

  14. Помогите пожалуйста сборку проекта делаю как вы описали для stm32l_discovery но когда начинаю тестировать сборку проекта как у вас написано пишет
    arm-none-eabi-gcc -O0 -Wall -Wa,-adhlns=«main.o.lst» -c -fmessage-length=0 -MMD -MP -MF«main.d» -MT«main.d» -o«main.o» "../main.c"
    ../main.c:1:23: fatal error: stm32l1xx.h: No such file or directory
    compilation terminated.
    cs-make: *** [main.o] Error 1
    директории с папками библиотек вроде указал нормально
    заранее всем спасибо

    • Может, вы не те библиотеки к проекту добавляете? Для серии STM32L1xx нужно качать свои.

    • Я создавал и настраивал как писалось выше а
      папки с библиотеками добавлял отсюда же из «Все необходимые файлы для скелетного проекта:» stm32l_discovery"
      второй день бьюсь не знаю что делаю не так

  15. А кто-нибудь может подсказать какие файлы нужно взять, если использовать CMSIS V3?
    У меня возникает ошибка Error: registers may not be the same — `strexb r0,r0,[r1]’
    Исправлял как написано тут (http://we.easyelectronics.ru/PahanMenski/gcc-46-i-cmsis-ispravlyaem-oshibku-kompilyacii.html)
    Но там говорят только про одно место, у меня еще вот такой кусок кода ошибается:
    uint32_t __STREXH(uint16_t value, uint16_t *addr)
    {
    __ASM(«strexh r0, r0, [r1]»);
    __ASM(«bx lr»);
    }
    Говорят что в CMSIS v3 исправили эту ошибку, но там структура файлов совершенно другая, вот не знаю как эти файлы правильно подключить…

  16. Начал осваивать ST32L152 на Дискавери, Eclipse и библиотеку STM. Есть проблема, получаю значение из АЦП, с канала измерения температуры, а пересчитать во lfoat не получается. запись вида:
    float Temp, a=0.5,b=0.00166;
    Temp = a/b;
    компилируется, но отладчик загрузочный файл не может загрузить в память контроллера, выдаёт ошибку.Error in final launch sequence
    Failed to execute MI command:
    load D:\\stm32-discovery-projects\\workspace_STM32L\\stm32ld_quickstart\\Debug\\stm32ld_quickstart.elf

    Error message from debugger back end:
    Error writing data to flash
    Error writing data to flash

    Из-за чего такое может быть?

  17. огромное спасибо за статью! раньше пробовал Eclipse под AVR, не понравился. теперь понял почему. сейчас начал осваивать ARM. Ваша статья как нельзя вОвремя. Eclipse настроил по статье, всё пошло с первого раза. еще раз спасибо!!!

  18. не пойму только, а как эклипсе указать, где у нее компилятор лежит (yagarto).
    Без этого, конечно, ошибку проекта выдает.

    Еще бы хотелось все тоже самое, но с внешним make файлом посмотреть как настраивать.

    • Project→Properties→C/C++ build: снимаешь галочку «Generate Makefiles automatically», в поле «Build directory» пишешь путь к папке с Makefile’ом. Не забывай, что эта настройка действует для выбранной конфигурации (Debug или Release), так что выбери перед этим нужную вверху окна (или All).

    • А, да, про Yagarto подсказать не могу — не использовал. Предлагаю не выпендриваться (: и использовать Sourcery CodeBench Lite, т.к. всё равно там те же самые инструменты, что и в Yagarto: GCC, GDB, Binutils.

  19. Вот и я дошел до вопросов.

    А, именно, стал устанавливать Eclipse и ARM Plugin:

    Так как ARM Plugin поддерживает Eclipse версии не старше, чем Helios (3.6.x), то её и поставим с официального
    сайта, взяв самую свежую версию на данный момент — 3.6.2 (Helios SR2). Нам нужна Eclipse IDE for C/C++
    Developers, которая также широко известна по более короткому названию — Eclipse CDT. Качайте версию под
    свою ОС и распаковывайте, куда захочется. Мне захотелось в /home/burjui/apps/eclipse, например.

    Распаковал. Но при запуске этого Эклипса система потребовала установить:
    sudo apt-get install eclipse-platform
    Ну, установил, и запустил eclipse.
    Eclipse SDK
    Version: 3.5.2
    Build id: M20100211-1343
    Получается архив был не нужен? Или я не правильно распаковал?

    Ладно, продолжим?

    Запускайте Eclipse и выбирайте пункт меню Help→Install New Software… Не слишком очевидно, не правда ли?
    Далее действуем в соответствии с инструкциями по установке плагина, а именно жмём кнопку Add и в появившемся
    окне Add Repository вписываем имя плагина — например, ARM Plugin. Качаем zip-архив с плагином (нам нужна
    именно версия 0.5.3, более свежая требует Eclipse 3.7.x, а там поломали отладку), жмём кнопку Archive и
    выбираем скачанный архив, после чего жмём ОК.

    Ошибка:
    Cannot complete the install because one or more required items could not be found.
    Software being installed: GNU ARM C/C++ Development Support 0.5.4.201202210114
    (org.eclipse.cdt.cross.arm.gnu.feature.group 0.5.4.201202210114)
    Missing requirement: GNU ARM C/C++ Development Support 0.5.4.201202210114
    (org.eclipse.cdt.cross.arm.gnu 0.5.4.201202210114)
    requires ‘bundle org.eclipse.cdt.managedbuilder.core 8.0.0’ but it could not be found
    Cannot satisfy dependency:
    From: GNU ARM C/C++ Development Support 0.5.4.201202210114
    (org.eclipse.cdt.cross.arm.gnu.feature.group 0.5.4.201202210114)
    To: org.eclipse.cdt.cross.arm.gnu [0.5.4.201202210114]
    Что-то не хватает. Но что?

    Спасибо! Александр.

    p.s. Готовую сборку скачал. Но, во-первых, интересно почему так не получилось?
    Во-вторых, подозреваю я и сборку неправильно разархивирую. Кажется, Double Commander не лучшее средство для разархивирования.

    • requires ‘bundle org.eclipse.cdt.managedbuilder.core 8.0.0’ but it could not be found

      А CDT кто будет ставить — Пушкин? (:

      sudo apt-get install eclipse-cdt
    • Eclipse CDT. Качайте версию под
      свою ОС и распаковывайте, куда захочется. Мне захотелось в /home/burjui/apps/eclipse, например.

      Ну, вот, же… Только при запуске эклипса из этой папки он не работает.

      ~/stm32CodeBench/eclipse$ eclipse
      Программа 'eclipse' на данный момент не установлена.  Вы можете установить её, выполнив:
      sudo apt-get install eclipse-platform
      ~/stm32CodeBench/eclipse$ l -l eclipse
      -rwxr-xr-x 1 ajk ajk 71162 2010-10-19 21:44 eclipse*
      
    • Я под Убунтой

      Штырит?
      Шуткую. Вы не тот Eclipse запускаете, надо так:

      ~/stm32CodeBench/eclipse$ ./eclipse

      Это не винда, здесь нужно явно указать путь к бинарнику, пусть даже и относительный.

    • Ну, я не совсем плохой, то:

      jk@home-desktop:~/stm32CodeBench/eclipse$ l -l
      итого 580
      drwxrwsr-x  2 ajk ajk   4096 2011-02-18 12:25 about_files/
      -rw-rw-r--  1 ajk ajk  18909 2011-02-10 20:31 about.html
      -rw-rw-r--  1 ajk ajk  62694 2011-02-18 12:25 artifacts.xml
      drwxrwsr-x  4 ajk ajk   4096 2011-02-18 12:25 configuration/
      drwxrwsr-x  2 ajk ajk   4096 2011-02-18 12:25 dropins/
      -rwxr-xr-x  1 ajk ajk  71162 2010-10-19 21:44 eclipse*
      -rw-rw-r--  1 ajk ajk    428 2011-02-18 12:25 eclipse.ini
      -rw-rw-r--  1 ajk ajk  16536 2005-02-26 02:53 epl-v10.html
      drwxrwsr-x 27 ajk ajk   4096 2011-02-18 12:25 features/
      -rw-rw-r--  1 ajk ajk   9022 2006-12-11 19:04 icon.xpm
      -rwxr-xr-x  1 ajk ajk 335360 2006-12-11 19:04 libcairo-swt.so*
      -rw-rw-r--  1 ajk ajk   9051 2010-04-27 23:23 notice.html
      drwxrwsr-x  5 ajk ajk   4096 2011-02-18 12:24 p2/
      drwxrwsr-x  9 ajk ajk  24576 2011-02-18 12:25 plugins/
      drwxrwsr-x  2 ajk ajk   4096 2011-02-18 12:25 readme/
      ajk@home-desktop:~/stm32CodeBench/eclipse$ ./eclipse
      bash: ./eclipse: не удалось выполнить бинарный файл
      ajk@home-desktop:~/stm32CodeBench/eclipse$ 
    • У меня 10-я люцида:
      Linux home-desktop 2.6.32-45-generic-pae #104-Ubuntu SMP Tue Feb 19 21:36:53 UTC 2013 i686 GNU/Linux

      -rwxr-xr-x  1 ajk ajk    314 2011-12-08 05:30 start-ide.sh*
      -rwxr-xr-x  1 ajk ajk    235 2011-12-08 05:30 start-stlink.sh*
      drwxr-xr-x  2 ajk ajk   4096 2011-12-07 17:47 stlink/
      ajk@home-desktop:~/stm32CodeBench/robocraft-arm-ide-0.1-linux-x86_64$ start-ide.sh
      start-ide.sh: команда не найдена
      ajk@home-desktop:~/stm32CodeBench/robocraft-arm-ide-0.1-linux-x86_64$ ./start-ide.sh
      ./eclipse: 5: Syntax error: "(" unexpected
      ajk@home-desktop:~/stm32CodeBench/robocraft-arm-ide-0.1-linux-x86_64$
      

      Мне не хватает какой-нибудь Явы… Но почему Эклипс установленный через apt-get работает?
      Какая-то глупость…

    • Видимо в вашем старом дистрибутиве загрузчик ELF располагается по другому пути. Eclipse слинкован с /lib64/ld-linux-x86-64.so.2, а у меня Ubuntu 12.10:

      burjui☯lair ❮~❯ ldd /home/burjui/Apps/robocraft-arm-ide-0.1-linux-x86_64/eclipse
      	linux-vdso.so.1 =>  (0x00007fffccb5e000)
      	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f192d996000)
      	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f192d792000)
      	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f192d3d2000)
      	/lib64/ld-linux-x86-64.so.2 (0x00007f192dbd3000)

      Так что придётся вам настраивать Eclipse из дистрибутива или с eclipse.org

    • Запустился robocraft-arm-ide-0.1-linux-i686.tar.xz Может быть, я чего не понимаю… Разберемся.

    • Это скрипт линкера (компоновщика) ld из набора утилит binutils, который входит в состав Sourcery CodeBench Lite. В скомпилированных объектных файлах код и данные раскиданы по соответствующим секциям, а в скрипте указаны адреса, по которым следует эти секции размещать в памяти МК (Flash и SRAM). Так как МК бывают с разными объёмами памяти, каждому нужен свой скрипт. Среды типа CoIDE и всякие коммерческие обычно автоматически добавляют в проект нужный скрипт линкера, основываясь на выбранной в свойствах проекта модели МК.

      Можете скачать мой проект-заготовку для STM32F4DISCOVERY: там скрипт линкера присутствует — правда, не самый корректный, но-таки рабочий. Как вариант — скачать Standard Perpheral Library для STM32F4xx: там должны быть примеры проектов для разных IDE и компиляторов (наш случай — Eclipse и GCC). Ну и, если совсем туго, можно погуглить по we.easyelectronics.ru, ибо там тусуются STM’щики в заметных невооружённым глазом количествах.

    • Ну, ладно еще вопрос… Как же мозги плохо восстанавливаются!

      Запускаю st-link? светодиод справа от разъема перемигивается зелёным и так и остается. Видимо st-link запустился и плата ждет загрузки.

      Run — Debug Configuration:

      Error in final launch sequence
      Failed to execute MI command:
      -exec-run
      Error message from debugger back end:
      Don't know how to run.  Try "help target".
      Don't know how to run.  Try "help target".

      Ну, или картинка ошибки

      Настройки запуска: Debug Main и Debug Configurations

      Спасибо!
      александр.

    • А ты внимательно прочитай про настройку отладчика (поищи по фразе «Теперь осталось только настроить отладчик.»). GDB command file указать забыл.

    • Скажите, что ещё внимательно почмитать?

      Запустил отладку и вижу ошибку:

      Error in final launch sequence
      Failed to execute MI command:
      source /home/ajk/workspace/stm32f4d_template/gdb_commands_release
      Error message from debugger back end:
      /home/ajk/workspace/stm32f4d_template/gdb_commands_release:2: Error in sourced command file:
      Release/stm32f4d_template.elf: \320\235\320\265\321\202 \321\202\320\260\320\272\320\276\320\263\320\276 \321\204\320\260\320\271\320\273\320\260 \320\270\320\273\320\270 \320\272\320\260\321\202\320\260\320\273\320\276\320\263\320\260.
      /home/ajk/workspace/stm32f4d_template/gdb_commands_release:2: Error in sourced command file:
      Release/stm32f4d_template.elf: \320\235\320\265\321\202 \321\202\320\260\320\272\320\276\320\263\320\276 \321\204\320\260\320\271\320\273\320\260 \320\270\320\273\320\270 \320\272\320\260\321\202\320\260\320\273\320\276\320\263\320\260.
  20. Всем привет. Пытался повторить все операции с STM32LDiscovery на windows, всё получилось до момента установки stlink. Как и было описанно, после установки драйвера WinUSB(с пом. Zadig), ввод команды «st-util»(без ключа) не привёл к какому-либо выводу на терминал. В другом окне так же запустил GDB с пом. команды «arm-none-eabi-gdb» и далее «target extended-remote localhost:4242»(«tar ext :4242») результатом были иероглифы, а на другом терминале(st-util) ничего не произошло. Старался выполнять все ваши инструкции точно, но где-то видимо упустил что-то. Все остальные настройки до и после раздела stlink выставил. Тестовый проект в эклипсе компилится. Подскажите где ошибся…

    • Возможно, я ошибся при сборке утилиты stlink, не положив нужные библиотеки (*.dll). Так или иначе, на сегодняшний день статья несколько устарела, и вместо stlink лучше использовать OpenOCD, который работает быстро и надёжно. В дистрибутиве OpenOCD в папке scripts/board есть готовые конфиги для плат STM32xxxDiscovery, только нужно установить фирменный драйвер для отладчика ST-Link.

  21. Добрый день!
    У меня STM32F4 Discovery. Я скачал эклипс с CDT, gnuшный gcc для ARM и st-util, скачал некоторый набор библиотек для мой платы. По отдельности все работает — компилятор справляется со сборкой int main(){}, st-util и gdb позволяют связаться с платой. Но когда я пробую собрать хотя бы один проект с примером начинается полная фигня на этапе линковки.
    Пробовал разные скрипты. С вот таким:
    SECTIONS
    {
    PROVIDE(__executable_start = 0x0008000);
    . = 0x00008000 + SIZEOF_HEADERS;
    .interp: { *(.interp) }
    .note.ABI-tag: { *(.note.ABI-tag) }
    .hash: { *(.hash) }
    .dynsym: { *(.dynsym) }
    .dynstr: { *(.dynstr) }
    .version: { *(.version) }
    .version_d: { *(.version_d) }
    .version_r: { *(.version_r) }
    .rel.dyn: { *(.rel.dyn) }
    .rela.dyn: { *(.rela.dyn) }
    .rel.plt: { *(.rel.plt) }
    .rela.plt: { *(.rela.plt) }
    .init: { KEEP (*(.init)) }
    .plt: { *(.plt) }
    .text: { *(.text .text.*) }
    .fini: { KEEP (*(.fini)) }
    PROVIDE(__etext = .);
    PROVIDE(_etext = .);
    PROVIDE(etext = .);
    .rodata: { *(.rodata .rodata.*) }
    __exidx_start = .;
    .ARM.exidx: { *(.ARM.exidx*) }
    __exidx_end = .;
    . = ALIGN (CONSTANT (MAXPAGESIZE)) — ((CONSTANT (MAXPAGESIZE) — .) & (CONSTANT (MAXPAGESIZE) — 1));
    . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
    .tdata: { *(.tdata .tdata.*) }
    .tbss: { *(.tbss .tbss.*) }
    .preinit_array:
    {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array))
    PROVIDE_HIDDEN (__preinit_array_end = .);
    }
    .init_array:
    {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
    }
    .fini_array:
    {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
    }
    .dynamic: { *(.dynamic) }
    .got: { *(.got.plt) *(.got) }
    .data:
    {
    __data_start = .;
    *(.data .data.*)
    }
    _edata = .;
    PROVIDE(edata = .);
    __bss_start = .;
    __bss_start__ = .;
    .bss:
    {
    *(.bss .bss.*)
    . = ALIGN(. != 0? 32 / 8: 1);
    }
    __bss_end__ = .;
    _bss_end__ = .;
    . = ALIGN(4);
    __end = .;
    _end = .;
    PROVIDE(end = .);
    }

    Программа собирается, но при попытке загрузить ее получаю сообщение load failed.

    Со скриптом который шел в примере:
    /* Entry Point */
    ENTRY(Reset_Handler)

    /* Highest address of the user mode stack */
    _estack = 0x20020000; /* end of 128K RAM on AHB bus*/

    /* Generate a link error if heap and stack don’t fit into RAM */
    _Min_Heap_Size = 0; /* required amount of heap */
    _Min_Stack_Size = 0x400; /* required amount of stack */

    /* Specify the memory areas */
    MEMORY
    {
    FLASH (rx): ORIGIN = 0x08000000, LENGTH = 1024K
    RAM (rwx): ORIGIN = 0x20000000, LENGTH = 128K
    CCM (rwx): ORIGIN = 0x10000000, LENGTH = 64K
    }

    /* Define output sections */
    SECTIONS
    {
    /* The startup code goes first into FLASH */
    .isr_vector:
    {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
    } >FLASH

    /* The program code and other data goes into FLASH */
    .text:
    {
    . = ALIGN(4);
    *(.text) /* .text sections (code) */
    *(.text*) /* .text* sections (code) */
    *(.rodata) /* .rodata sections (constants, strings, etc.) */
    *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
    *(.glue_7) /* glue arm to thumb code */
    *(.glue_7t) /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .; /* define a global symbols at end of code */
    _exit = .;
    } >FLASH

    .ARM.extab: { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    .ARM: {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
    } >FLASH

    .preinit_array:
    {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
    } >FLASH
    .init_array:
    {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
    } >FLASH
    .fini_array:
    {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
    } >FLASH

    /* used by the startup to initialize data */
    _sidata = .;

    /* Initialized data sections goes into RAM, load LMA copy after code */
    .data: AT ( _sidata )
    {
    . = ALIGN(4);
    _sdata = .; /* create a global symbol at data start */
    *(.data) /* .data sections */
    *(.data*) /* .data* sections */

    . = ALIGN(4);
    _edata = .; /* define a global symbol at data end */
    } >RAM

    /* Uninitialized data section */
    . = ALIGN(4);
    .bss:
    {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .; /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .; /* define a global symbol at bss end */
    __bss_end__ = _ebss;
    } >RAM

    /* User_heap_stack section, used to check that there is enough RAM left */
    ._user_heap_stack:
    {
    . = ALIGN(4);
    PROVIDE ( end =. );
    PROVIDE ( _end =. );
    . =. + _Min_Heap_Size;
    . =. + _Min_Stack_Size;
    . = ALIGN(4);
    } >RAM
    }

    линковщик ругается на отсутствие .rel.plt секции. После добавления этой секции, он ругается на неопределенную ссылку на __libc_init_array.

    Прошу помощи со скриптом линковщика и если можно чуть подробнее описать процедуру загрузки и запуска программы в память и флеш stmки.

    Прошу прощения за длинный коментарий 🙂

  22. «Скачать CodeBench можно на сайте компании-разработчика как в виде инсталлятора (рекомендую), так и простым архивом»

    Скачал два варианта .bin — не устанавливаеться. получаю такое:
    nemo@nemo-MS-1688 ~/Downloads $ ./arm-2013.05-24-arm-none-linux-gnueabi.bin
    Checking for required programs: awk grep sed bzip2 gunzip
    ===============================================================
    Error: DASH shell not supported as system shell
    ===============================================================
    The installer has detected that your system uses the dash shell
    as /bin/sh. This shell is not supported by the installer.
    You can work around this problem by changing /bin/sh to be a
    symbolic link to a supported shell such as bash.
    For example, on Ubuntu systems, execute this shell command:
    % sudo dpkg-reconfigure -plow dash
    Install as /bin/sh? No
    Please refer to the Getting Started guide for more information,
    or contact CodeSourcery Support for assistance.
    ===============================================================
    nemo@nemo-MS-1688 ~/Downloads $ sudo dpkg-reconfigure -plow dash
    [sudo] password for nemo:
    nemo@nemo-MS-1688 ~/Downloads $ sudo dpkg-reconfigure -plow dash arm-2013.05-24-arm-none-linux-gnueabi.bin
    dpkg-query: package ‘arm-2013.05-24-arm-none-linux-gnueabi.bin’ is not installed and no information is available
    Use dpkg —info (= dpkg-deb —info) to examine archive files,
    and dpkg —contents (= dpkg-deb —contents) to list their contents.
    /usr/sbin/dpkg-reconfigure: arm-2013.05-24-arm-none-linux-gnueabi.bin is not installed

    , и в архиве(arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2). Linux Mint 15.

    Если так, то подскажите куда надо распаковать архив ( в какую папку, или какие пути прописать), чтобы всё заработало.
    Спасибо!

    • В чем проблема в первом случае?

      1. sudo dpkg-reconfigure -plow dash
      На вопрос отвечаешь да.

      2. Запускаешь установщик:
      sudo ./arm-2013.05-24-arm-none-linux-gnueabi.bin

      Должна пойти установка. НО! Судя по названию ты скачал инструментарий для сборки под встроенный в arm linux. Если не собираешься заливать линукс на стмку нужен дугой инструментарий. Мой назывался arm-2013.05-23-arm-none-eabi.bin

    • Скачал инструментарий как у вас. Вторая попытка тоже без успеха:

      nemo@nemo-MS-1688 ~/Tmp $ sudo dpkg-reconfigure -plow dash
      [sudo] password for nemo:
      nemo@nemo-MS-1688 ~/Tmp $ sudo ./arm-2013.05-23-arm-none-eabi.bin
      sudo: ./arm-2013.05-23-arm-none-eabi.bin: command not found
      nemo@nemo-MS-1688 ~/Tmp $
      
      
      
      
    • Могу угадать. Вероятнее всего не хватает прав на исполнение файла. chmod +x ./arm-2013.05-23-arm-none-eabi.bin поможет скорее всего. Если нет, то покажите листинг ls -l из каталога содержащего arm-2013.05-23-arm-none-eabi.bin

    • Не работает

      nemo@nemo-MS-1688 ~/Tmp $ sudo dpkg-reconfigure -plow dash
      [sudo] password for nemo:
      nemo@nemo-MS-1688 ~/Tmp $ sudo ./arm-2013.05-24-arm-none-linux-gnueabi.bin
      sudo: ./arm-2013.05-24-arm-none-linux-gnueabi.bin: command not found
      nemo@nemo-MS-1688 ~/Tmp $ . chmod +x ./arm-2013.05-23-arm-none-eabi.bin
      bash: .: /bin/chmod: cannot execute binary file
      nemo@nemo-MS-1688 ~/Tmp $ sudo . chmod +x ./arm-2013.05-23-arm-none-eabi.bin
      sudo: .: command not found
      nemo@nemo-MS-1688 ~/Tmp $
      

      листинг

      nemo@nemo-MS-1688 ~/Tmp $ ls -l
      total 222840
      -rwxr-xr-x 1 nemo nemo 124565511 May 28 17:51 amd-driver-installer-catalyst-13-4-x86.x86_64.run
      -rw-r--r-- 1 nemo nemo 103606667 Aug 19 21:37 arm-2013.05-23-arm-none-eabi.bin
      drwxr-xr-x 4 nemo nemo      4096 Jul 23 23:37 LibreOffice_4.1.0.4_Linux_x86_deb
      drwxrwxr-x 7 nemo nemo      4096 Jul 19 00:35 powertop-2.4
      nemo@nemo-MS-1688 ~/Tmp $
      
      
    • ОК. Из листинга видно что файл arm-2013.05-23-arm-none-eabi.bin имеет права -rw-r—r—. То есть прав на исполнение у вас нет. Значит их надо сперва получить, а затем пробовать исполнить скрипт. Для изменения прав доступа используется команда chmod, ее опция +x добавляет права на выполнение файла имя которого указывается после опции. Таким образом надо выполнить из каталога с файлом arm-2013.05-23-arm-none-eabi.bin команду: «chmod +x arm-2013.05-23-arm-none-eabi.bin»
      Без точки и без кавычек, я точку поставил исключительно как знак препинания в конце предлоения :)))

      После выполнения chmod смотрим появились ли права на исполнение (буква x) командой ls -l. Затем выполняем скрипт
      sudo ./arm-2013.05-23-arm-none-eabi.bin

      Если что не будет получаться присылай листинг.

    • Достал я Вас уже… Права на исполнение есть, но дальше никак:

      total 222840
      -rwxr-xr-x 1 nemo nemo 124565511 May 28 17:51 amd-driver-installer-catalyst-13-4-x86.x86_64.run
      -rwxr-xr-x 1 nemo nemo 103606667 Aug 19 21:37 arm-2013.05-23-arm-none-eabi.bin
      drwxr-xr-x 4 nemo nemo      4096 Jul 23 23:37 LibreOffice_4.1.0.4_Linux_x86_deb
      drwxrwxr-x 7 nemo nemo      4096 Jul 19 00:35 powertop-2.4
      nemo@nemo-MS-1688 ~/Tmp $ sudo ./arm-2013.05-23-arm-none-eabi.bin
      Checking for required programs: awk grep sed bzip2 gunzip
      ===============================================================
      Error: DASH shell not supported as system shell
      ===============================================================
      The installer has detected that your system uses the dash shell
      as /bin/sh.  This shell is not supported by the installer.
      You can work around this problem by changing /bin/sh to be a
      symbolic link to a supported shell such as bash.
      For example, on Ubuntu systems, execute this shell command:
         % sudo dpkg-reconfigure -plow dash
         Install as /bin/sh? No
      Please refer to the Getting Started guide for more information,
      or contact CodeSourcery Support for assistance.
      ===============================================================
      nemo@nemo-MS-1688 ~/Tmp $
      
      
    • Сделалал так sudo ln -sf bash /bin/sh, потом запуск установки — получилось! Спасибо огромногое!!!

    • Этим действием ты убрал из системы /bin/sh. Потом она может понадобиться для запуска какого-нибудь скрипта. Теоретически можно просто загрузиться с флешки или liveCD (естественно это должна быть та же версия дистрибутива что и устанволена на ПК) и скопировать /bin/sh с образа на винт в каталог /bin.

      sudo mount /dev/sd[a..z][1..20] /mnt (как идентифицируются винты и работает mount советую разобраться самостоятельно, потом часто будет нужно)
      sudo cp /bin/sh /mnt/bin
      sudo umount /mnt
      sudo reboot

      Установщик сам же сказал выполни sudo dpkg-reconfigure -plow dash, а потом я запущусь, внимательнее надо 😉

    • Туда же закиньте файл stm32l152rb.ld.

      а где взять *.ld файл для другого микроконтроллера? у меня например SMT32F103RB

    • Меня как-то смутило то, что по запросу SMT32F103RB гугл выдал всего 4 результата. Надо смотреть, что написано на корпусе чипа, а не на плате. Тогда скоре всего нужный скрипт очень быстро нагуглится.
      Я бы сперва попробовал использовать приведенный в уроке скрипт, может быть все заработает.
      stm32l152rb.ld — это скрипт линковщика в котором указано какие секции по каким адресам размещать в исполняемом файле, если у тебя тот же cortex-m3 то различия могут быть только в размере памяти и адресах. В этом случае поправить скрипт вполне реально. Инструкции есть, к примеру вот: fun-tech.se/stm32/linker/

  23. Здравствуйте. Очень интересная статья.
    А чем изменится настройка среды для платы: NXP ARM Cortex-M3 lpc1768-mini-dk2 (http://www.ebay.com/itm/NXP-ARM-Cortex-M3-LPC1768-Mini-DK2-Development-board-/181045434143?hash=item2a2726171f). В качестве программатора/отладчика используется предыдущая версия: JetLink (http://starterkit.ru/html/index.php?name=shop&op=view&id=51), в продаже я ее не нашел уже. Я так понимаю, изменится Sourcery CodeBench Lite Edition на что-то другое и stlink на некую библиотеку jetlink, но где искать это все? Плата discovery у меня тоже имеется (stm32f3discovery ARM Cortex-M4 STM32F303VCT6), но у нее нет ethernet.

    • Похоже на то, что Eclipse пытается запустить ваш .elf как обычный исполняемый файл. Вероятно, у вас ошибка в отладочной конфигурации, или вместо подключения к GDB server используется обычная. А вообще, данная статья устарела, лучше перепроверить по другим источникам.

  24. После ознакомления с замечательной статьей
    Попробовал настроить IDE для Fedora RFRemix release 22 (Twenty Two)
    >uname -a
    Linux sasha 4.0.8-300.fc22.x86_64 #1 SMP Fri Jul 10 21:04:56 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    Опишу свои изыски.

    1. Установил:
    >sudo dnf install arm-none-eabi-gcc-cs-c++ eclipse-nls-ru eclipse-cdt-parsers qemu-system-arm eclipse-color-theme arm-none-eabi-gdb
    2. Погуглив нашел ресурс:
    3. Установил согласно инфы:

    Installation of System Workbench for STM32 — Bare edition will be done through the standard Eclipse installer.

    You should Start Eclipse then open menu «Help >> Install New Software»; this will open the «Available Software» dialog:

    You must then create a new update site, to be able to install System Workbench for STM32 — Bare Metal Edition:

    You should click on «Add:»
    Then give a name to the update site (System Workbench for STM32 — Bare Machine edition) and set the location to http://www.openstm32.org/Eclipse-updates/org.openstm32.system-workbench.site
    Then click «OK» to create the update site

    Warning: During the beta phase the address to use is http://www.ac6-tools.com/Eclipse-updates/org.openstm32.system-workbench.site

    Then you should select all of the OpenSTM32 tools and click «Next>»

    You will then just have to accept the license and System Workbench for STM32 — Bare Metal edition will install itself in your Eclipse setup.

    Note that you will probably have to restart Eclipse for the tools to be available; Eclipse will automatically suggest the restart.

    4. Создал пустой проект для платы STM32L100C-DISCO.
    5. Все запустилось с первого раза без бубна.

  25. Скачал вашу сборку, при попытке собрать проект ошибка
    Description Resource Path Location Type
    *** незавершённая ссылка на переменную. Останов. makefile /stm32f103c_template/Debug line 46 C/C++ Problem
    строка на которую появилась ошибка в makefile
    @echo ‘Building target: $@’

    proff@denis:~$ uname -a
    Linux denis.ustinov 4.4.0-83-generic #106-Ubuntu SMP Mon Jun 26 17:54:43 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    Ubuntu 16.04.2 LTS

  26. А в популярной, не знаю, почему, среде Keil ещё и редактор кода, судя по его виду и удобству, написан во времена Windows 95…
    Вы EWARM запускали? NotePad++ и то в сто раз информативнее и круче. Позор для такой крутой и дорогой среды. Там ни подсветки синтаксиса нормальной, ни автодополнения, ни, тем более, ха — ха, интеллисенса минимального… Кейл, ИМХО, выглядит поцивильнее, еще, чем эта EWARM)))
    Хотя, согласен, далеко не Microsoft Studio))

  27. у меня stm32l-discovery вроде сделал всё как надо под убунту, компилится всё норм, но когда нажимаю дебаг, то выдает

    /bin/bash: /home/animashko/workspace/test/Debug/test.elf: не удалось запустить двоичный файл
    /bin/bash: /home/animashko/workspace/test/Debug/test.elf: Победа
    

    в файле gdb_commands_debug

    tar ext :4242
    load Debug/test.elf

    з.ы. проект называется test
    помогите залить на платку

    • Победа

      Русский перевод такой русский LOL

      Не уверен в причине ошибки, но вы могли забыть заменить в gdb на arm-none-eabi-gdb в отладочной конфигурации.

      Вообще, если у вас не работает, значит вы что-то сделали неправильно (если версии софта, конечно, те же). Проверьте, правильно ли вы настроили проект и отладочную конфигурацию. Опять же, какая у вас версия софта, как ставили — вручную или из репозитория? И т.п.

    • Не уверен в причине ошибки, но вы могли забыть заменить в gdb на arm-none-eabi-gdb в отладочной конфигурации.

      спасибо, действительно забыл) всё прошилось)

    • Моё искусство телепатии растёт с каждым днём 😀

  28. mingw/msys не ставил, какой make надо использовать с Eclipse. Тот что есть дает ошибку

    makefile:12: *** missing separator.  Stop.

    Может Eclipse но гдето подстроить.

    • Вопрос решился, у меня в пути присутствовал символ #

      C:\\#Project\STM\STM32\stm32vld_quickstart

      именно он и мешал, с такой проблемой столкнулся впервые другие IDE пропускают.

  29. Не могу заставить это штуку работать…
    Если делать как в статье, то в этом месте "Сервер должен отреагировать кучей сообщений в консоли:" получаю не кучу сообщений, а ошибку:

    GDB connected.
    cannot recv: -2

    Полный код запуска st-util:

    vlad@linux-klyo:~/Program_Files/ST-LINK/stlink/gdbserver> ./st-util
    2013-10-11T15:51:47 INFO src/stlink-common.c: Loading device parameters....
    2013-10-11T15:51:47 INFO src/stlink-common.c: Device connected is: F4 device, id 0x10016413
    2013-10-11T15:51:47 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
    Chip ID is 00000413, Core ID is  2ba01477.
    Target voltage is 2880 mV.
    Listening at *:4242...
    KARL - should read back as 0x03, not 60 02 00 00
    GDB connected.
    cannot recv: -2
    Listening at *:4242...
    ^C

    Не выходит даже загрузить прошивку из терминала, без Eclipse. В туториале пишут использовать st-flash,
    ./st−flash writein.bin 0x8000000
    но она принимает аргументом .bin-файл, а есть только .hex и .elf. С ними не грузит. Второй вопрос — как узнать в какой адрес памяти грузить прошивку? Или цифру 0x8000000 не надо трогать?

    Буду очень благодарен за помошь.

    • Решено.
      1. установить плагин для аппаратной отладки Help->Install New Software C/C++ GDB Hardware Debugging;
      2. идем Run->External Tools->External Tools Configurations… создаем новую конфигурацию. в поле location пишем /usr/local/bin/st-util или где у вас он;
      3. идем Run->Debug Configurations->GDB Hardware Debugging Создать новую конфигурацию.
      вкладка Main В поле C/C++ Application указываем расположение и название *.elf файла (Debug/test.elf), в поле Project название проекта (test).
      вкладка Debug GDB command = arm-none-eabi-gdb или полный путь. Ставим галочку Use remote target. generic tcp/ip. localhost. 4242.
      вкладка StartUp Ставим галочку Set breakpoint at = main. галочку Resume

      благодарности we.easyelectronics.ru/STM32/otladka-stm32-v-srede-eclipsegcc.html

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение