Библиотека libmaple на STM32VLDiscovery

Предположим, заказал человек бесплатную плату Дискавери, хочется что-нибудь с ней сделать, а разбираться в регистрах, периферии, тактировании лень. Вот если бы всё было так же просто, как в Arduino…
Ну что же.
1. Качаем компилятор, например отсюда,
2. Также скачиваем Discovery-версию библиотеки libmaple.
3. Установим компилятор, например в папку C:\ARM-compiler, добавим в переменную окружения PATH строчку C:\ARM-compiler\arm\bin;
4. Библиотеку ставим, например в папку C:\libmaple
Среда готова.
5. Сохраняем пример в файл main.cpp в папку libmaple
#include "wirish.h"

void setup() {
    /* Set up the LED to blink  */
    pinMode(BOARD_LED_PIN, OUTPUT);
}

void loop() {
    toggleLED();
    delay(100);
}

// Force init to be called *first*, i.e. before static object allocation.
// Otherwise, statically allocated objects that need libmaple may fail.
__attribute__((constructor)) void premain() {
    init();
}

int main(void) {
    setup();

    while (true) {
        loop();
    }

    return 0;
}

6. Запускаем make в коммандной строке. Предположим, что с Arduino мы раньше работали и make.exe у нас есть.
7. Заливаем прошивку из С:\libmaple\build\discovery.bin в Дискавери при помощи ST-Link Utility
8. Наслаждаемся миганием

Пара ссылок: Несколько примеров для Дискавери, документация libmaple.

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

RSS свернуть / развернуть
Ну вот сунулся в Несколько примеров для Дискавери, в нем в хардварный таймер. Первое впечатление, что писал человек, не знакомый с программированием вообще. Поясню: нам дается пример, котором в прерывании преспокойно меняются не-volatile переменные и потом не менее спокойно используются в основной программе. Мало-мальски уважающий себя оптимизатор так же спокойно выкинет эти переменные как неиспользующиеся в программных вызовах — и будет прав. Вот такие примеры.
0
Точно они не volatile, нет ли в их объявлении квалификатора _IO? Можете дать координаты этого примера?
0
Имеется в виду этот скетч, скорей всего: snipt.net/ridgebackred/hardwaretimerslcd
Если код работает, то, по-видимому, gcc -Os не
оптимизирует глобальные переменные описанным образом.
Ковалев прав, конечно, переменные, используемые
в прерываниях, надо определять как volatile.
0
Ковалев неправ в выборе тона комментария. Прошу прощения, шибко уставший был, день тяжелый, на людей бросался. Прямо хоть стереть мои пассажи… :)
0
Понятно, я почему-то подумал, что речь идёт о примерах от ST.
0
Эмм, попытался откомпилить
сначала мотюгнулся
[CC] ./libmaple/adc.c
cc1.exe: warnings being treated as errors
libmaple/adc.c:1:0: error: switch -mcpu=cortex-m3 conflicts with -march= switch
make: *** [build/./libmaple/adc.o] Error 1
В makefile удалил дважды ключик
-march=armv7-m
Вроде начал компилиться, но с варнингом
wirish/comm/HardwareSPI.h:62:2: warning: #warning «Unexpected clock speed; SPI frequency calculation will be incorrect»
И вообще вываливается с ошибкой.
[CC] ./libraries/FreeRTOS/utility/port.c
C:\Users\99E7~1\AppData\Local\Temp\ccZ12YDO.s: Assembler messages:
C:\Users\99E7~1\AppData\Local\Temp\ccZ12YDO.s:1539: Error: SVC is not permitted on this architecture
make: *** [build/./libraries/FreeRTOS/utility/port.o] Error 1

Ладно вечером посмотрю поподробней, но задумка зачетная =)
0
Странная ошибка… Может у вас ещё какая-нибудь версия компилятора стоит?
Варнинг насчет SPI clock speed совершенно прав, обычная Maple на 72 МГц, а на 24 нужны другие коэффициенты, чтоб получить ту же скорость обмена. Я SPI не пользовался, соответственно, пока руки не дошли.
Библиотека FreeRTOS у меня также нормально собирается, но если она не нужна, попробуйте закомментировать её в Makefile.
0
Да действительно, у меня стоял по дефолту yagarto и старый codesourcery, который оказался почему-то свежее чем предложенный вами 0_о
Codesourcery откомпилил и создал бинарник, но с ошибочкой опять же
Object file sizes:
�� ������ 䠩�: *.o
d:\gcc\arm\Sourcery\bin\arm-none-eabi-size.exe: 'a.out': No such file
make: *** [build/discovery.bin] Error 123
В дискавери пока не загружал т.к. ее дома нету =(

з.ы. По поводу варнинга прикольнуло
#if CYCLES_PER_MICROSECOND != 72
/* TODO [0.2.0?] something smarter than this */
#warning "Unexpected clock speed; SPI frequency calculation will be incorrect"
#endif
0
Несколько дополнений:
Если у вас установлен ST-LINK_CLI, пропишите его в пути и заливайте прошивку через make install.
Можно поверх среды поставить эклипс, можно аттолик лайт для отладки.
Ноги контроллера можно адресовать по номерам из таблицы для Maple или по именам вида PA1, PB2 и т.д.
0
Предположим, заказал человек бесплатную плату Дискавери, хочется что-нибудь с ней сделать, а разбираться в регистрах, периферии, тактировании лень.

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

Топик не минусую исключительно из своей душевной доброты.
-1
  • avatar
  • _YS_
  • 16 декабря 2011, 22:53
Если забыть про гипотетического героя, то libmaple все же вполне годный образец библиотеки, абстрагирующей железо. На нее AFAIK можно даже почти без изменения тянуть код с AVR, а это уже заметный шаг вперед. В отличие от periphlib, которая таки те же регистры, только в профиль — почти ноль абстракции, только чуть более удобна.
+1
Опять Вы подходите с позиций профессионального разработчика, давным-давно разобравшегося со всей регистровой кухней и которому теперь важна только быстрота разработки и удобство реюзинга кода. Однако же в топике прямо сказано, что позиционируется все это для неофитов. Т.е., имеем очередной костыль для мозга, плодящий умственно бесплодных дилетантов. Которые, например, используют Arduino, чтобы сделать робота, ездящего по линии:

В скором я закончу два датчика света, и робот начнет выполнять свою первичную задумку- гонять по линии.

В то же время, любым здравомыслящим человеком это делается так.
+1
Осмелюсь напомнить, что разбираться со всей этой кухней я начал с богомерзкого васика и знаменитого во всем мире как «среда для нубов-кнопкошлепов» Delphi. И потому считаю, что Arduino — весьма хорошая вещь для старта.
Да и знать досконально до самого нижнего уровня надобности нет. Я, например, довольно слабо представляю себе, как на уровне транзисторов работает процессор. Уровень абстракции на то и уровень абстракции, что для успешной работы на нем не требуется знать, что лежит под ним.
В то же время, любым здравомыслящим человеком это делается так.
Не путай. Так делается любым схемотехником. На ардуине же делал программист. К тому же, в отличие от робота по ссылке, он легко может навесить на своего робота еще десяток датчиков и усложнить поведение — т.е. он расширяем. И не факт, что «здравомыслящий человек» не станет похож на смайлик «О_о», столкнувшись с ардуино. Очень уж часто я вижу их жалобы на то, что «программировать не умею, а чужую прошивку подпилить надо».
0
Осмелюсь напомнить, что разбираться со всей этой кухней я начал с богомерзкого васика и знаменитого во всем мире как «среда для нубов-кнопкошлепов» Delphi

Путь-то, конечно, у каждого свой. Но Вы таки разобрались, и я не соменваюсь, что в случае необходимости Вы без труда и библиотеку поправите, и модуль на асме напишете. А сколько Ардуинщиков может это? Сколько человек пришло с Ардуино к «нормальному» методу разработки? Один? Два?

Поймите меня правильно, сама плата очень даже неплоха. Удручает идеология.

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

Думаю, это слабо представляют даже те, кто писал его на VHDL. Это же физически невозможно, больно много там транзисторов. :) Тем не менее, думаю, что такое триггер Вы знаете. И даже догадываетесь, что такое АЛУ. :) Не путайте эрудицию и заучивание картинок и буковок. :)

Так делается любым схемотехником.

В наши дни Ъ-разработчик должен разбираться и в схемотехнике, и в программировании. Незнание чего-то одного легко приводит к экзотическим извращениям. И тут уже все зависит от задачи. Правильная идеология — «ничего лишнего». Если цель — просто сделать робота, катящегося по линии, то нафиг МК, хватит двух логических микросхем. Если же планируется расширять это до ОБЧР, то тут да, без кластера серверов не обойтись.

И не факт, что «здравомыслящий человек» не станет похож на смайлик «О_о», столкнувшись с ардуино.

Здравомыслящий человек разберется с Ардуино за полчаса. Чаще всего жалуются на неумение программировать такие же ардуинщики, только от схемотехники (либо Ъ-советские инженеры; но им в силу возраста простительно). Да, в полном соответствии с принципами природы, симметричный ардуинщикам вид нубов тоже есть.
0
Сколько человек пришло с Ардуино к «нормальному» методу разработки? Один? Два?
Те, кому хватило мозгов и желания учиться. Остальные и так были безнадежны, зачем о них вообще вспоминать? Пусть пишут свои мигалочки, если на большее не способны (или не хотят).
Алсо из ассемблерщиков тоже часто вырастают люди, зациклившиеся на низком уровне, не понимающие абстракции и ее важности и по каждому поводу вопящие об оверинжиниринге. Хороший специалист вообще штука редкая.
Здравомыслящий человек разберется с Ардуино за полчаса. Чаще всего жалуются на неумение программировать такие же ардуинщики, только от схемотехники
Я бы так не сказал. Программирование тоже своеобразного выверта моска требует. Хотя научить можно, да. Но жалобы от чисто радиотехников далеко не редкость, достаточно заглянуть в обсуждение почти любой (особенно слегка недопиленной) конструкции на МК.
Правильная идеология — «ничего лишнего».
Ну робот, все же, обычно таки не готовое изделие, а платформа для экспериментов. Закладывать туда расширяемость — разумно.
0
И тут уже все зависит от задачи. Правильная идеология — «ничего лишнего».
Критерии оптимальности сильно субъективны.
Если рассматривать личное время как ресурс, то человеку может оказаться дешевле купить за 16 долларов Teensy,
чем потратить 10 минут на отпиливание куска макетки.
Я уж про изготовление платы не говорю.
Чем там ещё надышишься по ходу?
Озоном, растворителем, хлором, ацетоном, бензином, висмутом, свинцом…
Да и загаживание мозга ерратами от очередного контроллера, который через год устареет безнадежно, вряд ли сделает человека умнее.
Понятно, что можно. Но зачем? Из любви к процессу?
+1
Понятно, что можно. Но зачем? Из любви к процессу?
Ну да. Собсно, это единственное, из-за чего этим и занимаемся.
0
Таки да, из любви к процессу. Те же, кто не любят подобный процесс, могут покупать готовое, платя тем самым деньги тем, кто оный процесс любит.
0
Насчет позиционирования, вероятно стоит почитать первоисточник. Там внутри библиотеки есть разные уровни на все вкусы. А сверху да, прикручен wirish который, собственно, реализует уже «уровень ардуины». Вот именно этот уровень и позиционируется для неофитов (что вполне логично).
0
Код тянуть можно, но не с AVR, а с Ардуино.
Проблемы обычно связаны с различиями в компиляторах.
Например, когда переносили на Maple SdFat, потребовалось
добавить __attribute__ ((packed)) в конце каждой структуры.
0
Подскаже плз, какие преимущества у libmaple, перед, скажем Standard Peripherial Library от ST (от CooCox тоже что-то было?)? Идея, насколько я понял похожа — регистры завёрнуты в структуры, написаны функции инициализации\деинициализации периферии.
0
SPL — библиотека для работы с периферией от STM. По уровню абстракции не отличается от самих регистров, для каждого семейства STM SPL своя, причем совершенно несовместимая (так, например, на STM32 для инициализации нужно заполнить структуру с параметрами и передать ее в функцию чтототам_Init, тогда как в STM8 все параметры непосредственно передаются в эту функцию). Это сильно снижает ее ценность, единственная польза — работа через нее проще (не всегда) и более человекочитаема.

Библиотеки CooCox, насколько я понял — библиотеки-обертки, преимущественно на периферию, позволяющие тягать код с минимальными изменениями между поддерживаемыми кокосом контроллерами (это несколько различных серий МК на ядре ARM).

libmaple — это (на верхнем уровне, другие не знаю) фреймворк, аналогичный ардуино, только для МК на основе ядра ARM (не знаю какие именно серии поддерживает). Почти совместим с Arduino (есть некоторые небольшие отличия в API, плюс отличия, связанные с разрядностью проца и другими аппаратными отличиями), что позволяет тягать код с Arduino-AVR с минимальными изменениями. Плюс к тому резко упрощает работу, собсно, как Arduino для AVR.
0
P.S. В общем, libmaple заметно выше по уровню абстракции, чем SPL или библиотеки CooCox, плюс к тому, сама разделена на несколько уровней абстракции и при желании можно от части верхних уровней (скажем, Arduino-совместимого Wirish'а) отказаться.
0
Ну собственно именно в этом режиме (только C-часть библиотеки, без C++ части Wirish) — она меня и заинтересовала. А какие там ещё уровни есть, больше вроде бы ничего не нашел, по .c\.h файлу для каждого типа периферии и вроде бы всё?

Объясню мотивацию: если для AVR\STM8 у меня ещё получается держать регистры в голове и прямо так писать в коде, то для STM32 всё, чувствую, будет заканчиваться (демо-платы у меня ещё нет) заворачиванием объёмных кусков инициализаии чего-нибудь в свои функции, вот и думаю — зачем изобретать своё, если кто-то уже это написал :) Make sense?
0
Имеет смысл спланировать, какая периферия вам потребуется и посмотреть, реализована ли она в libmaple. Там навскидку не больше процентов 30 функционала охвачено.
0
Спасибо за ответ, навскидку — чего из нужного нет?
0
Ну, из того, что народ на моей памяти делал сам — последовательный запуск двух ацп. Ещё таймера в режиме измерения интервалов.
0
Если не секрет — почему вообще к ней обратился? Судя по тому, что ты сделал сам и с SPL справился бы :)
0
Чтобы использовать ардуиновский софт.
0
Честно говоря, мои познания в libmaple почти ограничиваются тем, что написано в этом треде (и еще в одном по соседству) :) Сам я с ней еще не работал, так что не знаю, какие есть уровни.
Свое изобретать обычно приходится если готовое чем-то не устраивает. А работать напрямую через регистры — обрекать себя на переделку в ближайшем будущем (при доработке проекта например, попытке перенести его куда-то на другую платформу, либо просто при попытке утянуть кусок кода одного проекта в другой).
Имеет смысл спланировать, какая периферия вам потребуется и посмотреть, реализована ли она в libmaple. Там навскидку не больше процентов 30 функционала охвачено.
В принципе, если подход libmaple понравится — вполне можно дописать и еще в том же стиле, для требуемой периферии.
0
Прошу извинить, что спровоцировал холивар,
хотя не скажу, что ненамеренно.
Я действительно считаю, что прогресс двигают лентяи.

Всё же хотелось бы услышать тех, кто попробовал скомпилировать и прошить.
0
компилил. библиотеки те что идут в комплекте тоже компилятся. а вот в OneWire проблема… вот сижу мучаю…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.