Изучение STM32

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

Всем привет! Немного "поигравшись" с 8051, ATtiny13 и ATmega8, сделав несколько проектов, захотелось (для академического интереса) опробовать альтернативную "линейку" микроконтроллеров. Выбор пал, несложно догадаться на STM32. Причины описывать думаю не стоит, так как они весьма банальны.

Около месяца, или даже больше читал всякие обзоры и прочее "STM32 с нуля". Если честно - после AVR показалось все не просто сложно, а очень сложно. Но это вызвало еще больший интерес.

Первым делом, решил купить железо. Хотел дискавери, но черт дернул и купил не его, а просто плату с контроллером и программатор (и вроде как отладчик ST-LINK 2). И то и другое - китайского производства.

Вот плата с контроллером:

Изображение

А вот программатор:

Изображение

Скоро все это добро придет по почте. Надеюсь этого хватит что бы "взглянуть" на STM32. Макетная плата есть.

Дальше по софту - решил попробовать Keil (много положительных отзывов). Правда там ограничение в 32к - но думаю этого хватит на небольшие проекты. Скачал версию 5. Установил. Оказалось все немного не так как в 4-ой версии (под которую почти все обучалки). При создании проекта вылезло вот такое окно, что в нем выбрать? Или просто закрыть?

Окно:

Изображение

Спасибо!
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Если для академического интереса, то ищи как создать пустой проект и начинай все с чистого листа. А так описание же справа есть, все четко написано. Выбирай пункт Device. Судя по описанию там только стартап файл и базовая инициализация, не с самого нуля конечно, но тоже неплохо.
Реклама
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн янв 13, 2014 18:01:27
Откуда: Жуковский

Сообщение kisoft »

"При создании проекта вылезло вот такое окно"
Это окно позволяет доустановить разные пакеты нужных устройств и т.п. Нужно найти свой МК и установить для него пакет, CMSIS, что еще нужно.
К 5.01 еще можно доустановить Legacy Support, тогда будет всё "как раньше", иначе список устройств будет маленький. Я для Tiva C от TI доустанавливал Legacy и получил в списке свой МК. Всё работает нормально.
Насколько сильно глючит - не знаю, пока мало ковырялся.
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

Спасибо за ответы!

Интуитивно поставил два чек-бокса таким образом:

Изображение

И ... проект, вроде как создался. Появилось вот такое "дерево":

Изображение

Попробовал собрать, и ничего не вышло. Возможно что-то не так выбрал там.

Код: Выделить всё

Build target 'Target 1'
compiling system_stm32f0xx.c...
linking...
.\test.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
.\test.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'.
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 1 warning and 1 error messages.
".\test.axf" - 1 Error(s), 1 Warning(s).
Target not created
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн янв 13, 2014 18:01:27
Откуда: Жуковский

Сообщение kisoft »

C F0 я не пробовал, но по ошибкам видно:

--entry - это параметр для линкера (можно открыть свойства проекта и найти этот параметр на странице Linker. Т.е. это точка запуска проекта. Для Tiva C у меня Reset_Handler расположен в startup файле, возможно и здесь его нужно искать там (system_stm32f0xx.c). В этой точке есть вызов настройки камня (для разных - по разному), затем вызов main.

-- first - в тех же параметрах - это таблица векторов прерываний (искать в том же файле __Vectors, скорей всего его там нет, но посмотреть как он там называется и заменить в параметрах линкера).
Хотя это всё странно и как то через одно место.

Еще, не знаю как для STM32, но для моего камня нужно было еще прописать на странице параметров C/C++ проекта define для выбранного MK. Проверить, что на странице Device выбран Ваш камень. На следующей - правильно выбрана частота кварца.
Потом по любому потребуется добавить main.c и в нем хотя бы int main(void) { while(1); } это чтобы проект полностью скомпилировался.

UPD: таблица векторов обычно в startup_stm32f0xx.S файле (или типа того) бывает, а system содержит различные настройки, почему его нет в Вашем проекте - непонятно.

ИМХО, лучше открыть проект из примеров, самый простой (какой нибудь hello или blink) и посмотреть структуру проекта там, потому что в двух словах трудно объяснить, что нужно настраивать :)
Реклама
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

kisoft писал(а):ИМХО, лучше открыть проект из примеров, самый простой (какой нибудь hello или blink) и посмотреть структуру проекта там, потому что в двух словах трудно объяснить, что нужно настраивать :)
Спасибо. Несколько раз прочитал Ваш ответ, но понял что мало что понял. Пример было бы замечательно, но не нашел ничего под Keil 5 + F030. Уже посещает идея поставить Keil 4.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

mihailkapitanov , вместо бездумного освоения методом тыка, лучше прочитать справку на IDE - как создать проект.
Хотя создание проекта в Keil практически ничем не отличается от создания в других IDE .
Естественно особо тяжело "выходцам" с AVR , тем более тем кто пользовал "визажисткие" облегчалки типа CVAVR .

Ну для начала вместо тыкания в визарде (Manage run time evriroment), тупо скопировать в папку проекта и подключить :

Из Keil\ARM\Pack\Keil\STM32F0xx_DFP\1.0.0\Device\Source\ system_stm32f0xx.c
Из Keil\ARM\Pack\Keil\STM32F0xx_DFP\1.0.0\Device\Source\ARM\ startup_stm32f0xx.s
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

dosikus писал(а):IDE - как создать проект.
Прочитал. Как оказалось делал все правильно.
dosikus писал(а):Хотя создание проекта в Keil практически ничем не отличается от создания в других IDE .
Похоже на то.
dosikus писал(а):Естественно особо тяжело "выходцам" с AVR , тем более тем кто пользовал "визажисткие" облегчалки типа CVAVR .
Вначале действительно пробовал CVAVR - не пошло. Остановился на WinAVR - там супер просто. Один мейк файл (несколько строк), и main.c. Вот и все.
dosikus писал(а): Ну для начала вместо тыкания в визарде (Manage run time evriroment), тупо скопировать в папку проекта и подключить :
Из Keil\ARM\Pack\Keil\STM32F0xx_DFP\1.0.0\Device\Source\ system_stm32f0xx.c
Из Keil\ARM\Pack\Keil\STM32F0xx_DFP\1.0.0\Device\Source\ARM\ startup_stm32f0xx.s
Насколько я понял это произошло автоматически (видно на картинке выше). Кроме этого я создал main.c, подключил его к проекту ... и он даже скомпилировался.

Вот такой текст:

Код: Выделить всё

int main(void)
{
	while(1)
	{
	};
};
Но линковка так и не работает. Может какой-нибудь #include добавить в начало? Ну как в AVR делалось.

Код: Выделить всё

Rebuild target 'STM32F030F4'
compiling main.c...
compiling system_stm32f0xx.c...
linking...
.\test.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
.\test.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'.
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 1 warning and 1 error messages.
".\test.axf" - 1 Error(s), 1 Warning(s).
Target not created
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

mihailkapitanov писал(а):
Насколько я понял это произошло автоматически (видно на картинке выше). Кроме этого я создал main.c, подключил его к проекту ... и он даже скомпилировался.
Увы, не произошло . Сей визард копирует только system , стартап НЕТ !


В main.c так же надо прописать #include <stm32f0xx.h>. Это вылезет потом, когда к регистрам начнешь обращаться...

ЗЫ. Последняя точка с запятой лишняя ...
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

dosikus писал(а):Увы, не произошло . Сей визард копирует только system , стартап НЕТ !
Спасибо огромное. Создал пустой проект (не тыкая галки в мастере вообще).

Потом добавил main.c

Код: Выделить всё

#include <stm32f0xx.h>

int main(void)
{
	while(1)
	{
	};
};
Потом добавил файлы system_stm32f0xx.c и startup_stm32f0xx.s (просто скопировал). Получилось такое дерево:

Изображение

Надеюсь правильно его оформил. Нажал собрать - и УРА собралось. Оказалось не сложно.

Код: Выделить всё

Rebuild target 'STM32F030F4'
compiling main.c...
compiling system_stm32f0xx.c...
assembling startup_stm32f0xx.s...
linking...
Program Size: Code=1180 RO-data=224 RW-data=20 ZI-data=1636  
".\test.axf" - 0 Error(s), 0 Warning(s).
Получается программа, совершенно пустая 1180 или даже 1636 (не понял что общий объем кода) байт? Многовато что ли. Насколько я понял "ЭТО" можно уже лить в контроллер и будет работать?
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Точку с запятой последнюю убери и можешь лить . :))) Только чему там работать то ?
Не забудь дебаггер настроить .

Помимо твоего пустого кода, создается еще настройка тактирования , настройка стека/кучи и много чего...

ЗЫ. Схема на плату есть ? Могу набросать код тебе на изучение. Что есть из периферии мелкого - типа светодиодов ?
Хотя можешь отсюда начинать копипастить http://kazus.ru/forums/showthread.php?t=106689
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

dosikus писал(а):Точку с запятой последнюю убери и можешь лить . :)))
Пробовал убирать и ставить обратно - не ошибок не предупреждений. Нашел целую тему по этому поводу: http://www.rsdn.ru/forum/cpp/83591.all
Как оказалось лучше не ставить, следовательно я тоже убрал. И после while тоже. Хотя компилятору как-то все равно, что ли ...
dosikus писал(а):Только чему там работать то ?
Ну там же больше килобайта кода, а это, между прочим больше чем вся ATtiny13. Неужели это "бесполезный" код?
dosikus писал(а):Не забудь дебаггер настроить .
Программатор и плата еще в пути. Это я так, проба пера в IDE.
dosikus писал(а):Помимо твоего пустого кода, создается еще настройка тактирования , настройка стека/кучи и много чего...
После AVR этот код выглядит просто огромным.
dosikus писал(а):ЗЫ. Схема на плату есть ? Могу набросать код тебе на изучение. Что есть из периферии мелкого - типа светодиодов ?
Плата еще в пути, возможно схема есть в комплекте, но однозначно не уверен. Код на изучение - был бы рад! Микроконтроллеры интересные, недорогие, быстрые и кроме того TSSOP-20 не сложно паять если что. Из периферии - светодиоды есть, ну и еще чего по мелочи. Но нужно ждать посылку.

Кстати, читал что нужно еще к проекту подключать CMSIS (что-то с ядром связанное как я понял) и SPL. Еле нашел этот SPL в дебрях st.com. Вот вроде он: stm32f0_stdperiph_lib.zip. Но как приклеить его к проекту не понял еще.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

mihailkapitanov писал(а): Ну там же больше килобайта кода, а это, между прочим больше чем вся ATtiny13. Неужели это "бесполезный" код?
А кто саказал что это бесполезный код ?
..............
Точка с запятой после блока это пустой оператор ...
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Все включено :))

По SWD разъему на плате видно, что её сделали в кЕтайской провинции :solder:
Вложения
STM32F0.RAR
(586.06 КБ) 556 скачиваний
Иван Сусанин - первый полупроводник :solder:
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

Myp3ik писал(а):Все включено :))
Огромное спасибо! Как раз пустой проект, все работает. Кстати, а нет случайно "шаблонного" проекта STM32F030 для avr-none-eabi?
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

mihailkapitanov писал(а):
проекта STM32F030 для avr-none-eabi?
:)))
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт сен 24, 2013 15:51:50

Сообщение mihailkapitanov »

Отвечаю сам. Нашел: https://github.com/szczys/stm32f0-disco ... c-template. Попробовал - собралось под Windows и Linux без проблем. Кажется (не уверен) что для STM32F030F4 подойдет. Плата выше.
Открыл глаза
Сообщения: 56
Зарегистрирован: Сб июн 14, 2014 09:05:06

Сообщение kapitan0v »

mihailkapitanov писал(а):STM32F030 для avr-none-eabi?
Ага, сам посмеялся с этого. :))

Сразу приношу извинения что пишу с другой учетной записи. К прошлой был утерян и пароль и почта.

Все еще продолжаю вникать в STM32. STM32F030 отложил пока в сторону и приобрел STM32F0Discovery (с STM32F051R8). Случайно в datasheet обнаружил что у STM32F030 всего 1 000 циклов перезаписи flash, а в STM32F051 - 10 000. Поэтому, как мне показалось, для изучения лучше подходит STM32F051, когда firmware загружается очень часто.

Сейчас использую связку: OS X + arm-none-eabi toolchain + ST-LINK + Sublime Text 2. Не Keil, конечно, но тоже вполне удобно.

Для сборки проекта использую вот такой Makefile:
Спойлер

Код: Выделить всё

DEFINES = DEBUG STM32F051

SOURCES = src/main.o src/my_debug.o
STARTUP = startup/startup_stm32f051.o
SYSTEM = cmsis/system_stm32f0xx.o
LDSCRIPT = stm32f051r8_flash.ld

OBJS = $(STARTUP) $(SYSTEM) $(SOURCES)
INCLUDES += cmsis src

AS = /usr/local/bin/arm-none-eabi-as
CC = /usr/local/bin/arm-none-eabi-gcc
CP = /usr/local/bin/arm-none-eabi-objcopy
LD = /usr/local/bin/arm-none-eabi-gcc
SZ = /usr/local/bin/arm-none-eabi-size
ST-FLASH = /usr/local/bin/st-flash
RM = /bin/rm -f

CFLAGS = $(addprefix -D, $(DEFINES)) $(addprefix -I, $(INCLUDES)) -mcpu=cortex-m0 -mthumb
LDFLAGS = -Tld-scripts/$(LDSCRIPT) -nostartfiles

CLEAN = firmware.bin firmware.elf $(OBJS)

all: clean firmware.bin size

clean:
	$(RM) $(CLEAN)

run:
	$(ST-FLASH) write firmware.bin 0x8000000 2> /dev/null

size:
	$(SZ) firmware.elf

firmware.bin: firmware.elf
	$(CP) -Obinary firmware.elf firmware.bin

firmware.elf: $(OBJS)
	$(LD) $(LDFLAGS) $^ -o $@

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

%.o: %.s
	$(AS) -c $< -o $@
Есть небольшая странность. Если указать так:

Код: Выделить всё

LD = /usr/local/bin/arm-none-eabi-gcc
проект собирается, а вот если так:

Код: Выделить всё

LD = /usr/local/bin/arm-none-eabi-ld
получается вот такая ошибка:

Код: Выделить всё

/usr/local/bin/arm-none-eabi-ld -Tld-scripts/stm32f051r8_flash.ld -nostartfiles startup/startup_stm32f051.o cmsis/system_stm32f0xx.o src/main.o src/my_debug.o -o firmware.elf
/usr/local/bin/arm-none-eabi-ld: cannot find libc.a
make: *** [firmware.elf] Error 1
Так и не разобрался в чем дело, может кто в курсе?

Далее, хочу обратить внимание на то, что относительно SPL (она же Standard Peripherals Library) сложилось мнение что это как бы "треш и угар" (by DI HALT) и что для новичков оно только вред чем польза (by dosikus). Ну что ж, позвольте не согласится. Я начал пробовать писать код используя именно эту библиотеку, и ни разу об этом не жалею.

В основном преимущества SPL описываются так: хорошо читаемый код, удобство пользования, blah-blah-blah ... Но мне кажется преимущества SPL как раз в другом. Давайте посмотрим что мы получим изучая SPL:
  • Изучая SPL вы изучите как SPL так и работу с периферией "через регистры". А это - в два раза больше знаний.
  • Вы научитесь искать баги в библиотеке и героически исправлять их (полезный опыт).
  • Вы научитесь пользоваться отладчиком. В моем случае это был gdb.
  • Вы научитесь читать, и исправлять чужой код (а это однозначно лишним не будет).
  • Вы узнаете как реализовать некоторые алгоритмы самым невероятным и неоднозначным способом, познакомитесь с примерами т.н. индусского кода (разминка для мозга же).
  • Кроме того SPL поможет использовать весь потенциал МК! Вы без проблем используете лишние мегагерцы и килобайты вашего МК, SPL тут лучший помошник!
Так что использовать SPL на этапе первого своения - рекомендую. Ну а потом ... перемещаете библиотеку в /dev/null и пользуетесь регистрами. :))

На данном этапе, для меня, лучший друг и помощник - это datasheet. Я даже начал конспект в тетрадке вести, вот в такой маразм я впал. :))) Для STM32F0 их аж три штуки (или больше?) нужно, а не один как было с ATMEGA8. Но, не проблема в принципе.

Кстати, нашел на сайте ST неплохой архив для F0: stm32snippets. Там есть примеры использования периферии без SPL. Гляньте, кому интересно.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

kapitan0v писал(а):
  • Изучая SPL вы изучите как SPL так и работу с периферией "через регистры". А это - в два раза больше знаний.
  • Вы научитесь искать баги в библиотеке и героически исправлять их (полезный опыт).
  • Вы научитесь пользоваться отладчиком. В моем случае это был gdb.
  • Вы научитесь читать, и исправлять чужой код (а это однозначно лишним не будет).
  • Вы узнаете как реализовать некоторые алгоритмы самым невероятным и неоднозначным способом, познакомитесь с примерами т.н. индусского кода (разминка для мозга же).
  • Кроме того SPL поможет использовать весь потенциал МК! Вы без проблем используете лишние мегагерцы и килобайты вашего МК, SPL тут лучший помошник!
Абсолютный , ничем неподтвержденный бред...
Открыл глаза
Сообщения: 56
Зарегистрирован: Сб июн 14, 2014 09:05:06

Сообщение kapitan0v »

dosikus писал(а):Абсолютный , ничем неподтвержденный бред...
Простите, забыл теги <sarcasm></sarcasm>.
Ответить

Вернуться в «ARM»