Знакомство с ARM Cortex-M3 и с STM32, в частности


Пожалуй, большинство эмбеддерщиков и просто интересующихся встроенными системами уже слышали про процессоры ARM. Их устанавливают в промышленное оборудование, в смартфоны и аудио-плееры, в видеотехнику, да много ещё куда. Популярность ARM во многом обеспечена их хорошей производительностью при низком энергопотреблении, что делает их идеальными для применения в различных мобильных устройствах.ARM расшифровывается как Advanced RISC Machines. RISC — это архитектура процессоров с “сокращённым” набором команд, ныне одна из наиболее распространённых. Между прочим, микроконтроллеры AVR, используемые в Arduino, имеют архитектуру RISC.

Существует современное семейство ARM под названием Cortex, которое делится на три подсемейства:

  • Cortex-A
    Это полноценные процессоры общего назначения для самых различных задач. Самое известное устройство на базе их — это iPhone.
  • Cortex-R
    Предназначены для систем реального времени, где существует необходимость в быстрой и точной реакции на внешние события с гарантированным временем отклика — для применений в промышленности, медицине, автомобилестроении и пр.
  • Cortex-M
    Микроконтроллеры, уже известная нам по AVR область. Как обычно, это не очень быстрый процессор, но со встроенной памятью для программ (flash), оперативной памятью (SRAM) и различной периферией — такой, как GPIO (порты ввода-вывода), UART, SPI, I2C и т.д.

Эта статья, как и последующие в цикле (да, это будет цикл статей), сконцентрируется на самом популярном виде Cortex-M в наши дни — Cortex-M3. Микроконтроллеры этого семейства выпускают несколько компаний — например, ST Microelectronics, NXP, Atmel, Texas Instruments. Надо сказать, что с ARM вообще и Cortex-M3, в частности, ситуация с производством отличается от привычной: компания ARM Limited занимается только разработкой архитектуры и средств разработки (компиляторов и IDE), но сама процессоры не производит, а продаёт лицензии другим компаниям — вышеперечисленным, например. При этом гарантируется совместимость кода на уровне инструкций процессора — это значит, что можно разрабатывать ПО под процессоры различных производителей, пользуясь одним и тем же компилятором.

Чем же Cortex-M3 круче других микроконтроллеров? Много чем:

  • Полностью 32-битная архитектура: все регистры 32-битные, арифметические операции работают с 32-битными данными; умножение 32 x 32 -> 32 выполняется за 1 такт, деление — за 2-12 тактов. Благодаря этому CM3 за то же время успевает сделать больше, чем 8-ми и 16-битные МК.
  • Большое количество (от 16) регистров общего назначения, характерное для архитектуры RISC. Так как регистры работают на частоте процессора, а RAM — на меньшей, всегда предпочтительнее работать с данными в регистрах, а чем их больше, тем дольше можно обходиться без использования RAM. Тут соперничать c CM3 могут разве что AVR.
  • Отличная поддержка режимов энергосбережения. Можно отправить в спячку как весь МК, так и отдельные его подсистемы.
  • 24-битный таймер SysTick
    Этот таймер без ШИМ (PWM), зато 24-битный: можно задавать интервал срабатывания в широких пределах, не особо парясь. Самое то для организации конечных автоматов и планировщика RTOS.
  • Полноценная отладка по JTAG или SWD даже на младших кристаллах. Полноценная — значит, можно ставить точки останова (breakpoints), просматривать содержимое переменных и регистров, выполнять программу пошагово и т.п.
  • NVIC — Nested Vectored Interrupt Controller
    Контроллер прерываний, который поддерживает до 240 прерываний на все случаи жизни, до 256 их приоритетов, и обеспечивает быструю реакцию на прерывания.
  • Контроллера DMA — Direct Memory Access
    Очень полезная вещь — позволяет периферии (UART, SPI, I2C и пр.) читать/писать дынные в RAM без участия МК. То есть, можно дать задание контроллеру DMA считать в указанный буфер 100 байт по SPI, и эта задача будет выполняться в фоне, не загружая МК.
  • Высокая плотность кода. Для большинство более-менее сложных проектов размер кода будет меньше, чем для многих других МК. Это достигается за счёт специально разработанного для этих целей набора инструкций Thumb-2. Меньше размер кода — больше кода влезет в МК.
  • Общая ориентированность набора инструкций на компиляторы C — например, наличие команд для табличных переходов (для swicth/case), битовых манипуляций (PORTA |= (1 << 3) и подобный код), условного исполнения инструкций (очень крутая фича). Всё это выливается в более эффективную оптимизацию кода компиляторами C, а значит и в более высокую скорость работы.
  • Хорошие средства разработки: компилятор + среда разработки Keil от ARM Limited, IAR Embedded Workbench for ARM, связка компилятора GCC (сборка Sourcery CodeBench Lite Edition) и Eclipse IDE. Для пользователей Windows есть совсем простая в использовании CoIDE на базе GCC + Eclipse. Вариации с Eclipse круче всего, так как в ней есть поддержка всего, что нужно для удобного программирования: подсветка синтаксиса, умное автодополнение и автозавершение кода, сниппеты, отладчик, всплывающие подсказки с комментариями к функциям и переменным, рефакторинг.

Это мы пока рассматривали Cortex-M3 вообще, а изучать мы их будем на линейке STM32F10x от компании ST Microelectronics, производителем электронных компонентов с мировым именем. Эти ребята очень серьёзно подошли к разработке своих МК на базе Cortex-M3, в результате чего STM32 имеют ряд своих собственных достоинств. Во-первых, это богатая периферия:

  • Несколько многоканальных скоростных 12-битных АЦП, до миллиона измерений в секунду, режим непрерывного измерения.
  • Двухканальный ЦАП, умеющий работать в 8-ми и в 12-битном режимах.
  • 12-канальный контроллер DMA, обслуживает до 12 запросов, имеет 4 уровня приоритетов, независимые размеры блоков данных для приёма и передачи (8, 16 и 32 бита), поддержка кольцевого буфера (!), передача данных в режимах память->память, память->периферия, периферия>память и периферия>периферия.
  • Несколько 16-битных таймеров с произвольными делителями (не только степени двойки, как в AVR), которые умеют генерировать прерывания по переполнению, по сравнению, генерировать ШИМ, измерять длину и число входящих импульсов, запускать ЦАП, и даже автоматически считать импульсы с энкодеров и датчиков Холла!
  • NVIC, помимо всего прочего, поддерживает до 20 прерываний от внешних источников.
  • Модуль RTC (Real-Time Clock) — часы реального времени с счётчиком и будильником.
  • Несколько Watchdog-таймеров для пущей надёжности.
  • FSMC — Flexible Static Memory Controller
    Обеспечивает прозрачный доступ к нескольким видам памяти — SRAM, ROM, NOR Flash, NAND Flash, PSRAM и 16-битным PC Card-совместимым устройствам.
  • SDIO — Secure Digital I/O interface
    Делает львиную долю работы по чтению/записи на карты памяти MMC и SD, что даёт возможность легко и просто прикрутить поддержку FAT и полноценно работать с файлами на карточках.
  • USB
    Полная поддержка стантарта USB 2.0 Full-speed, до 8 эндпоинтов.
  • USB OTG (On-The-Go)
    Эта технология позволяет связывать USB-устройства с её пооддержкой без участия хоста — например, цифровую камеру с принтером.
  • Ethernet, MAC-уровень
    Ага, можно связываться с компом по локальной сети. С внешней PHY-микросхемой может выжимать 10/100 Мбит/с.
  • Шина I2S — шина цифровой связи аудио-устройств.
  • Ну, и стантдартный набор: UART, SPI, I2C, CAN.

Во-вторых, у STM32 очень хорошая структурированная документация:

  • Один Reference manual с описанием всей периферии на всю линейку STM32F10x
  • Подробная документация по каждой отдельной серии МК — распиновка, корпуса, наименование и т.п.
  • Приличное количество аппноутов (Application Notes) — рекомендаций по применению: правильный подбор источника тактирования, питания, примеры работы с LCD, SD-картами, RTC и многое другое.

В-третьих, совместимость — и по расположению ног на кристалле, и по коду. То есть, если не хватает производительности, Flash, RAM или периферии, то можно без модификации кода и без переделки платы просто поставить на плату МК пожирнее с тем же количеством ног.

В-четвёртых, цена. Самый младший камень из серии — STM32F100C4T6B — можно купить за 1-2 $, при этом он имеет 48 ног, 16 КБ Flash, 4 КБ SRAM и может работать на частоте 24 МГц, ну и UARTы и прочие интерфейсы в наличии. То есть, он круче, чем стандартный для Arduino контроллер ATmega168. Конечно, 48 ног — это не DIP-корпус, а TQFP: в макетку или в панельку его не воткнёшь, нужно плату разводить. Но технология изготовления печатных плат в домашних условиях ЛУТ уже расписана вдоль и поперёк, так что не такая уж это и проблема.

Ну, и наконец, платы вроде Arduino для быстрого освоения у ST тоже имеются, и начнём мы изучать STM32 с одной из них — STM32 Discovery:

Так что, если кто не силён в пайке, расслабьтесь. В этой плате есть встроенный отладчик ST-Link, так что вы сможете вкусить всю прелесть полноценной отладки, для которой к AVR пришлось бы докупать AVRDragon за 70$.

В общем, STM32 — это выбор редакции, однозначно. Теперь о цикле статей. Если коротко, то цель цикла — описать STM32F10x вдоль и поперёк. А,если длинно, мы с вами:

  • Изучим всю периферию линейки со всеми режимами работы.
  • Познаем всю прелесть и сложность работы с прерываниями.
  • Научимся разным полезным программерским трюкам и приёмам.
  • Подтянем свои знания языка C.
  • Научимся комбинировать полученные знания и к концу курса сделаем хотя бы одно относительно сложное устройство (уровня MP3-плеера).

Кто хочет прокачаться в программировании МК, у кого есть стальные яйца воля к победе, кто не боится трудностей — ждите продолжение, оно скоро будет. Заряжайте свои мечи, падаваны (:


0 комментариев на «“Знакомство с ARM Cortex-M3 и с STM32, в частности”»

    • Да, на чистом C, только вот сложного там ничего нет — бояться не нужно. Тем более, библиотека от ST очень хороша (:

    • Вот ещё для разнообразия — на Обероне!

      Это для тех, кому псевдо-С из IDE Ардуины уже «меклковат», да и вообще на сам С — идиосинкраизия…

      Прошивка контроллера Cortex-M3 (LPC1343F) программой на Oberon: youtu.be/zlnj6FCY1tY

    • Если умения позволяют, это лучший вариант.
      Кстати, хороший сайт у вас в профайле указан. Жаль, не могу сделать, как в «Матрице» — воткнуть себе в башку шнур, нажать кнопку и через пару секунд сказать: «Я знаю литовский!». Буду смеяться и плакать с Google Translate (:

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

      А по теме — этот Дискавери боард немного дороговат (не сильно, но всё же). Имея навыки, проще самому сделать демо-боардик для изучения STM32 контроллера, ну и ставить туда сразу переферию, с которой в основном работаешь.

      😉

    • Да, борда дороже, чем сделанная своими руками, но дешевле Arduino *trollface.pcb*
      Кстати, мы тоже для ЛУТ используем переделанный ламинатор (:

    • Почти дописал продолжение. Получается довольно объёмно — больше, чем ожидал (‘-_-)

    • Так это здорово)))
      Нигде я не смог найти достойного материала на Русском, где все популярно и понятно изложено. Цикл ваших статей — это то, чего так не хватало))))

    • А мы и не ищем легких путей, главное, чтобы было доступно и подробно написано, с примерами. А если еще и под CoIDE от Coocox — то вообще было бы супер!

  1. Раз тут такая активность нарисовалась, хочу тогда обратную связь получить от вас (:
    Я тут про настройку IDE уже почти дописал, и быстренько, накатаю своего рода quickstart: ну там, светодиодом поморгать, потенциометр считать, и без подробных объяснений — просто чтобы сначала голову не забивать деталями, но уже что-то работало.
    А дальше уже пойдут статьи с подробным разбором периферии, тонкостями архитектуры STM32 и работы компилятора, и прочими высокими материями.

    Так вот, скажите, как лучше будет — сделать только первую статью в стиле quickstart или ещё одну-две для разогрева?

    • Про моргание светодиодами уже на we.easyelectronics.ru были статейки, хочется чего-нибудь более познавательного. Думаю, одной статьи в стиле quickstart было бы вполне достаточно. В нее можно «каждой твари по паре» напихать всего, чего поместится: от моргания свтодиодомами и до настройки таймеров на определенный интервал. А в последующих статьях уже по каждому периферийному узлу подробно, с толком, с чувством, с расстановкой.

      Откройте секрет — какая все же IDE планируется за базовую при написании статей?

    • Базовая IDE:
      * Eclipse с установленным ARM Plugin
      * Sourcery CodeBench Lite Edition (бывший CodeSourcery G++ Lite)
      То бишь сборка кросс-компилятора GCC, GDB и прочих утилит для разработки под ARM.
      * Мой форк проекта stlink: GDB-сервер + утилита для прошивки
      Выбран для того, чтобы и под Windows, и под Linux было шить и отлаживать. Изначально линуксовый проект, я его пропатчил для работы под виндой и пофиксил пару багов, мешающих полноценной отладке.

      Собственно, всё подобрано максимально кроссплатформенно: не хочу никого обижать — ни виндузятников, ни линуксоидов, ни маководов. Впрочем, с Mac OS X я буду возится, только если маководы-кодеры сами попросят, ибо у нас их мало (не то, что в США), а я в этой ОС очень мало работал.
      Ну и, такая сборка не будет зациклена на Cortex-M3 — если захочется писать под крутые камни типа Cortex-A9, менять IDE или компилятор не придётся, только софт для прошивки, разве что.

      По поводу CoIDE: я описал в статье первичную настройку этой IDE, но в ней всё так просто, что даже не знаю, что ещё написать. Ткнул галочку — библиотека для GPIO добавилась. Просто мечта домохозяйки-ембеддерщицы 😀
      Если в работе с проектами будут какие отличия от моей IDE, я буду о них писать, само собой. А уж если кетайсы разродятся версией под Linux, пофиксят косяки с абсолютными путями в проекте, вытащат настройки редактора и т.п. из глубокой жопы и перестанут зацикливаться только на Cortex — тогда вообще её сделаю основной IDE для курса (:

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

      Вот как-то так.

    • Здравствуйте Артем!

      Читаю Ваши статьи, очень информативно, Спасибо за них.

      Меня зовут Адлет!

      Мы запускаем новый проект, в сфере робототехники и столкнулись с проблемой отсутствия программистов ARM процессоров.

      Хотелось бы предложить Вам возглавить программную часть данного проекта.
      Если Вам интересно мы подробнее опишем сам проект и обсудим детали.

      С уважением, Адлет!

  2. Только-только начал осваивать Arduino, а тут попалась Discavery — и сразу купил.
    Только это оказалась STM32F4DISCOVERY, т.е. на процессоре STM32F407VGT6. Скажите пожалуйста, а Ваши статьи, ориентированные на STM32F10x, подойдут мне при изучении Cortex-M4?
    В электронике вообще и в микроконтроллерах в частности я пока ещё только начинающий. Программирую на Си настольные приложения.

    • Вполне пойдут, только нужно учитывать, что для другого камня нужен другой набор библиотек, придётся поправить код (немного отличаются названия функций и констант), ну и настройки в проекте. Оставляю вам архив проекта для STM32F4DISCOVERY. После прочтения статьи о настройке Eclispe и прочего софта гляньте в настройки этого проекта — так будет проще понять, в чём отличия. Если после прочтения статей что-то непонятно, обращайтесь (:

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

Arduino

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

Разделы

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

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

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

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