Думаю многие, кто увлекается AVR микроконтроллерами, когда нибудь слышал про ARM контроллеры. Пройти мимо этой темы я не мог. Поэтому, на правах новичка решил поделиться своим опытом.
Update 31.07.15 статья полностью не актуальна, и оставлена только для истории 🙂
На самом деле, предыстория такова — по долгу службы, наблюдаю за развитием электроники в сфере энергетики. Типовые устройства двух — трехлетней давности, это несколько здоровенных коробок с кучей жгутов, индикацией на семисегментных индикаторах или маленьких жк дисплейчиках. Сердцем таких устройств, являлись ATmega. В последнее время ситуация, существенно изменилась, в основном это небольшие самодостаточные коробочки, с нормальным жк монитором, линуксом в качестве операционной системы и армовским камнем. А после того, как я увидел планшет в промышленном исполнении, больное воображение разыгралось ни на шутку.
Поэтому ради любопытства, решил потренироваться помигать светодиодом. При этом, хотелось чтобы все было просто и наглядно, следовательно нужна была готовая плата и программатор. Первое что вынесло мозг это то, что ARM всего лишь название архитектуры, а версий микроконтроллеров огромное множество, даже само ядро у разных производителей отличается.
Я не стал вникать во все эти подробности, пошел по пути наименьшего сопротивления, подсмотрел что рекомендуют на других сайтах, посоветовался с людьми. Оптимальным выбором, оказалось взять отладочную плату STM32VLDISCOVERY фирмы ST Microelectronics. У платы на борту есть встроенный программатор и периферия, которой вполне достаточно для начинающего. Как назло, ее не было в наличие, только под заказ, поэтому пришлось взять то, что было — STM32F4DISCOVERY. Эта плата чуть подороже, чуть больше плюшек, но суть такая же.
Может сравнение кому то покажется неуместным, но все таки: у установленного проца STM32F407VGT6 в 128 раз больше флеш памяти(1Мб) и в 192 раза больше оперативки(192кБ) чем у ATmega8. Максимальная частота камня 168МГц, против 16МГц. При такой цене, в крупных проектах у меги нет шансов.
Далее встал вопрос о выборе среды разработки. Лично моей задачей было написание программы на C++. Поэтому выбор был сразу сделан в пользу IAR Embedded Workbench. До этого, с ним работать не доводилось, однако много наслышан, причем отзывы в целом положительные. Платная версия стоит около 3 килобаксов, однако доступны два бесплатных варианта: либо ограничение кода 32кБ, либо 30 дневная версия без ограничения кода. Я выбрал бесплатный вариант с ограничением кода. Столько накодить еще нужно уметь.
Занятно, но с наскоку ИАР победить не удалось. Дело в том, что это довольно универсальная среда и подходит для множества микроконтроллеров. Поэтому, чтобы он заработал с конкретным камнем его нужно настроить, причем процесс настройки достаточно непрост для новичка и требует либо лезть в даташит либо читать мануалы, которых оказалось достаточно много, но все они оказались не актуальны. В какой то момент, сильно огорчился и скачал кокос (CooCox), в котором процесс настройки в разы проще (кстати он полностью бесплатный, рекомендую). Посмотрел на процесс создания проекта там, сравнил и понял что сильных различий быть не может, взял волю в кулак и вернулся к иару.
В итоге, после недельной пляски с бубном, как бы того не хотелось, но в даташит заглянуть пришлось. Занятно, но процесс настройки весьма неплохо там был описан. Частично помогло видео «Настраиваем IAR для stm32 и мигаем светодидом» от bsvi, рекомендую найти его в гугле. Теперь стоит рассказать про сам процесс.
Условно его можно разделить на три части:
1. Установка стандартной библиотеки CMSIS, без которой работать ничего не будет, забиваем в гугле CMSIS STM32F4 и скачиваем на свой микроконтроллер, называется «STM32F4 DSP and standard peripherals library», весит примерно 80Мб.
2. Настройка IAR, вот тут самое веселое, выбираем свой камень, с этим проблем нет
Подключаем библиотеку, тут тоже вроде понятно
Вводим название семейства микроконтроллера, тут немного пришлось попотеть, но инфу найти не сложно внутри файла stm32f4xx.h
А вот с настройками линкера я застрял, причем плотно. Дело в том что во всех мануалах предлагают настроить диапазон памяти, высчитывают начало и конец флеша, сначала была проблема найти этот Memory map в даташите, а потом разобраться. Меня долго удивляло то, что у меня настройки уже вбиты и они похожи на правду. В конце концов стало понятно, что файл с настройками уже присутствует на моем компьютере и собственно настраивать ничего не надо.
Ну и последнее настройки программатора — выбираем ST-LINK
И ставим галочку использовать загрузку флеш
3. Вы думаете все? Нет, на этом мучения только начинаются
#include "stm32f4xx.h" int main() { } |
В пустую программу подключаем инклюд с нашим микроконтроллером, после этого пытаемся компилировать, компилятор ругается что не нашел какой нибудь файл, например core_cm4.c. Так получилось, что во всех мануалах пути к файлам совсем иные, чем те что в скачанной CMSIS. Чтобы найти нужные файлы, пришлось искать эти файлы и кидать их в папку иара. В списке ошибок он пишет какой файл ему нужен, где он сам искал и не нашел этот файл, т.е. это подсказка куда его положить. В общем так было 2 или 3 раза. Все нужные файлы были найдены, закинуты ненасытному компилятору. Пустой проект скомпилился. На этом процесс настройки закончен.
Следующий шаг, найти на какой ножке, какого порта подключен светодиод на плате. Там их четыре штуки, опять лезть в даташит, находим PD12. Тут всплывает еще один интересный факт, чтобы ножкой можно было дрыгать, нужно включить ее тактирование.
#include "stm32f4xx.h" int main() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Включаем тактирование порта D GPIOD->MODER |= GPIO_MODER_MODER12_0; // Настраиваем ножку12 порта D как выход while(1) { GPIOD->BSRRL = GPIO_BSRR_BS_12; // Включаем ножку for (unsigned int i=0; i<300000; i++) {} // ждем GPIOD->BSRRH = GPIO_BSRR_BS_12; // Выключаем ножку for (unsigned int i=0; i<300000; i++) {} // ждем } } |
По поводу задержки, я спецом посмотрел трассировщиком сколько выполняется один цикл, получилось 8 тактов, если я все понял правильно, т.е. при частоте 8МГц задержка составит (8*300 000)/ 8 000 000 = 0,3 секунды.
Подключаем нашу платку через USB, нажимаем Download and Debug. Наконец светодиод замигал зеленым.
Если подвести небольшой итог, что понравилось: цена(для такого количества фарша весьма неплохо), мощность, наличие программатора, габариты, наличие бесплатных годных сред разработки. Что не понравилось: цена(для мелочевки плата дороговато выходит, а если камень приобретать отдельно, то попробуй его еще припаять), документация(да ее много, но она не структурирована, искать сложно), мало годных примеров.
Как видите, в целом плюсов больше чем минусов, его можно смело рекомендовать радиолюбителям, но только при условии что вы любите внимательно изучать документацию и у вас есть на это время. Для тех, кому важен результат и не требуется большого быстродействия, я бы советовал не забывать про atmel, ибо это точно такой же микроконтроллер, только чуть менее навороченный. Со временем, раздел будем развивать, дополнять и учиться работать с STM32 микроконтроллерами.
Автор продолжай! Жду новых статей!
И сразу три вопроса.
1. Почему этот идиотский keil, если есть куда более дружелюбный ColIDE?
2. А почему не с помощью библиотеки STDPeriph? C ней вроде ж проще работать, чем с этими чертовыми регистрами и код легче перегоняется на другой камень.
3. А дальше что нить будет? Уж очень эта тема интересует)))
эммм, где вы увидели кейл, пара статей уже есть в них как раз кокос, будут и другие, чуток терпения
как всегда начинающему человеку нужен готовый собранный проект который ужо настроен.
и в дальнейшем его копать..
поделитесь проектом и обязательно версию IAR напишите пожалуйста. тк от версии к версии у них много несовместимости..
переезжаю с msp430 на cortex m3.. борьба идет больше недели..
цель помигать светодиодом под rtos..
если можете то помогите. я думаю тысячи читателей будут вам обеспечены..
спасибо.
Я потестил IAR, сравнил с кокосом, подход кокоса мне больше понравился. Поэтому готовый проект уже не скину. Насколько я понимаю, проблемы описанные в статье уже не актуальны.
Я тоже заюзал CoolDE, легкий в настройке до ужаса. Пробовал пару примеров с сайта easySTM32… Надо курить матчасть, искать на это время. Discovery у меня VL с CortexM3 на бору. С Keilom что-то совсем у меня не срослось, иар даже не пытался ставить, намучился с ним на AVR.