Пожалуй, большинство эмбеддерщиков и просто интересующихся встроенными системами уже слышали про процессоры ARM. Их устанавливают в промышленное оборудование, в смартфоны и аудио-плееры, в видеотехнику, да много ещё куда. Популярность ARM во многом обеспечена их хорошей производительностью при низком энергопотреблении, что делает их идеальными для применения в различных мобильных устройствах.
Существует современное семейство 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 очень хороша (:
Мультиплатформеннaя IDE для STM32leaflabs.com/docs/ide.html leaflabs.com/docs/language.html
«Ардуиноподобный» язык
Вот ещё для разнообразия — на Обероне!
Это для тех, кому псевдо-С из IDE Ардуины уже «меклковат», да и вообще на сам С — идиосинкраизия…
Прошивка контроллера Cortex-M3 (LPC1343F) программой на Oberon:youtu.be/zlnj6FCY1tY
я не боюсь) жду недождусь посмотреть примеры и приступить к использованию потому что было много идей на что ардуины нехватало)
Классно! Ждем с нетерпением!
Бум пока заказывать «таракана» и делать дев.боард. А потом учиться по вашим статьям.
Если умения позволяют, это лучший вариант.
Кстати, хороший сайт у вас в профайле указан. Жаль, не могу сделать, как в «Матрице» — воткнуть себе в башку шнур, нажать кнопку и через пару секунд сказать: «Я знаю литовский!». Буду смеяться и плакать с Google Translate (:
Спасибо 🙂 Сайт на иностранном языке, ибо он как реклама к фрилансовым прокетам для местных жителей. Если что-то конкретно интересно, то спрашивайте. Опишу по-русски. Все последние платы там сделаны с помощью переделаного ламинатора.
А по теме — этот Дискавери боард немного дороговат (не сильно, но всё же). Имея навыки, проще самому сделать демо-боардик для изучения STM32 контроллера, ну и ставить туда сразу переферию, с которой в основном работаешь.
😉
Да, борда дороже, чем сделанная своими руками, но дешевле Arduino *trollface.pcb*
Кстати, мы тоже для ЛУТ используем переделанный ламинатор (:
Шикарно!
Жду не дождусь следующих статей. А то вычислительных ресурсов Arduino Duemilanove мне уже давно не хватает)))
Почти дописал продолжение. Получается довольно объёмно — больше, чем ожидал (‘-_-)
Так это здорово)))
Нигде я не смог найти достойного материала на Русском, где все популярно и понятно изложено. Цикл ваших статей — это то, чего так не хватало))))
А мы и не ищем легких путей, главное, чтобы было доступно и подробно написано, с примерами. А если еще и под CoIDE от Coocox — то вообще было бы супер!
Раз тут такая активность нарисовалась, хочу тогда обратную связь получить от вас (:
Я тут про настройку IDE уже почти дописал, и быстренько, накатаю своего рода quickstart: ну там, светодиодом поморгать, потенциометр считать, и без подробных объяснений — просто чтобы сначала голову не забивать деталями, но уже что-то работало.
А дальше уже пойдут статьи с подробным разбором периферии, тонкостями архитектуры STM32 и работы компилятора, и прочими высокими материями.
Так вот, скажите, как лучше будет — сделать только первую статью в стиле quickstart или ещё одну-две для разогрева?
Про моргание светодиодами уже на we.easyelectronics.ru были статейки, хочется чего-нибудь более познавательного. Думаю, одной статьи в стиле quickstart было бы вполне достаточно. В нее можно «каждой твари по паре» напихать всего, чего поместится: от моргания свтодиодомами и до настройки таймеров на определенный интервал. А в последующих статьях уже по каждому периферийному узлу подробно, с толком, с чувством, с расстановкой.
Откройте секрет — какая все же IDE планируется за базовую при написании статей?
Базовая IDE:форк проекта stlink: GDB-сервер + утилита для прошивки
* Eclipse с установленным ARM Plugin
* Sourcery CodeBench Lite Edition (бывший CodeSourcery G++ Lite)
То бишь сборка кросс-компилятора GCC, GDB и прочих утилит для разработки под ARM.
* Мой
Выбран для того, чтобы и под Windows, и под Linux было шить и отлаживать. Изначально линуксовый проект, я его пропатчил для работы под виндой и пофиксил пару багов, мешающих полноценной отладке.
Собственно, всё подобрано максимально кроссплатформенно: не хочу никого обижать — ни виндузятников, ни линуксоидов, ни маководов. Впрочем, с Mac OS X я буду возится, только если маководы-кодеры сами попросят, ибо у нас их мало (не то, что в США), а я в этой ОС очень мало работал.
Ну и, такая сборка не будет зациклена на Cortex-M3 — если захочется писать под крутые камни типа Cortex-A9, менять IDE или компилятор не придётся, только софт для прошивки, разве что.
По поводу CoIDE: я описал в статье первичную настройку этой IDE, но в ней всё так просто, что даже не знаю, что ещё написать. Ткнул галочку — библиотека для GPIO добавилась. Просто мечта домохозяйки-ембеддерщицы 😀
Если в работе с проектами будут какие отличия от моей IDE, я буду о них писать, само собой. А уж если кетайсы разродятся версией под Linux, пофиксят косяки с абсолютными путями в проекте, вытащат настройки редактора и т.п. из глубокой жопы и перестанут зацикливаться только на Cortex — тогда вообще её сделаю основной IDE для курса (:
А вообще, код-то единый будет для обеих IDE, так что моим читателям, по большому счёту, будет по барабану, какой IDE пользоваться. Просто в моей IDE нужно будет делать копию скелетного проекта, описанного в статье, а в CoIDE — создавать новый и тыкать в галочки.
Вот как-то так.
Ждем-с с нетерпением. (:
Здравствуйте Артем!
Читаю Ваши статьи, очень информативно, Спасибо за них.
Меня зовут Адлет!
Мы запускаем новый проект, в сфере робототехники и столкнулись с проблемой отсутствия программистов ARM процессоров.
Хотелось бы предложить Вам возглавить программную часть данного проекта.
Если Вам интересно мы подробнее опишем сам проект и обсудим детали.
С уважением, Адлет!
Только-только начал осваивать Arduino, а тут попалась Discavery — и сразу купил.
Только это оказалась STM32F4DISCOVERY, т.е. на процессоре STM32F407VGT6. Скажите пожалуйста, а Ваши статьи, ориентированные на STM32F10x, подойдут мне при изучении Cortex-M4?
В электронике вообще и в микроконтроллерах в частности я пока ещё только начинающий. Программирую на Си настольные приложения.
Вполне пойдут, только нужно учитывать, что для другого камня нужен другой набор библиотек, придётся поправить код (немного отличаются названия функций и констант), ну и настройки в проекте. Оставляю вамархив проекта для STM32F4DISCOVERY . После прочтения статьи о настройке Eclispe и прочего софта гляньте в настройки этого проекта — так будет проще понять, в чём отличия. Если после прочтения статей что-то непонятно, обращайтесь (:
Спасибо большое, буду разбираться!
Еще одно видео для поклонников STM32 и языка программирования Оберон.
http://www.youtube.com/watch?v=mGi03zjahwY