0,0
рейтинг
19 сентября 2011 в 18:51

Разработка → ARM-микроконтроллеры STM32F. Быстрый старт c STM32-Discovery из песочницы

При изучении image любого незнакомого дела, особенно когда речь идет о микроконтроллерах, возникает вопрос — «С чего начать». Ведутся поиски статей по ключевым словам «Getting Started», неизбежно появляется дилема выбора среды разработки и программатора-отладчика. Чтобы помочь вам определиться с ответами на возникшие вопросы, я поделюсь своим опытом в освоении 32-битных контроллеров семейства STM32F от ST Microelectronics.

Выбор контроллера


Вариантов по сути дела было два — STM32F или NXP (LPC1xxx). На микроконтроллеры STM32F мой выбор пал по нескольким причинам.

Во-первых, дешёвая отладочная плата STM32VL-Discovery. Некоторые из вас, кто занимается электроникой, наверняка успели урвать халявную Discovery, бесплатно раздаваемую при участии в конкурсе от EBV-Electronik. Тем, кто не успел подать заявку или вообще не знал о такой возможности, расстраиваться не стоит — плата стоит порядка 500 рублей. Цена более чем доступная.

Во-вторых, сами контроллеры довольно дешёвые. Простейший камень STM32F100C4T6 c 16 килобайтами на борту стоит меньше 40 рублей (!), при этом по характеристикам и периферии уделывает любую «Мегу», которая, кстати, всё равно стоит дороже. Цена на камни старшей линейки с аппаратным USB (STM32F103) тоже вполне гуманна, порядка 120 рублей.

В-третьих, контроллеры активно начинают набирать интерес у электронщиков, статьи по освоению STM32 появляются в интернетах одна за другой. Если так пойдет и дальше, популярность вполне может достигнуть уровня контроллеров Atmel.

LQFP48 Единственное по сравнению с тем же Atmel неудобство для радиолюбителя, это мелкий корпус. Про DIP можете забыть. Единственный доступный корпус — это LQFP с шагом ножек 0.5 мм. Тем не менее, плату при определенной сноровке изготовить ЛУТом не составит труда (об этом мы уже читали), так что мелкий корпус минусом я не считаю. На фото слева — моя плата для корпуса LQFP48.

Пара слов об отладочной плате STM32VL-Discovery: на борту у неё программатор-отладчик ST-Link и отлаживаемый (target) контроллер STM32F100RBT6 (128 кб флеша, 8 кб оперативы). Все выводы разведены на штырьки, имеется два светодиода и кнопка. Разъём SWD отладчика выведен наружу, так что плату можно использовать и как обычный ST-Link. Это нам на руку, не понадобится покупать программатор.

Выбор среды разработки


Здесь не всё так однозначно, как с атмеловской AVR Studio. Вариантов несколько:
  • IAR. Коммерческая. Ограничение по объёму исполняемого кода. Нафиг.
  • Keil. То же самое. Нафиг.
  • Atollic TrueStudio. Основана на Eclipse, но, тем не менее, является коммерческой. В бесплатной Lite-версии ограничения по объёму кода нет, но регулярно выскакивает рекламка «Приобретайте версию PRO». Нафиг.
  • Чистый Eclipse с плагином ARM и компилятором ARM-GCC. Вроде вот оно, кроссплатформенное счастье, но откуда ни возьмись появляется еще более подходящая кандидатура:
  • CooCox IDE (CoIDE). Тоже основана на Eclipse, но бесплатна. Включает в себя всё для работы с ARM, позволяет не отходя от кассы докачивать необходимые библиотеки. Умеет работать с различнями отладчиками (правда не с ST-Link, но это обходится установкой GNU Debugger'a). Единственный минус — сборка есть только под винду. Линуксятникам придется ставить Eclipse и настраивать его руками. Как обычно. Ну да ничего, нам не привыкать.
Что ж, мой выбор сделан. Вы можете его оспорить, предложить писать в блокноте, компилировать мейкфайлами или вообще остановитесь на коммерческих решениях, выступив против священного GCC. Но лично я считаю CoIDE просто идеальной средой разработки, по крайней мере, для быстрого старта. Начните с неё. А там видно будет.

Собственно, Getting Started!


Итак, нам понадобятся:
  1. Плата STM32VL-Discovery
  2. Утилита STM32 ST-Link Utility
  3. Среда разработки CoIDE последней версии (на данный момент это 1.3.0).
Запускаем CoIDE. Нам любезно предлагают выбрать производителя контроллера, затем и сам чип. Выбираем STM32F100RBT6, именно он находится на Discovery. Далее мы видим страницу выбора подключаемых библиотек, которая и сыграла решающую роль при выборе среды разработки:

CoIDE

Здесь есть и библиотека CMSIS для ядра ARM Cortex M3, и STM32 Peripheral Library (библиотека для работы с периферией от ST Microelectronics), а так же собственные разработки CooCox для выбранного микроконтроллера. Нам достаточно лишь отметить галочкой требуемые библиотеки и дело в шляпе. Для простейшей светодиодной моргалки — а именно так выглядит «Hello World» на микроконтроллерах — нам понадобятся CMSIS Core, CMSIS Boot, RCC (управление тактированием периферии) и GPIO (управление портами ввода-вывода общего назначения).

Без лишних пояснений напишу код простейшей программы:

#include <stm32f10x.h>
#include <stm32f10x_conf.h>

#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>

void Delay(volatile uint32_t nCount) {
	for (; nCount != 0; nCount--);
}

int main(void) {
	/* SystemInit() вызывается из startup_stm32f10x_md_vl.c */

	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init( GPIOC , &GPIO_InitStructure);

	while (1) {
		GPIOC->ODR |= GPIO_ODR_ODR9;
		Delay(0x1FFFF);

		GPIOC->ODR &= ~GPIO_ODR_ODR9;
		Delay(0x7FFFF);
	}

	return 0;
}


Компилируем (F7), наблюдаем появившиеся в директории Debug исполняемые файлы — bin, hex, elf.

Прошивка контроллера

Программу мы подготовили, теперь займёмся её загрузкой в чип. Подключаем плату (об установке драйверов пояснять не стану), запускаем ST-Link Utility. Контроллер в Discovery подключен по SWD, поэтому первое, что надо сделать, это переключить режим работы программатора-отладчика с JTAG на SWD:

image

Далее всё прозрачно: меню Target -> Program & Verify… выбираем файл hex, жмём Program и прошивка завершена. Остается только нажать на плате Discovery кнопку Reset — ту, что с черным колпачком — и порадоваться моргающему светодиоду.

image

Поздравляю. Ваша первая программа написана, скомпилирована, прошита в чип и успешно работает. Начало положено, а далее дело за вами: лезем в шаблонный код, как обычно что-то изменяем, дополняем, изучаем новые периферийные устройства, подключаем новые библиотеки. И не забываем читать Reference Manual, в нём масса полезной информации.

Обновление: Начиная с версии 1.3.0 среда разработки CooCox IDE поддерживает ST-Link, поэтому программирование и отладку можно осуществлять прямо из CoIDE, без использования ST-Link Utility. Выбор адаптера через меню Debug -> Debug Configuration (ST-Link, порт SWD). Загрузка программы в контроллер через меню Flash -> Program Download.

На этом всё. Желаю успехов в освоении микроконтроллеров ST Microelectronics.

Полезные ресурсы по теме
Роман Шувалов @ALPINE63rus
карма
30,0
рейтинг 0,0
Разработчик
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • –2
    Можно было ксором тушить/зажигать.
    • +3
      Изучающий тоже это первым делом увидит, напишет ксор, прошьёт МК и порадуется, что он внёс изменения и ничего при этом не сломал.
  • +1
    Плата дискавери и программирование происходит через ЮСБ?
    Чипы в LQFP классные, но разводка не радует. Если мне нужно изготовить 30 плат, как их программировать правильно?

    Все что у меня есть это куча макетных плат и ноутбук, у которого нет СОМ/LPT портов :(

    За статью спасибо и +
    • +3
      Да, программирование и питание через USB. Разводка не сильно тяжеловата, при желании можно всё уместить на односторонном текстолите:
      LQFP48

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

      Программировать — что значит как. Как обычно. Готовим 30 плат, выведя интерфейс SWD на штырьковый разъём. Впаиваем чипы. Прошиваем программатором (можно тем, что находится внутри Discovery). Готово.

      Макетки не подойдут, разве что специализированные под LQFP48 (LQFP64) корпус.
      • 0
        а можно еще подробнее вот это
        >> Готовим 30 плат, выведя интерфейс SWD на штырьковый разъём. Впаиваем чипы. Прошиваем программатором (можно тем, что находится внутри Discovery)

        Я только учусь :)
        Купил несколько этих контроллеров. А что бы Хелло ворлд. купил Ардуино УНО
        • +1
          Программирование здесь внутрисхемное, т.е. контроллер прошивается уже сидя в распаянной плате, а не как с DIP микросхемами, которые можно вставить в панельку, прошить и вытащить. Здесь надо на плате предусмотреть разъём для интерфейса программирования. Таким интерфейсом является SWD (две ножки — SWDIO и SWDCLK, не считая земли и питания). Так что при разводке выводишь этот разъём, изготавливаешь плату, впаиваешь чип (пустой), затем подключаешься к этому разъёму и прошиваешь чип. То есть разъём понадобится всего один раз на этапе сборки. Если на плате катастрофически не хватает места даже под 4 штырька SWD, можно найти другие методы программирования контроллера (вывести контактные площадки и придумать к ним что-то типа штекера). Но суть от этого не меняется.
          • 0
            Огромное спасибо, за ответ
            Еще вопрос — как это сделать через ЮСБ?
            • 0
              Ну Вам же сказали, там 2 ножки «две ножки — SWDIO и SWDCLK, не считая земли и питания».
              • 0
                image
                это на плату подключать?
                • –1
                  Ну так наверняка же программатор нужен, если конечно там нет (что вряд ли) прошитого bootloader'a. Например вот: easyelectronics.ru/category/arm-uchebnyj-kurs
                  • +1
                    Discovery содержит в себе программатор ST-Link (на фото — всё, что выше горизонтальной черты, это программатор). Его можно использовать для прошивания любых контроллеров через интерфейс SWD, достаточно снять перемычки CN3 и можно использовать плату как обычный ST-Link.
                    • 0
                      Спасибо, теперь все понятно.
                    • 0
                      Хм, а это полноценный ST-Link? Просто я встречал разговоры о том, что таким ST-Link-ом можно прошить лишь микроконтроллеры семейства STM32, а STM8 уже нет =(. Так ли это?
                      • 0
                        Вот чего не знаю, того не знаю. Могу только сказать, что в нём нет распаянного JTAG'a, только SWD. А насчет совместимости с STM8 только гуглить…
                  • 0
                    Бутлоадер есть во всех STM32 Зашит аппаратно.
            • +1
              Чтобы прошить свою плату со своим контроллером при помощи Discovery — подключаем Дискавери по USB, снимаем две перемычки CN3 (на фото справа), соединяем проводами разъём SWD со своей платой (земля, SWDIO, SWDCLK, и, если нужно, питание) и прошиваем. Распиновку разъёма SWD надо смотреть в документации к discovery, ссылка в конце поста есть. Главное не забудь снять перемычки CN3.
              • +1
                Discovery работает как программатор?
                • +1
                  Да, Discovery может работать как программатор. И она, кстати, дешевле чем ST-Link.
              • 0
                спасибо
                теперь новичку все понятно :)
                Ищу где заказать это чудо на Украине
                • +1
                  в Харькове на радио рынке. Магазин Космодром, у них возможно даже доставка есть.
                  • 0
                    Ага! Обожаю их. Всегда и все можно найти, только вот цены у них слегка завышены мне кажется.
                  • 0
                    спасибо
                    уже включил в следующий заказ. у них там и 8 и 32 бит платы
                    • 0
                      Да именно так, я взял STM32L Discovery с сегментным дисплеем и 4 сенсорными кнопками. Вообще у них там очень много интересного, они расширили магазин теперь от витрин не оторваться.
                      • 0
                        L — это которая для STM32L?
                        А статья про STM32F. Отличия есть. Но с L-ками дел не имел и про них не знаю.

                        Дискавери полностью называется STM32VL-Discovery (VL — Value Line), сейчас поправлю это в статье, чтобы не было путаницы.
                        • 0
                          STM32L-Discovery описание у него такое — «STM32L-Discovery – недорогой способ познакомится с микроконтроллерами STM32L на ядре Cortex-M3, которые отличаются ультранизким энергопотреблением (к примеру, 270нА в спящем режиме)». Так что видимо да
      • 0
        Что это за свастика? о_О Вообще лучше землю полигоном заливать, а не дорожкой вести
        • +1
          Если число слоев больше одного — однозначно полигоном. Но я рисовал любительский вариант для одностороннего текстолита.
          • 0
            И на одном тоже полигоном. Будет стабильнее работать и травящего раствора будет меньше расходоваться
            • +1
              А, если речь о квадратике в центре — да, его можно расширить до полигона и заполнить всё пространство под микросхемой (только это будет питание, а не земля). Но я этого не сделал т.к. ЛУТом как правило плохо получаются сплошные залитые полигоны. Разве что сеточкой нарисовать. Хотя я думаю это всё не принципиально, т.к. ответственные платы все равно делаются на производстве, и они там как минимум двухсторонние, а это сразу избавляет от всех проблем с разводкой.
              • 0
                Я понял, что квадратик в центре относится к питанию =) И кога говорил про полигон — этот квадратик вообще не имел ввиду. Зачем он вообще?
                • +2
                  Ну 4 вывода питания надо же было как-то соединить. Вот так и соединил. Не принципиально.
                  • –4
                    Вам руки оторвать за такую разводку =)
                    • 0
                      Это хорошая разводка, не шаришь.
                      • 0
                        Обоснуй)
                        • 0
                          Сам не видишь? Земля и питание приходит из одной точки. Питание изолировано от всей цепи. Т.е. все силовые линии питаются с одной точки фактически. Более того, в этом же закутке стоят (точнее можно поставить без проблем) все блокирующие кондеры, которые срежут весь цифровой срач МК в зародыше прям в его же силовой цепи. Наружу не выйдет ничего. Кратчашие пути замыкания этих иголок созданы. Плюс это все сделано ПО ОДНОЙ стороне. Что очень большой плюс для колхозников самодельщиков.

                          Разве что землю в общую кучу я бы подвел отдельной дорожкой со свободного угла в центральную плашку. Ну и наложил там полигон под весь камень почти.
                          • 0
                            Если так загоняться, то и дорожки нельзя под 90 град. прокладывать. А тут это избыточно. Для такого девайса пофигу из скольких точек питание идёт — не те частоты.
                            • 0
                              Налицо плохое знание матчасти. Частота и линия питания это вещи совсем из разной оперы. Большое кольцо в питании, а еще хуже в земле, работает как виток-антенна, ловящий всякое говно из воздуха. Искранула розетка в полуметре — получите иголки в питание. А если иголка наносекундная, то она может переклинить проц и он повиснет на ровном месте или сделает что то совсем не то. А длинные шины питания могут давать градиенты напряжений при заряде-разряде конденсаторов. От этого может плавать земля, давая опять же те же самые наносекундные иголки, которые гробят всю малину. Поэтому то и надо блоки запитывать звездой, разводя сигнал от источника, чтобы все это говно загнивало каждое в своей ветви.
                              • 0
                                Я говорил что против петли? Я же говорю — у него дорожки под 90 град., что тоже не хорошо. Но тут это не играет роли, я ничего не говорю против трассировки звездой, я пишу про конкретно идиотский квадрат под мк. Хватит троллить)))
                            • 0
                              Налицо плохое знание матчасти. Частота и линия питания это вещи совсем из разной оперы. Большое кольцо в питании, а еще хуже в земле, работает как виток-антенна, ловящий всякое говно из воздуха. Искранула розетка в полуметре — получите иголки в питание. А если иголка наносекундная, то она может переклинить проц и он повиснет на ровном месте или сделает что то совсем не то. А длинные шины питания могут давать градиенты напряжений при заряде-разряде конденсаторов. От этого может плавать земля, давая опять же те же самые наносекундные иголки, которые гробят всю малину. Поэтому то и надо блоки запитывать звездой, разводя сигнал от источника, чтобы все это говно загнивало каждое в своей ветви.
        • 0
          Это рассово правильная разводка. Питание из одной точки, легко заблокировать кондерами. И земля одним полигоном заливается.
          • 0
            Тут питание не из одной точки идёт, а из замкнутого квадрата.)))
            И про технологию разводки я, как бэ, в курсе.
            • 0
              Говорю же не шаришь. Замкнутый этот квадрат или нет пох. Его можно и залить. Главное что не с разных участков цепи нахватано питание и не с радиальной дорожки опоясывающей всю плату, как я тут недавно увидел у кого-то.
      • +1
        Тыж смотри как извернулся. Зачет! И кондеры есть куда воткнуть.
      • 0
        отлично развел — порты ввода-вывода все открытые
    • –2
      У дискавери встроенный usb-jtag который можно использовать и в своих проектах
      • +1
        не JTAG, а SWD.
        JTAG у дискавери не распаян. Но контроллером он поддерживается, и при большом желании можно его вручную распаять.
        • 0
          поделитесь ссылкой где почитать толково про JTAG и SWD
          • +1
            Даже не знаю, что и посоветовать. Про JTAG см. википедию, а SWD это коротко говоря то же самое, но по двум проводам (а не по четырём). Подробностей я и сам не знаю. Не интересовался. Оба интерфейса предназначены для программирования и отладки. В контроллерах STM32 есть оба, т.е. их можно программировать и отлаживать при помощи любого из этих интерфейсов. На дискавери распаян только SWD.
            • 0
              JTAG предназначен не для отладки, а для граничного сканирования. Отладка это побочный продукт.
  • +2
    Есть повод наконец-то серьезно задуматься о переходе с AVR…
    • 0
      Жаль только их не возят во все деревни в отличии от AVR, придется с инета заказывать.
  • 0
    Чтото ничего о потребляемой мощности на нашел, часто бывает критично…
    • +1
      Электрические характеристики можно найти в даташите на контроллер. Только не Reference Manual на всю линейку, а именно на контроллер. Вкратце — примерно пол миллиампера на МГц, в спящем режиме — микроамперы. Всё как обычно.
  • –1
    Прочитал эту статью сегодня в свежем номере журнала «Современная электроника». Вы автор?
    • 0
      (комментарий см. ниже, прошу прощенья, не ту кнопочку нажал)
  • +2
    Что? О_О_О
    Нет, я эту статью вчера вечером написал специально для инвайта (это моя первая статья). Сейчас найду журнал и сравню статьи.
    • +2
      Понятно, на сайте свежих номеров нет. А можете сами сравнить? Мне интересно, насколько статьи похожи.
      • 0
        Хорошо, завтра пришлю скан.
    • 0
      Посыпаю пеплом голову, прошу прощения. Смутило похожее начало и общая структура статьи.
  • +1
    Вы бы сделали ещё обзор прикладных задач, которые можно решать на этом контроллере. Вообще для чайников в контроллерах, типа меня :)
  • 0
    а есть мануалы по работе с usb(для чайников)?
    • +1
      Для чайников не нашёл. Но в STM32 USB FS Device Library есть примеры создания USB устройств: виртуального COM-порта, HID устройства, Mass Storage (съёмный диск) и др., эти примеры можно запустить, поковырять, изучить таким образом «на живом примере».

      Библиотеку и User Manual по USB Device Development Kit можно найти на st.com на странице определенного контроллера (например, STM32F103RB) во вкладке Design Support.
  • 0
    Оказывается в CoIDE уже есть средства программирования и отладки через ST-Link, и заливать программу в контролер можно через меню Flash — Download (предварительно выставив в настройках соответствующий отладчик). А ST-Link Utility вообще не при делах. На днях исправлю статью. Спасибо некоему coracio, не имеющему аккаунта и ждущему инвайта от меня, как только я его заработаю.
  • 0
    У меня Discovery с микроконтроллером STM32F051R8T6. Какие манипуляции с кодом нужно произвести, чтобы он успешно компилировался для моего камня?

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