Применение STM32 в промышленных станках на примере выдувного автомата CHODOS (Чехия)
В одном из цехов предприятия, на котором я работаю, стоит станок, который изготавливают пластиковую тару. Станок называется выдувной автомат. Он выпущен в 1988 году в Карловых Варах компанией CHODOS:
Управляет циклом электроника на микросхемах TTL логики (типа К155(555) или SN74xx). Под катом расскажу, как электронику прошлого века я заменил на микроконтроллер STM32.
Принцип работы выдувного автомата вкратце таков: поступающая из бункера пластмассовая крошка плавится и выдавливается шнеком под давлением через сопла, формируя «рукава». После этого «рукава» отрезаются и подаются в выдувные формы, в которых под давлением подаваемого воздуха формируется изделие (в моем случае — это пластиковая бутылка).
Управляет станком пара десятков плат TTL-логики, несколько плат коммутаторов нагрузки с семисторами для включения клапанов и пускателей, несколько плат преобразователей уровней входных сигналов от концевиков. Все платы вставлены в корзину с разъемами в шкаф уравления. В корзине всё соединено методом накрутки. Платы TTL логики собраны на микросхемах производства TESLA (аналоги К155(555) либо SN74XX).
Индикация состояния цикла практически отсутствует и поэтому во время его сильных глюков понять, что с ним, практически невозможно. К тому же платы со временем выходят из строя и перед тем, как их ремонтировать, нужно пройти бесконечный квест с мультиметром и кучей бумажных схем, да еще и в неудобных позах.
Было принято решение перевести контроль и управление циклом литья на микроконтроллеры. Первым подопытным контроллером был Arduino Mega 2560. Контроллер оказался очень «нежным» для работы в условиях сильных электромагнитных всплесков от пускателей и электродвигателей. Он просто зависал, когда ему вздумается. Не помогло ни экранирование самого контроллера, ни замена всех кабелей, идущих от концевых выключателей на заземленный МКЭШ 3х0,5. Ну и конечно, была полностью заменена вся электропроводка станка. Одним из вариантов решения проблемы с зависаниями было использование бутлоадера optiboot для Arduino с задействованной функцией watchdog с сохранением состояния в EEPROM и восстановление состояния с продолжением цикла после сброса. Но и это не помогло.
В общем, было решено отказаться от Atmega и перейти на STM32.
В качестве STM32 был приобретен контроллер NUCLEO-F401RE. Все сигналы от концевиков собирались через оптроны PC817. Управление электроклапанами и пускателями было сделано на SSR SHARP S202S02 (можно использовать и пару MOC3061 + BT138).
В качестве индикатора был заказан и оплачен на Aliexpress LCD12864 (ST7920), но продавец прислал LCD 20×4 (в ходе спора деньги вернули обратно, а дисплей остался) и решил применить его.
Программу писал в онлайн компиляторе mbed.
Теперь немного по методам программирования данного контроллера в mbed. Работа с сигналами от концевого выключателя, управление нагрузкой и работа с таймерами:
Весь код занимает примерно 2000 строк. Выкладывать не буду. Скажу только, что из контроллера постоянно выходит сервисная информация через COM порт (сделал для себя).
Покажу только ключевые фрагменты.
// Начальные установки
// Регулируемые оператором переменные программа хранит в eeprom памяти.
#include «_24LCXXX.h» // Библиотека работы с микросхемой eeprom памяти
_24LCXXX eeprom(&i2c, 0x50); // Подключаем микросхему eeprom
DigitalIn S41(PC_8); // Концевик S41 подключен через оптрон к выводу PC_8 контроллера
DigitalOut Y43 (PA_13); // Управление гидравлическим клапаном Y43 (катушка 220В) через вывод PA_13
Timer T48; // T48 – таймер применяемый в цикле литья
float SetT48 = 15.0; // Переменная регулируемая оператором. Время на которое включается таймер T48.
…
void setup()
<
…
S41.mode(PullDown); // Задействую подтягивающий резистор
…
>
int main() // Основной цикл <
…
// Метод работы с сигналом от концевика
if (S41==LOW) <//Проверка состояния концевика
…
>
…
// Метод управления нагрузкой
Y43==1; // Включить гидроклапан Y43
Y43==0; // Выключить гидроклапан Y43
…
// Работа с таймером
T48.reset(); // Сброс таймера Т48
T48.start(); // Старт таймера Т48
…
CurrentT48=T48.read(); // Считываем текущее значение счета таймера Т48
if (CurrentT48 > SetT48) <// Сравниваем с заданной величиной
T48.stop();
>
// Вывод динамического состояния таймера на LCD
lcd.printf(«T48=%4.1f», CurrentT48);
.
// Метод работы с eeprom:
eeprom.nbyte_read(0x00, &SetT48, 4 ); // Чтение из еепром 4-х байт начиная с адреса 0х00 и запись содержимого в память отведенной переменной SetT48 (тип переменной float – 4 байта)
eeprom.nbyte_write(0x00, &SetT48, 4); // Запись в еепром 4-х байт начиная с адреса 0х00 значений памяти отведенной переменной SetT48 (тип переменной float – 4 байта)
…
>
Контроллер прошит. NUCLEO прошивается очень легко. После подключения USB кабеля от NUCLEO в компьютер в последнем появляется съемный диск. В него копируем бинарник, полученный после компиляции в онлайн компиляторе и всё — прошивка сама зальется в кристалл. Были моменты, когда приходилось заливать бинарник прямо с Galaxy Nexus через OTG кабель.
Сделал печатную плату методом ЛУТ. Спаял. Смонтировал в шкаф станка. Запустил. Научил Операторов-наладчиков.
На сегодняшний день «пробег» составляет более 100 тыс циклов! Ни единого сбоя по вине электроники.
Итог. Контроллер выдувного автомата имеет 13 входов с оптической развязкой, 11 выходов с оптической развязкой, каждый коммутирует до 8А нагрузки. Программную организацию цикла литья. Светодиодную индикацию входов и выходов. Вывод на экран различной информации. Автоматический и ручной режимы управления. В ручном режиме есть возможность включать и выключать каждый силовой выход по отдельности с программной защитой от аварийных состояний (например, управление пускателями реверса трехфазного двигателя одного из механизмов станка) для диагностики исправности отдельных узлов станка.
Станков у нас три. Остальные два тоже переведу на контроллер.
Про цены не пишу. Курс прыгает. Да и все детальки можно найти на Aliexpress, где я всё и покупал.
STM32: эпоха 32-битных микроконтроллеров наступила
Жизнь в сфере 32-битных микроконтроллеров в России сейчас буквально кипит. С одной стороны, производители постоянно анонсируют и пропагандируют новые решения. С другой, многие разработчики «дозрели» до перехода с 8-битных (или 16-битных) микроконтроллеров на 32-битные: их задачи усложняются, а мощность 8-битников ограничена, при этом их стоимость сопоставима с новыми 32-битными микроконтроллерами. Другие разработчики уже работают с 32-битными микроконтроллерами, но им нужно оптимизировать свои решения с точки зрения стоимости или добавить новый функционал. В данной статье мы попробуем представить сбалансированный взгляд на конкретные преимущества 32-битного семейства микроконтроллеров STM32.
Крепкий орешек
STM32 — это микроконтроллер, построенный на ядре ARM Cortex-M3 [1]. Данное ядро имеет много преимуществ, которые будут перечислены ниже, но его основное преимущество на сегодняшний день — универсальность. За два года Cortex-M3 стал индустриальным стандартом. Об этом говорит количество производителей, присоединившихся к данной архитектуре. Все основные производители микроконтроллеров, которые присутствуют в России, кроме Microchip, имеют или развивают решения на основе этой архитектуры: STMicroelectronics, Texas Instrument, NXP, ATMEL, Analog Devices, Renesas и т.д. Компания ST одна из первых выпустила свои микроконтроллеры Cortex-M3 (2007 г.) и быстро стала доминирующим игроком на этом рынке. На рис. 1 показано общее количество проданных в мире ядер Cortex-M3 и львиная доля ST: около 80% в 2009 году, и около 70% — в 2010. Это говорит о высоком качестве и привлекательности решений STMicroelectronics. Заметен и значительный рост продаж самих ядер Cortex-M3. В 2008 году их было продано порядка четырех миллионов, а затем три года подряд ежегодный рост составлял 400…500%. Это уже не просто рост, это волна!
Рис. 1. Продажи МК на ARM Cortex-M3 по всему миру
В 32-битном сегменте разработчики редко работают с ассемблером, они в основном используют языки высокого уровня, например, язык C. Поэтому если вдруг понадобится переход с одного производителя на другой (срыв поставок, отсутствие нужных библиотек, новые функциональные требования, увеличения цен, и т.д.), то часть программного кода, связанная с ядром, даже не потребует изменения. Необходима будет только работа на уровне драйверов периферии. В итоге получается, что если писать программный код с четким делением между ядром и периферией, то можно обеспечить условия для очень быстрого перехода с одного производителя на другой. Остается, конечно, проблема переделки печатной платы (см. следующий раздел статьи).
Семейство STM32 [2, 3] — это не только микроконтроллеры на ядре Cortex-M3. Архитектура Сortex-M включает в себя также ядра Сortex-M0 и Cortex-M4. Рисунок 2 показывает взаимосвязь между этими ядрами.
Рис. 2. Семейства ядер Сortex-M
Cortex-M0 — это Cortex-M3 с усеченным набором команд, предназначенный для более дешевых и менее требовательных с точки зрения производительности решений. Cortex-M0 позволит заменить 16-битные микроконтроллеры и, в меньшей степени, 8-битные микроконтроллеры. Cortex-M4 — это Cortex-M3, обогащенный новыми командами для обработки данных и предназначенный для применений, требующих более высокой производительности, с более сложной обработкой сигнала (операции с плавающей запятой на аппаратном уровне). Cortex-M4 можно будет использовать в нижнем сегменте DSP-приложений.
Программный код, работающий на ядре Cortex-M0, будет в полном объеме работать и на ядре Cortex-M3, поскольку для Cortex-M3 действуют все инструкции Cortex-M0. Программный код, работающий на ядре Cortex-M3, также будет работать на Cortex-M4, поскольку для Cortex-M4 остаются действующими все инструкции Cortex-M3. То есть, сделав изделие на Cortex-M3, можно будет далее сделать его более дешевые и простые варианты на Cortex-M0 или более дорогие и сложные изделия на Cortex-M4 с минимальными затратами на переработку программного кода. Поскольку Сortex-M3 уже стал мировым стандартом, и поскольку Cortex-M0 и Cortex-M4 являются натуральными продолжениями Cortex-M3, никого не удивит, если они также станут стандартами в ближайшее время. Выпуск STM32 с ядрами Cortex-M0 и Cortex-M4 от компании STMicroelectronics намечается на 2011 год. Другие производители также активно работают в этом направлении (Texas Instruments, Freescale, NXP и т.д.)
В итоге можно сказать, что выбирая STM32, разработчик выбирает самый популярный микроконтроллер на Cortex-M3, с перспективой перехода на другие ядра Cortex-M, но при этом не закрывает себе двери для продукции остальных производителей. Итог — огромный выбор и большая гибкость. То есть, основное преимущество STM32 — то, что всегда есть возможность его не использовать!
Менять микроконтроллеры как перчатки
Одна из причин мировой популярности семейства STM32 [2] — максимальный комфорт разработчика. Если универсальность ядра STM32 позволяет менять производителя c минимальными затратами на программный код, то pin-to-pin совместимость внутри семейства STM32 позволяет менять объем памяти (флэш-память и ОЗУ) и периферию (Ethernet, USB, CAN, и т.д.), не трогая печатную плату. «Pin-to-pin совместимость» означает, что для одного размера корпуса все сигналы сохраняются на тех же самых вводах/выводах для разных вариантов микроконтроллеров семейства. Рассмотрим конкретный пример. На рисунке 3 можно увидеть распределение изделий семейства STM32 в зависимости от корпусов и размера флэш-памяти.
Рис. 3. Изделия семейства STM32 в зависимости от флэш-памяти и от корпуса
Если, например, разработчику понадобился корпус LQFP 64 и минимальный набор памяти и функционала, то его выбор остановится на микросхеме STM32F100R4 (16 Кбайт флэш-памяти, 4 Кбайт ОЗУ, 24 МГц). Далее потребовался более быстрый АЦП и флэш-память размером 128 Кбайт. Тогда он переходит на микросхему STM32F101RB. Все вводы-выводы в этих микросхемах идентичны, то есть плату трогать не надо. Необходимо только обновление программного кода. Далее в изделии потребовался USB-интерфейс. Тогда на помощь приходит микроконтроллер STM32F103RE, тоже без изменений на уровне печатной платы. Наконец, на основе этого изделия решили сделать портативный прибор. Тогда разработчик переходит на микроконтроллер STM32L151RB, который имеет более низкое потребление и сохраняет все характеристики STM32F103RE по памяти и интерфейсам. В последним случае разработчик должен обратить внимание на одно незначительное отличие (сигнал Vbat становится Vlcd), но скорее всего, ему также не потребуется ничего менять на плате. Можно посмотреть на процесс и с обратной стороны. Например, при разработке рассматривался богатый набор функционала для конечного изделия, но уже при выходе на производство выяснилось, что большая часть этого функционала избыточна. Можно взять более простой микроконтроллер из линейки, сократив расходы на комплектующие. Pin-to-pin совместимость — это идеальный рычаг, чтобы удешевить свои решения, поскольку проходить этот процесс в обратную строну (меньше памяти, меньше периферии, и т.д.) значительно проще. Если во время разработки по максимуму предусмотреть все будущие варианты своего изделия на основе pin-to-pin совместимости, то можно с большой эффективностью запускать в производство множество разнообразных изделий. В итоге, потратив свои усилия на одну разработку, разработчик имеет возможность масштабировать свои изделия и достаточно быстро выполнять требования рынка.
Надо уточнить, что степень Pin-to-pin совместимости — разная. Рисунок 4 представляет общую картину по pin-to-pin совместимости между различными сериями семейства STM32 и краткое описание основных свойств этих линеек. Стандартная периферия (SPI, USART, I 2 C, таймеры, сторожевые таймеры, схемы сброса и т.д.) не указаны, поскольку они общие для всех линеек. Линейка STM32W (Cortex-M3 + ZigBee) отсутствует на рисунке 4, поскольку не имеет никакой pin-to-pin совместимости с семействами STM32F-1, STM32F-2 и STM32L. Это связано с тем, что она была разработана совместно с компанией Ember, предоставившей радиочастотную часть, что ограничило свободу разработки для компании ST.
Рис. 4. Pin-to-pin совместимость внутри семейств STM32
Внутри серий STM32F-1, STM32F-2 и STM32L pin-to-pin coвместимость полная. Если мы говорим, например, про серию STM32F-1, то речь идет о более чем 90 микросхемах, разделенных на пять семейств по применению, с полной pin-to-pin совместимостью. Хорошая pin-to-pin совместимость между STM32F-1 и STM32L, но для более новой линейки STM32F-2 потребуется больше работы.
Если все-таки пришлось поменять количество входов-выходов (сменить корпус), то требования к повторной трассировке тоже сокращены до минимума, поскольку в семействе STM32 все сигналы сохраняются по максимуму с одной или с другой стороны корпуса, каким бы не был его размер. Это также значительно упрощает работу.
Описанная выше Pin-to-pin совместимость сопровождается и программной совместимостью. Программная совместимость является полной между различными семействами и внутри них, включая семейство STM32W. STMicroelectronics обещает, что будущие семейства STM32 на ядрах Cortex-M0 и Cortex-M4 будут также pin-to-pin и программно совместимы с существующими. Вывод: STM32 — платформа, на которую можно перейти сегодня и многие годы удовлетворять свои потребности.
Все у меня есть, только мозгов не хватает!
Когда появляется интерес к микроконтроллеру, хочется попробовать его «вживую». Для этого нужны отладочные платы. В случае семейства STM32 количество отладок и их возможностей впечатляет [3]. Например, имеется отладка STM32VLDiscovery от самого производителя, стоимость которой составляет около 300 рублей. Она имеет встроенный программатор и позволяет работать с микроконтроллером STM32F100. Это дешевый и быстрый путь ознакомления с семейством STM32. С другой стороны, имеются более сложные отладки со всем нужным набором функционала от сторонних производителей — Keil, IAR, Raisonnance и т.д. Многие небольшие компании также создали свои решения в области отладок для STM32. Российского разработчика могут заинтересовать решения компании Терраэлектроника [4], более доступные по стоимости, с документацией и технической поддержкой на русском языке, которые одновременно являются встраиваемыми модулями, что идеально для небольших серий изделий. STM32VLDiscovery также можно использовать как встраиваемый модуль. Отметим, что есть еще уникальные отладки для микроконтроллеров STM32, например, интересный модуль inemo v2 (STEVAL-MKI062V2), который имеет целый набор датчиков (датчик температуры, датчик давления, два гироскопа, трехосевой акселерометр с компасом) и предоставляется в комплекте с ПО для быстрой разработки решений. Также существует полноценная отладка для работы с электроприводом STM3210B-MCKIT, которая включает в себя трехфазный мотор, десятиамперный трехфазный инвертор, источник питания и собственно микроконтроллерную часть.
Иногда для комплексных решений требуется не просто отладка, а отладка в реальном времени. Одно из преимуществ ядра Cortex-M3 — то, что он включает в себя модуль ETM (Embedded Trace Module), который позволяет выполнить такую функцию. Все микроконтроллеры STM32F-1 с объемом памяти больше чем 512 Кб, а также серии STM32L, STM32F-2 и содержат этот модуль. Понадобится также специализированный программатор J-trace или Ulink-pro.
Для разработки ПО микроконтроллера необходима среда разработки и Си-инструментарий. Популярность микроконтроллеров на основе ARM-ядер очень высока, и, следовательно, количество разнообразных вариантов средств разработки — платных и бесплатных — просто огромно. Если вы ранее использовали одно из решений на ARM-ядре, то переход на ARM Cortex-M3 очень прост, вам лишь необходимо обновить ПО ваших средств разработки. В статье «STM32 с нуля», опубликованной в этом же номере «Новостей электроники», можно найти более подробное описание существующих решений для разработки ПО.
Большой выбор отладок и средств разработки — это еще не все. Большую роль в процессе разработки играют библиотеки. Семейство STM32 отличается большим выбором бесплатных библиотек, из которых можно выделить следующие:
- Библиотека для всей стандартной периферии (UART, SPI, I 2 C, CAN, AЦП, ЦАП, таймеры, все источники тактирование, FSMC, IO, DMA, RTC, и т.д.);
- Библиотека для USB-интерфейса (с такими режимами как mass storage, HID, DFU, CDC, audio, а также хост full speed);
- Библиотека для Ethernet-интерфейса (MAC-уровень от ST и бесплатный полный TCP/IP-уровень от Interniche);
- Библиотеки для управления моторами (трехфазные бесщеточные моторы);
- Библиотеки для цифровой обработки сигнала DSP (PID, IIR, FFT, FIR);
- Библиотеки для воспроизведения звука (декодирования и кодирования на основе кодека SPEEX, с хорошим качеством звука);
- Библиотеки для графических решений.
Все эти библиотеки сопровождаются документацией по применению. Помимо бесплатных библиотек, есть огромный выбор платных от большого количества компаний — Keil, IAR, Micrium, Segger, Greenhills, Quadros, CMX и т.д. Интересно, что одна из этих компаний — российская. Это Spirit DSP, совместно с которой STMicroelectronics предоставляет MP3-кодеки (кодирование, декодирование), WMA-кодек (декодирование) и библиотеки для звуковых эффектов (микшер, эквалайзер, и т.д). Данные решения требуют лицензирования с дополнительными отчислениями правообладателем кодеков (Thomson, Microsoft).
Надо сказать еще пару слов об операционных системах. К сожалению, ядро Cortex-M3 не поддерживает Linux. Разработчикам, которым это требуется, лучше обратить внимание на такие ядра, как ARM9. Но ядро Cortex-M3 в сравнении с ARM7 улучшено с точки зрения RTOS. Ядро имеет два привилегированных режима и два специализированных стека. Также оно имеет большую гибкость с точки зрения установления приоритетов среди прерываний и дополнительный системный таймер Systick. Все это позволяет лучше строить операционные системы реального времени. Для микроконтроллеров STM32 разработано уже множество операционных систем, часть из них приведена в таблице 1 (полный список можно посмотреть на официальном сайте STMicroelectronics).
Таблица 1. Операционные системы реального времени для микроконтроллеров STM32
Компания | Наименование ОС | Описание | ROM | RAM |
---|---|---|---|---|
FreeRTOS.org | FreeRTOS | Надежная портируемая RTOS с открытыми исходными кодами в двух вариантах – платный и бесплатный, с возможностью технической поддержки. Также есть версия SafeRTOS, сертифицированная по стандарту IEC 61508. | 4,2K | 1K |
Micrium | μC/OS-II | Легко портируемая, масштабируемая RTOS, поддерживающая многозадачность (до 250 задач), сертифицированная для критических условий эксплуатации (медицина, авиационная электроника) | 16К | 2К |
IAR | PowerPaс | Полноценная RTOS с высокоэффективной файловой системой. Поставляется с многими примерами и, по выбору – с USB-стеком для приборов класса HID, MSD и CDC. | 2…4K | 51 байт |
Quadros System | RTXC Quadro | Гибкая, масштабируемая RTOS с большим набором стеков и драйверов для периферии (TCP/IP, USB, файловая система, графические GUI-инструменты, CAN и т.д.). Поддерживается средством разработки VisualRTXC – идеальная среда для начинающих работу с 32-битными микроконтроллерами. | <20K | <4K |
Keik | ARTX-ARM | Многозадачная вытесняющая RTOS, поддерживающая почтовой ящик и pool памяти, включает файловую систему и передачу данных по протоколу TCP/IP. | 6K | 0,5K |
CMX | CMX-RT | Операционная система реального времени, поддерживающая многозадачность, без отчислений. | <10K | <1K |
Существуют уникальные возможности работы с STM32, например, специальные библиотеки для модуля Simulink [5] в ПО Matlab от компании Mathworks, предназначенные для генерирования из Simulink готового C-кода под микроконтроллеры STM32. То есть это — возможность разработки программного кода в графическом формате. Компания National Instruments для своего знаменитого ПО Labview предоставляет путь для миграции на Cortex-M3.
В итоге можно сказать, что имеются все условия для успешной, удобной и быстрой разработки. А для выбирающих бюджетные решения имеются очень доступные с точки зрения цены отладки, бесплатные среды разработки и бесплатные библиотеки и операционные системы RTOS. Иными словами, для успеха с STM32 требуются только интеллект и творчество разработчика!
Море удовольствия за малые деньги
STMicroelectronics отличается от других производителей полупроводников прекрасным соотношением «цена/функционал» при сохранении самых высоких стандартов качества. Семейство STM32 — яркий пример этого. В этом семействе можно найти очень дешевые микроконтроллеры серии Value Line STM32F100, которые достигают цены ниже одного доллара, при этом имеют хороший набор периферии. Если сравнивать их с первыми появившимися на рынке решениями на Cortex-M0, то за пару десятков дополнительных центов разработчик получит в разы больше функционала.
STM32F100, как и все микроконтроллеры семейства STM32, имеет встроенный DMA-контроллер, позволяющий разгрузить ядро от обработки и передачи данных. Его отсутствие в текущих имплементациях Cortex-M0 является существенным недостатком в производительности микроконтроллера в целом. Нельзя не отметить наличие в семействе STM32 высококлассной аналоговой периферии. В частности, STM32F100 имеет 12-битный 16-канальный АЦП со временем измерения 1,2 мкс. В других сериях и семействах АЦП — более быстрый (1 мкс или даже 0,5 мкс). Данный АЦП имеет много преимуществ: возможность настройки пакетных измерений (порядок измерения каналов), возможность варьировать длительность измерения по каждому каналу, возможность работать в режиме аналогового сторожа (два программируемых пороговых напряжения), встроенный датчик температуры (приблизительный), внешний триггер. Помимо перечисленного, в микроконтроллерах семейства STM32, которые имеют несколько АЦП, можно увеличить скорость преобразования в несколько раз при помощи совместной работы нескольких АЦП. Например, в линейке STM32F-1 можно достичь скорости 0,5 мкс, а в случае линейки STM32F-2 — до 160 нс (!).
STM32F100 имеет также много вводов/выводов общего назначения (GPIO). Семейство STM32 отличается от своих конкурентов на рынке высоким процентом GPIO от общего количества ножек корпуса: например, в серии STM32F100 корпус LQFP48 имеет 37 GPIO, корпус LQFP64 — 51 GPIO, корпус LQFP100 — 80 GPIO. Эти GPIO имеют высокую степень гибкости, их можно не только сконфигурировать в разные стандартные режимы (двухтактная схема, открытый коллектор, pull-up, pull-down и т.д.), но и переназначить входами или выходами для периферии (remapping). Скорость GPIO регулируется в целях снижения электромагнитных помех: в случае STM32F100 она может быть 2 МГц, 10 МГц и, теоретически, до 50 МГц, но здесь ограничительным фактором будет частота тактирования самого ядра, которая составляет 24 МГц. В случае семейства STM32F-2 скорость работы GPIO может достичь 100 МГц. Это открывает новые возможности управления и передачи данных. Можно программно создать собственные интерфейсы. Семейство STM32 отличается и замечательным встроенным CAN 2.0 контроллером, лицензия на который была куплена непосредственно у создателя этого стандарта, компании Bosch.
В некоторых линейках STM32 имеется полезная периферия FSMC и SDIO (например, в сериях STM32F101, STM32F103). FSMC — интерфейс для использования внешней памяти типа SRAM, NOR Flash, NAND Flash. SDIO — интерфейс для работы с карточками памяти типа SD, mini SD, micro SD, MMC. Единственный тип памяти, не охваченный семейством STM32, это память типа DRAM, но для большинства разработчиков это не требуется. Упомянем также, что в семействе STM32 есть встроенный аппаратный СRC (Cyclic Redundancy Check — циклический избыточный код). Данная функция позволяет не загружать ядро процессом проверки качества обмена данных. Все микроконтроллеры STM32, кроме STM32W, имеют множество многофункциональных 16-битных таймеров (STM32F-2 имеет 32-битные таймеры) и один или больше 12-битных ЦАП. Семейство STM32F-2 содержит интересную новинку — интерфейс для подключения камер DCMI, который может работать со скоростью до 54 Мбайт/сек, то есть поддерживать камеры с матрицей примерно до 1 мегапикселя. Также этот интерфейс может получать данные от камеры в сжатом формате JPEG. Это открывает новые возможности для систем безопасности, где не требуется сложная обработка видеосигнала, а достаточно более примитивного функционала, такого, как выполнение фотоснимка во время хищения или функция веб-камеры для передачи данных через встроенный Ethernet. Интерфейсы FSMC и SDIO помогут динамически сохранить во внешней памяти плотный поток данных с камеры. Линейки STM32L, STM32F-2 и все изделия линейки STM32F-1 c памятью больше чем 512 Кбайт имеют встроенный модуль защиты памяти MPU, который позволяет дополнительно повысить безопасность системы. MPU позволяет разделить память на сегменты, установить для них разные уровни доступа (read, write, execute — как в unix). Это позволяет заблокировать для программного кода доступ к отдельным зонам памяти и установить полноценные привилегированные и непривилегированные режимы. Также MPU генерирует прерывание в случае, если программа попробовала получить доступ к защищенным зонам памяти. В семействе STM32 микроконтроллеры с объемами flash-памяти более 512 Кбайт имеют полезную особенность — память разделена на два банка. Это позволяет размещать в каждом банке две отдельные прошивки микроконтроллера и при старте микроконтроллера выбирать ту или иную прошивку, меняя кардинально весь функционал устройства. Также это позволяет динамически, без остановки основной работающей программы в одном банке, загружать в другой банк новый вариант прошивки по одному из коммуникационных интерфейсов и затем быстро переводить микроконтроллер на новый вариант работы ПО.
Семейство STM32 отличается от конкурентов хорошим поведением в температурном диапазоне от -40 до 85°С. Производительность ядра и периферии сохраняется полностью. В семействе STM32 есть ряд изделий, сертифицированных на расширенный температурный диапазон от -40 до 105°С.
Ferrari на 176 ножках
Одна из сильнейших сторон ядра Cortex-M3 — его высокая производительность, которая является результатом всего накопленного опыта компании ARM в области разработки процессорных ядер. Например, ядро Сortex-M3 имеет отдельную шину для данных, отдельную шину для инструкций и отдельную шину для управления периферией (архитектура типа Гарварда). Это избавляет от задержек, которые могут возникнуть с архитектурами Фон — Неймана, где весь поток информации к ядру идет через одну шину. Математические способности ядра также высоки: аппаратное умножение 32 бит на 32 бит включено в ядро Cortex-M3 и выполняется за один цикл частоты тактирования, если результат требуется в 32-битном формате. Аппаратное деление выполняется за 2…12 циклов в зависимости от сложности деления. Значительно улучшена вся схема прерываний: встроен контроллер прерываний NVIC, который позволяет установить до 256 приоритетов между прерываниями с возможностью их динамического изменения. Потеря времени при возникновении конкурирующих прерываний значительно улучшена (12 циклов вместо 24…42 в случае ARM7). Cortex-M3 поддерживает набор инструкций Thumb-2 (смесь 16-битных и 32-битных инструкций без перехода) и оптимизированное использование памяти RAM (bit banding). Все это позволяет иметь теоретическую производительность 1,25 DMIPS/MГц при малом размере программного кода в памяти.
Первая линейка STM32F-1 предоставила разработчикам много возможностей, но с точки зрения производительности была ограничена (72 МГц) и ее достаточно быстро обогнали семейства Stellaris (80 MГц) и LPC17 (100 МГц). В ответ компания ST разработала новую серию STM32F-2, которая работает на частоте 120 МГц и достигает 150 DMIPS. В таблице 2 представлены результаты измерения производительности по стандарту СoreMark [6].
Таблица 2. Сравнение производительности 32-битных микроконтроллеров на основе CoreMark
Микроконтроллер | Частота работы, МГц | CoreMark/MГц | CoreMark |
---|---|---|---|
STMicroelectronics STM32 90nm | 120 | 1,905 | 228,60 |
NXP LPC1768 | 100 | 1,753 | 175,25 |
Microchip PIC32MX440F512H | 80 | 1,745 | 139,61 |
TI Stellaris LM3S9B96 Cortex M3 | 80 | 1,595 | 127,60 |
NXP LPC1768 | 72 | 1,755 | 126,39 |
STMicro STM32F103RB | 72 | 1,504 | 108,26 |
Значение поля «CoreMark» отражает абсолютную производительность микроконтроллера (большие значения соответствуют более высокой производительности). В поле «CoreMark/MГц» представлены нормализованные значения Coremark в отношении к частоте работы микроконтроллера. То есть мы можем судить, насколько эффективно работает микроконтроллер на высокой частоте. Линейка STM32F-2 отличается большей процессорной мощностью. Высокая производительность линейки STM32F-2 достигается благодаря запатентованному акселератору флэш-памяти (см. статью Романа Иванова в этом номере журнала) и новой технологии производства 90 нм. Следует подчеркнуть, что высокая производительность микроконтроллера должна всегда рассматривается вкупе с качеством периферии, поскольку недостатки периферии часто приходится компенсировать ядру. В случае STM32 периферия исполнена на самом высоком уровне. Также надо отметить, что микроконтроллеры семейства STM32F-2 имеют версии в корпусе со 176 выводами.
Сильный, но ест мало
Архитектура ARM Cortex получила огромный успех в мире в первую очередь за счет низкого уровня энергопотребления. Это имеет большое значение в случае телефонов и портативных изделий, и поэтому в любом телефоне или смартфоне сердцем является процессор ARM. Но вопросы энергоэффективности и энергосбережения сейчас становятся актуальными для всех изделий, поскольку в связи с ростом цен на энергоносители каждый лишний мВт имеет все большее значение. Для систем с автономным питанием компания STMicroelectronics специально разработала линейку STM32L, сочетающую в себе высокую производительность ядра ARM Cortex-M3 и низкое энергопотребление. Ядро Cortex-M3 имеет механизм перехода в спящий режим, и этот механизм был дополнен собственными режимами семейства STM32F. В той же линейке STM32L управление энергопотреблением стало намного более гибким за счет добавления новых режимов энергопотребления, динамического режима изменения напряжения ядра и переработанной энергоэкономичной периферии (см. статью Кирилла Автушенко и Романа Попова в этом номере журнала).
В таблице 3 указаны типичные значения электропотребления микроконтроллеров STM32. Микроконтроллеры линейки STM32L изготовляются по специализированному технологическому процессу, где утечки транзисторов минимизированы, и, соответственно, эти изделия имеют наилучшие показатели. В таблице аббревиатура TBD означают «будет определено позднее» (to be defined), то есть измерение этих параметров еще не было выполнено производителем. Это связано с тем, что микроконтроллеры линейки STM32F-2 только что вышли на рынок.
Таблица 3. Энергопотребление микроконтроллеров STM32 в разных режимах (типовое значение при комнатной температуре)
Линейка | Частота, при которой измеряется потребление | Работа из флэш-памяти, периферия активна | Работа из RAM, периферия активна | Режим STOP | Режим Standby |
---|---|---|---|---|---|
STM32F-1 | 74 МГц | 434 мкА/МГц | 375 мкА/МГц | 21 мкА | 3,4 мкА |
STM32L | 32 МГц | 300 мкА/МГц | 243 мкА/МГц | 1,6 мкА | 0,3 мкА |
STM32L | 4 МГц | 220 мкА/МГц | 180 мкА/МГц | 1,6 мкА | 0,3 мкА |
STM32F-2 | 120 МГц | ТВD | 415 мкА/МГц | 350 мкА | 4,0 мкА |
Основное преимущество линейки STM32L выражается в режимах STOP и Standby, где энергопотребление падает до 1,6 мкА и 300 нА соответственно. Режим STOP — это режим, в котором все источники тактирования остановлены, но содержимое RAM-памяти сохраняется, и переход в активный режим требует всего нескольких микросекунд. В режиме Standby все отключено полностью, кроме часов реального времени. Пробуждение от этого режима уже требует нескольких десятков микросекунд. Надо еще отметить, что в линейке STM32L есть режим Low Power Run, в котором ядро полностью работает от низкочастотного внутреннего тактового генератора (32 кГц), и в этом режиме потребление падает до 10 мкА.
Без сомнения, типовое потребление микроконтроллера STM32L в активном и спящем режимах будет выше, чем у лучших низкопотребляющих 8-битных или 16-битных микроконтроллеров конкурентов. Но высокая производительность STM32L позволит выполнить все задачи за более короткое время и вернуться в спящий режим (рисунок 5), и в итоге среднее потребление будет ниже по сравнению с 8- или 16-битным изделием. Поэтому вопрос низкого потребления не столь прост, как это иногда преподносится разработчикам.
Рис. 5. Сравнение энергопотребления 8- или 16-битных низкопотребляющих МК и STM32L
Для правильного выбора микроконтроллера требуется четкая оценка режимов работы и их длительности, не говоря о том, что периферия в 8-битных и в 16-битных микроконтроллерах будет чаще всего примитивнее, чем у STM32L, который имеет «честные» часы реального времени, интерфейс USB 2.0 Full speed, 12-битный 24-канальный 1 мкс АЦП; 4 Кбайт EEPROM-память, выдерживающую 300 тысяч циклов стирания и программирования, и т.д.
Скрытое преимущество
Есть еще одно скрытое преимущества семейства STM32. То, что STM32 — вероятно, самый лучший контроллер с Cortex-M3 на рынке, многие понимают. И всем хочется присоединиться к этому успеху. Поэтому многие российские компании-дистрибьюторы электронных компонентов начали активно заниматься этим семейством. Что это означает для разработчика? — Что количество обученных инженеров и количество информации и документации на русском языке будет быстро увеличиваться. То есть возможностей по технической поддержке будет все больше и больше. Это косвенно означает и хорошую доступность этого семейства на складах, что также является немаловажным аспектом.
Заключение
Вы можете считать эту статью рекламной и не верить автору на слово. Вместо этого просто поговорите с разработчиками, которые попробовали в деле STM32, или почитайте электронные форумы. Отзывы в большинстве случаев положительные, а иногда — очень положительные; претензии относятся к качеству документации и к исполнению интерфейса I 2 C. Еще один нейтральный способ для сравнения: Google trends [7]. Google trends показывает историю количества запросов по тому или иному слову. То есть, благодаря этому поисковому средству можно увидеть, в каком объеме и с какой тенденцией идет поиск на некую тему. Мы решили сравнить семейства «STM32», «Stellaris» (Texas Instruments), «AVR32» (Atmel) и «PIC32» (Microchip). Результат можно увидеть на рисунке 6. Очевидно, что есть большой и постоянно растущий интерес в мире к семейству STM32. Также можно увидеть, что ядра собственной разработки или находятся на том же уровне (PIC32) или интерес к ним постепенно снижается (AVR32), тогда как спрос на другое семейство микроконтроллеров на ядре Cortex-M3 (Stellaris) растет. Хочу отметить, что количество запросов в поисковых системах не прямо пропорционально количеству реальных продаж.
Рис. 6. Сравнение поисков на темы «STM32», «Stellaris» и «AVR32» в Google trends
Разработчик, который решит попробовать семейство STM32, не разочаруется. STM32 — это идеальная платформа для перехода с 8-битного микроконтроллера на 32-битный. Она позволяет многими способами оптимизировать и минимизировать расходы во время разработки и производства. Время 32-битных микроконтроллеров наконец наступило.
Микроконтроллер stm32 где используется
Микроконтроллеры. Начало. STM32.
Автор: Александр Скалдуцкий, scelikr@gmail.com
Опубликовано 20.09.2013
Создано при помощи КотоРед.
Участник Конкурса «Поздравь Кота по-человечески 2013!»
Микроконтроллеры для котят
Всем Мяу, котаны 🙂
Как-то раз от меня ушла кошка 🙁 Ну и чем валерьянку лопать, я решил заняться делом, так сказать «на благо Родине». Давно уж хотел цифровыми устройствами заняться, да времени не было (сами понимаете, то спать, то с кошкой по крышам гулять), а тут как раз время-то и появилось. Ну-с начнём..)
Всё как обычно начинается с выбора. Ну вроде выбор-то небольшой PIC, да AVR. Последние мне как-то больше приглянулись. Нужен был ещё и USB программатор за неимением других портов на компьютере, от цены которого у меня чуть хвост не отвалился. Ещё Arduino есть — зверёк такой. Его и программировать по USB можно. Ну, думаю, «то что доктор прописал». В селе нашем его только через интернет-магазин достать можно. Нашёл, где по-выгодней, чуть не купил и. ОПА! Смотрю — STM32VL-Discovery. Что за зверь такой? Хм, STM32.. Что-то слышал краем уха.. А от характеристик усы дыбом, честно!
А лап-то у неё сколько!
- У Arduino 14 цифровых портов ввода/вывода и 6 аналоговых входов. У STM32VL-Discovery 45 цифровых входа/выхода 10 из которых по желанию превращаются в аналоговые входы.
- У Arduino 32 Кб для хранения программы и 2 Кб ОЗУ. У STM32VL-Discovery 64 Кб для хранения программ и 8 Кб ОЗУ.
- У Arduino тактовая частота 16 МГц у STM32VL-Discovery же 24 МГц.
- Любой микроконтроллер STM32 можно заменить другим STM32, но с лучшими характеристиками, без изменения схемы
- STM32 можно программировать без программатора по COM порту (об этом чуть позже)
- Цена Arduino на момент написания статьи
1300 рублей, STM32VL-Discovery
А что дальше? В STM32VL-Discovery есть встроенный программатор/отладчик, который лёгким движением лапы (снятием перемычек) может программировать и отлаживать (отладка очень уж вещь полезная, но об этом чуть позже) микроконтроллеры STM32 за пределами платы. С Arduino такое не прокатит. То есть используя STM32VL-Discovery мы и деньги экономим и получаем большую производительность и свободу творчества 🙂
Да и сами микроконтроллеры STM32 выглядят привлекательней остальных:
STM32F100C4T6B | ATtiny24A-SSU | PIC16F688-I/SL | STM32F103RET6 | ATmega1284P-PU | PIC18F4550-I/PT | |
Средняя цена, руб | 60 | 65 | 60 | 240 | 330 | 220 |
Тактовая частота, МГц | 24 | 20 | 20 | 72 | 20 | 48 |
Flash память, Кбайт | 16 | 2 | 4 | 512 | 128 | 16 |
RAM, Байт | 4096 | 128 | 256 | 65536 | 16384 | 2048 |
USART, шт | 2 | 0 | 0 | 5 | 2 | 0 |
SPI, шт | 1 | 1 | 0 | 3 | 1 | 1 |
АЦП, шт | 16x12Bit | 8x10Bit | 8x10Bit | 16х12Bit | 8x10Bit | 13x10Bit |
ЦАП, шт | 1x12Bit | 0 | 0 | 2х12Bit | 0 | 0 |
Количество линий ввода/вывода, шт | 37 | 12 | 12 | 51 | 32 | 35 |
А ещё STM32 32-х разрядные, а это означает возможность работы с 32-х битными данными за один такт. AVR и PIC этим не похвастаются.
Ну что, котаны, убедил? Тогда начнём курс молодого бойца цифровика!)
Как оно работает? Из чего состоит? Что умеет?
Как известно, все коты очень любознательные, а радиокоты особенно!
Микроконтроллер — это микросхема сочетающая в себе функции процессора, периферии, имеющая ОЗУ, flash память. Как компьютер, только меньше!
Проведём аналогию: компьютером управляет операционная система, а микроконтроллером «прошивка», которую пишете Вы; операционная система компьютера хранится на жёстком диске, «прошивка» микроконтроллера в его flash памяти; функции ОЗУ схожи — хранение изменяющихся данных во время выполнения программы. А ещё у МК есть различные периферийные устройства, такие как АЦП и ЦАП например.
МК общается с внешним миром при помощи лап на его корпусе (не таких как у котов, конечно, а металлических). Но не все из них управляются программой, есть выводы питания, вывод сброса, выводы питания периферии, вывод резервного питания. А те, которые управляются программой делятся на группы называемые «порты». Все эти управляемые выводы называются 2-мя буквами и цифрой. Например PA1: P — порт, А — порт «А», 1 — номер вывода этого порта.
В программе порты конфигурируются либо на вход, либо на выход, по вашему желанию.
Выводы порта настроенного на вход могут быть в разных режимах, для каждого вывода он может быть своим:
- Цифровой вход — вход, значение которого (логическая 1 или 0) можно считывать программой. Если напяжение на входе 0, то значение равно 0, если на входе напяжение равное напрядению питания, то значение входа 1. Третьего не дано. Можно сделать с подтягивающим резистором либо к питанию, либо к массе
- Аналоговый вход — вход значение которого можно считывать программой, но значений может быть много — целых 4096. А точнее от 0 если на входе напяжение 0 относительно минуса питания микроконтроллера до 4095, если на входе напряжение равное напряжению питания. Все эти преобразования делает АЦП — аналогово-цифровой преобразователь, при помощи его можно например измерять напряжение на терморезисторе и узнавать температуру или измерять напяжение на фоторезисторе и узнавать яркость попадающего на него света. Ну много чего можно придумать, если фантазия есть 🙂 Если питать микроконтроллер от 3В, то 0В = 0, а 3В = 4096, значит 3/4096=0.000732421, т.е. при изменении напяжения на входе на 0.000732421В значение входа в программе меняется на 1. Не так-то всё и сложно, да? Идём дальше
- Цифровой вход в режиме альтернативной функции — вход для работы с периферией. Например вход для таймера или вход для какого-нибудь интерфейса. Из программы значение этого входа считать нельзя. В программе можно например считать данные полученные по этому выводу каким-нибудь интерфейсом.
А у порта настроенного на выход выводы могут быть в таких режимах:
- Выход. Просто выход. Обычный цифровой выход. На выводе либо напрядение питания (логическая 1) либо на выводе нет напряжения (логическая 0). Всё просто.
- Выход в режиме альтернативной функции — выход управляемый периферией. Этим выходом нельзя управлять из программы, но программой можно заставить управлять этим выводом например интерфейс.
Но не все выводы можно назначать «как захочется». Для того, что бы узнать, что можно, а что нельзя нужно посмотреть документацию (таблица 4) или воспользоваться программой MicroXplorer.
Перед использованием порта его нужно сначала тактировать — подавать на него тактовые импульсы, т.к. изначально они не подаются для экономии энергии. Можно выбрать разную частоту тактирования — больше частота — быстрее работают входы или выходы этого порта, но и больше потребление энергии.
Ещё есть выводы BOOT 0 и BOOT 1. Эти выводы не относятся к портам, они служат для управления загрузкой микроконтроллера. Если во время подачи питания на выводе BOOT 0 логический ноль (вывод соединен с общей точкой), то микроконтроллер выполняет программу загруженную во flash память, т.е. Вашу прошивку. Если во время подачи питания на выводе BOOT 0 логическая еденица (вывод соединен с питанием микроконтроллера), а на выводе BOOT 1 логический ноль, то микроконтроллер выполняет не Вашу прошивку, а записанный на заводе загрузчик. Запомните это! Вы будете часто пользоваться этим в процессе работы с микроконтроллерами STM32! Иногда загрузка записанного с завода загрузчика — единственный способ записать/изменить прошивку микроконтроллера. Это бывает например при конфигурировании в прошивке выводов, к которым подключается программатор или при прошивке микроконтроллера без использования программатора. Так что настоятельно рекомендую при проектировании печатной платы эти выводы (или хотя бы BOOT 0) распологать в удобном месте.
Вот разобрались 🙂 Теперь знаем что такое микроконтроллер, из чего он состоит. Сейчас узнаем ещё о некоторых премудростях и перейдём к самому интересному — практике!
Программа в микроконтроллере выполняется пошагово. Один такт процессора — один шаг программы.
Например пусть перемигивается красная и зелёная лампочки, пока НЕ нажата кнопка. Длительность каждой лампы — 5 секунд. Вот алгоритм:
- Проверяем, на входе с кнопкой есть напряжение? (кнопка замыкает вывод микроконтроллера на + питания)
- Если нет напряжения, то загорается красная лампочка на 5 секунд, зелёная тухнет, если есть напряжение, то начинаем всё сначала
- Снова проверяем
- Если нет напряжение, то загорается зелёная лампочка на 5 секунд, красная тухнет, если есть напряжение, то начинаем всё сначала
- Начинаем сначала
СТОП! А если я нажму кнопку, пока горит лампочка? То ничего не произойдёт! Потому что программа выполняется пошагово, а шаг с проверкой нажатия кнопки находится в момент переключения лампочек.
Вот именно для таких случаев есть такая вещь, как прерывания
Прерывания дают возможность прервать выполнение основной программы. Сделать это можно или внешним событием (нажатие кнопки, отпускание кнопки приём данных и пр.) или внутренним (по таймеру или пришло время кормить кота например). Когда происходит это самое прерывание, то начинает выполняться подпрограмма. Подпрограммы могут быть разные для разных видов прерываний, эти подпрограммы называются обработчики прерывния.
Когда этот самый обработчик прерывания закончит свою работу, основная программа начинает выполняться с того места, где была прервана.
Ну, котята, пора вставать на лапы! Надеюсь у Вас уже есть отладочная плата? Или хотя бы микроконтроллер? Надеюсь есть 🙂 А если нет, то бежим в магазин! (и желательно не за колбасой. хотя. ) Какое же это учение без практики?
Отлично на первых порах иметь отладочную плату, например STM32VL-Discovery, но если жаба душит или всё-таки нехватает на колбасу, то можно обойтись и одним микроконтроллером и преобразователем интерфейсов RS-232 ->UART (напр. MAX3232) или USB ->UART (напр. FT232RL). В этом случае в 100 рублей можно вполне уложиться, но придётся делать печатную плату и паять минимум 48 выводов шириной 0,3 мм с зазором 0,2 мм. Я предупреждал.
Сначала нужно естественно прикошачить отладочную плату или контроллер к компьютеру.
Если у Вас отладочная плата:
С отладочной платой, конечно проще. Берём шнурок Mini-USB и соединяем плату с компьютером, все драйверы должны поставиться автоматически. Увидеть STMicroelectronics STLink dongle в диспетчере устройств — хороший знак! Ну а если что-то пошло не так и ничего не вышло — не надо царапать диван, нужно просто зайти сюда и установить STM32 ST-LINK utility.
Ну а если Вы счастливый обладатель компьютера под управлением Windows 8, то перед проведением вышеописанных действий нужно сделать так: Параметры -> Изменение параметров компьютера -> Общие -> Особые варианты загрузки и выбрать параметр Отключение проверки подписи драйверов.
Если у Вас микроконтроллер:
Если у Вас один микроконтроллер, то у Вас должны быть прямые лапы. Но я в Вас не сомневаюсь!
Перед подключением микроконтроллера к компьютеру его нужно припаять к печатной плате. Для этого кроме микроконтроллера и прямых лап нужна как минимум печатная плата. А тут уж Ваше творчество.
Рабочий минимум на схеме ниже:
Но это неинтересный минимум.
Добавьте светодиодов и кнопок (не забудьте про выводы BOOT), например так
А вот с пайкой этой блохи могут возникнуть проблемы. Но я надеюсь, не возникнут. Я накошачился паять её своим любимым советским 25 Вт паяльником с шириной жала в 3/4 ширины контроллера. У меня больше проблем с изготовлением печатной платы. ну тут уж у каждого своя технология.
И переходник нужно сделать на UART по документации к той микросхеме, которую купили.
Соединяем выводы TxD и RxD на печатной плате с выводами RxD и TxD соответственно переходника. Не забываем про общую точку и питание всего этого.
Ну вот, товарищи, и прикошачили. Дальше будем повелевать этой шайтан-машиной 🙂
Выбор и установка ПО
Пользоваться мы будем средой разработки CooCox IDE, но это не просто так, а по нескольким причинам:
- Во-первых это свободно распространяемое ПО. А это значит, что Ваша карма будет чиста
- На мой взгляд (да и не только на мой) эта среда разработки удобнее остаальных
- Позволяет использовать отладку
- Много примеров, которые можно загружать в среду разработки (полезно для котят и не только)
Среда разработки — это программа для написания кода, компилятор, отладчик в одном. Удобненько 🙂 Но если какому-то суровому Челябинскому коту удобнее писать код (в блокноте например), компилировать и прошивать разными программами — я не против, тогда Вам пригодится STM32 ST-LINK utilit для загрузки прошивки в микроконтроллер. Хозяин барин, как говорится.
Эта среда разработки основана на многим известном Eclipse.
- Идём сюда
- Тыкаем Download through CoCenter (Recommend)
- Вводим адрес эл.почты (можно от балды, он там «для галочки»)
- После загрузки устанавливаем этот самый CoCenter
- В первой строчке, где написано CooCox CoIDE тыкаем Download
- После того, как загрузка закончится, то вместо Download будет Install. Сюда и жмём
- Идём сюда
- Справа в колонке Download скачиваем файл который .exe. Устанавливаем его.
- Открываем сам CooCox CoIDE, вкладка Project, Select Toolchain Path.
- Указываем путь к файлу arm-none-eabi-gcc.exe (это мы установили в п.8, путь приблизительно такой: D:Program Files (x86)GNU Tools ARM Embedded4.7 2013q1bin)
- Снова открываем CoIDE, нажимаем View -> Configuration, открываем вкладку Debugger и делаем так [фото]
- Радуемся, потому что теперь мы можем написать программу и прошить её в микроконтроллер! Чем мы и займёмся.
Если у Вас вариант без отладочной платы/программатора, то для загрузки программы в МК понадобится программка Flash Loader Demonstrator которая находится здесь
Находим общий язык
Перед тем, как писать свою первую программу нужно найти с МК общий язык. Вряд ли он будет учить наш язык, по этому придется выучить (а может просто вспомнить) язык на котором мы будем общаться с МК, это Си. Понадобятся нам только основы (состав программы, функции, операторы). Если язык этот знаете, то можете сразу перейти к пункту «Первая программа», ну а незнающих я введу в курс дела.
Проект состоит из файлов с расширениями .c и .h. В первых находятся функции во вторых названия используемых функций и константы например. Так уж заведено. Самый главный файл, в котором находится код программы main.c. Для использования различных функций нужно подключать библиотеки с этими функциями. Подключаются они записью #include «название_библиотеки» ну библиотеки естественно должны быть в проекте. Подключают их в самом начале файла.
Функции — это своеобразная часть программы. Вообще программа состоит из одной или нескольких функций. Функция имеет вид:
тип_возвращаемой_переменной имя_функции (тип_переменной)
<
Тело функции
>
В функцию можно отправить какую-нибудь переменную, фунция её обработает и вернёт какое-нибудь значение. Очень удобно использовать функцию для повторяющихся действий, чем писать постоянно один и тот же кусок кода, можно просто отправлять переменную в функцию и получать обратно обработанное значение.
Перед тем, как использовать функцию, её нужно объявить в самом начале файла. Делают это в таком виде:
тип_возвращаемой_переменной имя_функции (тип_переменной);
Ах, да, забыл самое главное! В конце каждой строки должна быть точка с запятой!
Если функция ничего не возвращает (например временная задержка, она просто тянет кота за хвост время), то тип указывают void.
При запуске, первой всегда выполняется функция main().
Ну с функциями вроде разобрались, понимание придёт только с практикой.
Выше я упоминал тип переменной. Все переменные могут быть разных типов, вот основные:
- INT — переменная этого типа может быть только целым числом от -2147483648 до 2147483647
- FLOAT — переменная этого типа число с точностью до 7 разрядов от ±1,5*10-45 до ±3,4*1033
- DOUBLE — число с точностью до 16 разрядов от ±5*10-324 до ±1,7*10306
- ULONG — тоже целое число, но от 0 до 18446744073709551615
- LONG — целое от -9223372036854775808 до 9223372036854775807
- CHAR — один символ
- BOOL — логическая переменная. Она может иметь только 2 значения: истина (true) или ложь (false)
Строку (слово, предложение) можно представить как массив из символов типа char. Например:
char stroka[5] = «Слово»;
Здесь квадратных скобках — количество символов в строке, «stroka» — название массива.
Перед использованием переменной её нужно обязательно объявить. (просто указать тип переменной и имя)
Дальше по плану операторы. Операторы — символы при помощи которых производятся какие либо операции над переменными.
- + — сложение.
- — — вычитание.
- * — умножение.
- / — деление.
- = — присвоение переменной значения.
Например выражение a=b+c значит присвоить переменной a значение суммы значений переменных b и c.
- ++ — инкремент. Увеличение значения переменной на 1
- — — декремент. Уменьшение значения переменной на 1
Например выражение a++ значит увеличить значение переменной a на 1 (то же самое, что и a=a+1)
- == — сравнение, знак «равно». (НЕ ПУТАТЬ С ПРИСВОЕНИЕМ)
- != — сравнение, знак «не равно».
- < — сравнение, знак «меньше».
- <= — сравнение, знак «меньше или равно».
- > — сравнение, знак «больше».
- >= — сравнение, знак «больше или равно».
Например выражение a<b становится истинным, если значение переменной a меньше значения переменной b и ложным, если значения равны или a больше b. Выражение a==b истинно если a равно b и ложно, если a не равно b, НО выражение a=b истинно всегда, потому что это не сравнение, это присвоение переменной a значения переменной b.
- % — остаток от деления
Например если a=5, b=3, то значение выражения a%b будет равно 2 (т.к. 5/3=1 (ост.2))
- << — побитовый сдвиг влево. Не вдаваясь в подробности значение выражения a<<b на языке Си будет равно выражению a*2b
- >> — побитовый сдвиг вправо. Выражение a>>b в программе равносильно выражению a/2 b
- & — логическое И.
- | — логическое ИЛИ.
Чуть не забыл рассказать про циклы. Основные:
тело цикла
Тело цикла (всё что в фигурных скобках) выполняется, когда условие истинно (пока условие не станет ложным).
Дальше идёт цикл всех циклов. Цикл со счетчиком. Он выполняется определенное количество раз, выглядит он так:
for (начальное_значение; цикл_выполняется_до, шаг) <
тело цикла
Начальное_значение — начальное значение счётчика
Цикл_выполняется_до — до достижения какого значения выполняется цикл
Шаг — с каким шагом счетчик считает
тело цикла
Здесь начальное значение переменной i равно 0, цикл выполняется, пока значение переменной i меньше 10, при каждом выполнении цикла к переменной i прибавляется 1. Так же можно изменять значение переменной прямо в цикле.
Дальше по плану «условный переход»:
тело 1
тело 2
В усовном переходе «тело 1» выполняется, если условие истинно и выполняется «тело 2», если условие ложно. Ещё есть такой вариант:
> else if (условие 2) <
В этом случае «тело 1» выполняется, если истинно «условие 1», «тело 2» выполняется, если истинно «условие 2». Таких условий может быть сколько угодно, так же может быть одно else.
Условия могут быть простыми и составными: простые — одно логическое выражение, а составное — несколько логических выражений соединённых знаком & (условия истинно, когда все условия соединённые этим знаком истинны) или | (условие истинно, если хотябы одно условие соединённое этим знаком истинно).
Ещё полезная вещь — комментарии. Помогут разобраться в забытом проекте 🙂 или просто что бы что-то не забыть. Комментировать можно или после знаков // и до конца строки или начинаются знаками /* и заканчиваются */, в таком случае комментарий может быть любое количество строк. На размер программы комментарии не влияют.
Ну вот, из основного вроде всё. На первое время хватит (до написания следующей части статьи)
Не будем отступать от традиций (а то мало ли) и начнём с Hello World. А по пути будем продолжать знакомиться с микроконтроллером и так сказать получать опыт.
Открываем среду разработки:
Нажимаем Browse in Repository
Выбираем ST
И далее свой микроконтроллер.
Потом мы увидим список подключаемых библиотек.
Для нашей простенькой программы нам понадобится: CMSIS core, CMSIS Boot, RCC, GPIO.
Библиотеки CMSIS core и CMSIS Boot — системные, их нужно подключать обязательно
Библиотека RCC для работы с системой тактирования
Библиотека GPIO для работы с портами ввода-вывода
Теперь слева в окне Project открываем файл main.c.
Сначала нужно подключить наши библиотеки (CMSIS подключать не нужно).
Идём в самое начало программы и добавляем строчки:
#include «stm32f10x_gpio.h»
#include «stm32f10x_rcc.h»
Далее нужно сделать функцию задержки (не хотим же мы мигать светодиодом с частотой в несколько МГц?).
void Delay(int i) <
for (; i != 0; i—);
>
Так. Тут по порядку, функция ничего не возвращает, по этому void, название функции Delay, сразу объявляем переменную i типа int. В фигурных скобках тело функции — цикл for. Это его строчная запись. Начальное значение i мы не изменяем, цикл выполняется, пока i не равна нулю (как i становится равна нулю, цикл прекращается, функция «выключаеся»). С каждым выполнением тела цикла (тактом) переменная i уменьшается на 1. Т.е. суть цикла — просто повториться количество раз равное i. Пока выполняется цикл время идёт, происходит задержка.
Далее в главной функции main нужно включить тактирование порта, как это сделать можно посмотреть в файле stm32f10x_rcc.h:
Какой порт ответственный за какой вывод можно посмотреть в документации к МК:
Для тактирования порта С добавляем строчку:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
Далее нужно настроить выводы. Смотрим, в файле stm32f10x_gpio.h в какой структуре настраиваются выводы:
Добавляем в прогармму строчку:
GPIO_InitTypeDef GPIO_Init1;
Этой строчкой мы объявили структуру GPIO_InitTypeDef — дали ей название GPIO_Init для использования в нашей программе далее.
Какие в этой структуре можно настроить параметры и какой вид они имеют, смотрим всё в том же stm32f10x_gpio.h:
Теперь чтобы настроить параметры выводов при помощи структуры нужно написать её название, поставить точку и появится окошечко в котором эти параметры указаны
Дважды щёлкаем по одному из них, и он появляется в строке, далее ставим = (присвоить) и прописываем значение из stm32f10x_gpio.h
Так же поступаем со всеми параметрами. Не забываем точку с запятой в конце каждой строки!
Далее нужна строка инициализации (не обязательно, но во избежании неприятностей желательна)
GPIO_Init(GPIOC , &GPIO_Init);
Теперь будем мигать! Мигать мы будем циклично, сделаем зацикливание в цикле while. Условие цикла будет 1. Еденица — всегда истина, нуль — всегда ложь.. такова се ля ви..
Чтобы подать ток на вывод нужно установить бит, чтобы выключить вывод нужно сбросить бит. Как это делать — всё в том же stm32f10x_gpio.h:
GPIO_SetBits(GPIOC, GPIO_Pin_9);
Delay (200000);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
Delay (200000);
1 всегда истина, значит цикл будет зацикливание.
GPIO_SetBits — функция установки бита
GPIO_ResetBits — функция сброса бита
Delay (200000) — на этой строчке выполнение программы переходит в функцию Delay, в ту самую, в которой цикл for. Число 200000 в скобках — передаётся в эту функцию, как переменная i. (помним строчку void Delay(int i)?) и выполняется тот самый цикл в этой функции, все 200000 раз. Это быстро 🙂 после окончания работы цикла for функция Delay заканчивает свою работу, т.к. она void, то она ничего не возвращает и программа продолжает выполняется дальше.
Т.к. while зациклен, то включение светодиода, задержка, выключение светодиода, задержка будут выполняться бесконечно циклично. Пока не выключится питание или не произойдёт прерывание (об этом в следующей статье).
Ну вот, первая программа готова. Теперь нажимаем F7, программа компилируется.
Теперь если у Вас отладочная плата, то подключаем её при помощи USB шнурка и нажимаем Download Code To Flash. Радуемся выполненной работе и полученным знаниям 🙂
А если у Вас не отладочная плата, то подключите к своей плате переходник сделаный ранее, а переходник к COM-порту компьютера. Далее соедините вывод BOOT 0 c плюсом питания микроконтроллера и включите питание микроконтроллера. Тем самым микроконтроллер войдет в режим прошивки. Вообще процедура прошивки не сложная. Нужно просто следовать указаниям приложения Flash Loader Demonstrator. Сначала указываем номер COM-порта, через который у Вас подключен микроконтроллер и скорость. Для воизбежании сбоев, скорость лучше выбрать поменьше
Если программа увидела Ваш микроконтроллер, то появится окно, в котором будет написано, сколько у него памяти
После нажатия «Next», Вы увидите страницу с адресацией памяти. Она нам не понадобится.
Следующий шаг самый ответственный. Можно выбрать очистку памяти или прошивку
Для прошивки выбираем Download to device и в поле Download from file выбираем компилированный .hex файл, который находится в папке CooCox -> CooIDE -> workspace -> имя_проекта -> имя_проекта -> Debug -> Bin. После снова нажимаем «Next».
После того, как увидим такое окно:
Отключаем питание микроконтроллера, закрываем Flash Loader Demonstrator, отключаем переходник, и включаем микроконтроллер в обычном режиме (когда при включении вывод BOOT 0 соединен с минусом питания микроконтроллера). Радуемся!
Итак, теперь мы знаем, чем микроконтроллеры STM лучше других, знаем как работает микроконтроллер, умеем прошивать микроконтроллер в отладочной плате и в своей плате, знаем основы языка Си, которые нужны для программирования STM32, получили опыт работы с микроконтроллером (надеюсь положительный) и самое главное, теперь Вы можете воплотить свои идеи цифровых устройств в жизнь (и поведать о них, на нашем любимом РадиоКоте)! Пусть пока ещё простенькие, но всё навёрстывается с опытом. А я постараюсь в следующих статьях рассказать об АЦП, ЦАП, прерываниях, использовании отладки и других полезностях.
Удачного воплощения идей!
Все вопросы, не стесняемся, пишем на форум
А ещё хочу поздравить РадиоКота с его главным праздником! Пусть время и течёт, как флюс из упавшего флакона, но РадиоКот всегда останется нашим незаменимым помощником и приютом для котов (и котят) с паяльниками. Здоровья тебе (все 7 штук), нечеловечьего счастья и сбычи кошачих мечт!
ARM – это просто (часть 1)
В виду того, что перед многими желающими начать изучение микроконтроллеров встает множество вопросов, таких как «С чего начать?», «Какой микроконтроллер взять для изучения, ведь их столько много и все они такие разные?», «Какой язык программирования необходимо знать?», «Как запрограммировать микроконтроллер и что для этого нужно?», «Какую первую схему на нем собрать?», а также множество других вопросов. Многие в связи с таким большим обилием вопросов уже в самом начале изучения пугаются кажущейся им сложности освоения микроконтроллеров, ведь для этого необходимо знать как электронику, чтобы уметь собирать схемы с микроконтроллерами, так и быть программистом, для написания программ. Но в действительности не все так сложно, как это может показаться на первый взгляд, ведь для написания своих первых программ достаточно изучить только основы языка программирования, а дальнейший опыт написания программ придет сам с практикой. Что же касается электронной части, то в мире существуют недорогие и в тоже время хорошие отладочные платы с программаторами, приобрести которые не составит проблем. Моей же задачей, при написании данного цикла статей, будет донести читателю базовые знания необходимые для возможности дальнейшего самостоятельного изучения микроконтроллеров. Я постараюсь преподнести всю информацию в наиболее доступном и понятном, для начинающих, виде, а в качестве микроконтроллера для своего рассказа я выбрал один из самых распространенных, дешевых, и, на мой взгляд, перспективных контроллеров STM32. Надеюсь, данный цикл статей будет для Вас полезен и интересен, и Вы тоже начнете создавать свои устройства на микроконтроллерах, ведь это очень интересно, увлекательно и раскроет перед Вами широкие возможности в плане создания собственных электронных устройств.
Почему ARM?
Технический прогресс не стоит на месте, появляются различные все более сложные устройства, и соответственно производители микроконтроллеров спешат не отстать от технического прогресса, разрабатывая все более мощные и «навороченные» микроконтроллеры, при этом постоянно снижая цены на них. В последнее время наметился рост популярности ARM микроконтроллеров, а с приходом бюджетных контроллеров с ядром Cortex-M цена стала настолько доступной, что уже может спокойно конкурировать с 8 и 16 битными контроллерами, такими как AVR, PIC, MSP430 и т.п., а зачастую она даже бывают меньше цены своих восьмибитных собратьев. Помимо этого для ARM микроконтроллеров существует множество средств отладки и программирования, цены на которые, вполне доступные даже для покупки «для домашнего использования». Так, например, официальная отладочная плата STM32VL Discovery имеющая на борту внутрисхемный отладчик ST-LINK и отлаживаемый микроконтроллер STM32F100RBT со 128 кБайт флеш памяти, 8 кБайт ОЗУ и 24МГц тактовой частотой в розницу стоит 10-15 долларов.
Для сравнения возьмем несколько популярных контролеров находящихся примерно в одной ценовой категории и сравним их с ARM контроллером STM32F100C4T6B продающимся по цене менее 1 доллара.
Таблица 1. Сравнительная таблица параметров распространенных микроконтроллеров
Параметр
STM32F100C4T6B
ATmega48PA-PU
ATtiny13A-SSU
PIC16F505-I/SL
Объем флеш памяти (ROM, памяти программ)
Объем оперативной памяти (RAM, памяти данных)
24 МГц, 30 DMIPS
Из таблицы явно видно, что ARM микроконтроллер STM32F100C4T6B по всем параметрам оставляет своих 8-и битных собратьев далеко отстающими. Помимо указанных в таблице особенностей следует также принять во внимание тот факт, что ARM контроллеры являются 32 разрядными, что означает возможность работы с 32 битными данными за один такт процессора, для 8 битных же процессоров для этого требуется гораздо большее количество тактов.
Еще одной приятной особенностью использования микроконтроллеров STM32, является полная аппаратная совместимость в пределах одного корпуса, т.е. если по каким-то причинам не хватает ресурсов заложенного в схему микроконтроллера, всегда можно на его место запаять другой подходящий микроконтроллер. При этом иногда может потребоваться лишь небольшое изменение программы, и таких изменений в программе, как правило, необходимо сделать существенно меньше, чем например при портировании программы с одного микроконтроллера AVR на другой микроконтроллер AVR.
Как мы уже убедились, ARM микроконтроллеры имеют гораздо более высокие технические характеристики и возможности. Мы провели сравнение на самом младшем микроконтроллере STM32, на текущий момент самым «навороченным» из этой серии можно назвать микроконтроллеры STM32F407, имеющий 1 мегабайт ROM памяти, 192 килобайта RAM памяти и работающем на частоте до 168 МГц, при этом выполняя до 210 миллионов операций в секунду.
Данный микроконтроллер включает в себя такие модули как:
- интерфейс камеры;
- крипто/хеш аппаратный процессор;
- Ethernet MAC10/100 с IEEE 1588 v2;
- 2 USB OTG;
- отдельный аудио PLL и 2 полнодуплексных I²S;
- до 15 коммуникационных интерфейсов включающих:
— 6x USART;
— 3x SPI;
— 3x I²C;
— 2x CAN;
— SDIO - 2x 12-bit АЦП;
- 3x 12-bit ЦАП;
- до 17 таймеров 16 и 32 битных работающих до 168 МГц;
- Шина (FSMC) подключения внешних RAM, ROM, NandFlash;
- Контроллер DMA используя его можно легко и непринужденно пересылать блоки данных между периферией и памятью без использования процессора.
Такому богатому набору периферийных модулей, пожалуй, может позавидовать любой 8и битный микроконтроллер.
Вопрос отладки и программирования также не является проблемой, поскольку за 10-15 долларов можно приобрести официальную отладочную плату STM32VL Discovery (см. рис. 1), имеющую выход для программирования внешних микроконтроллеров.
Рис. 1 Фотография STM32VLDiscovery
Но даже если у Вас нет такой платы, то Вы всегда сможете запрограммировать микроконтроллер, через имеющийся в нем заводской загрузчик (bootloader), подключив его через USART или USB к своему ПК, для этого не потребуется каких либо аппаратных программаторов. Для программирования микроконтроллера имеющего встроенный USB бутлоадер, достаточно скопировать файл прошивки на контроллер, как на USB-накопитель. Для программирования микроконтроллера через USART, необходимо произвести его подключение к ПК с помощью преобразователя уровней USART-RS232 либо USART-USB преобразователя и воспользовавшись программой Flash Loader Demonstrator произвести загрузку файла прошивки во флеш память микроконтроллера. Программу Flash Loader Demonstrator можно взять с официального сайта компании ST.
Кроме этого у микроконтроллеров с ядром ARM Cortex-M3, по сравнению, например с ATMega и т.п. нет фьюзов, все управление осуществляется полностью программно, таким образом, отсутствует вероятность испортить микроконтроллер неправильным программированием фьюз битов.
Так почему же, при всех этих преимуществах, ARM микроконтроллеры еще не вытеснили другие контроллеры? Причин этому несколько. Во первых ядро ARM Cortex-M3, благодаря которому появились столь дешевые микроконтроллеры серии ARM, появилось относительно недавно и как следствие пока существует не так много примеров программ и библиотек, но их количество постоянно увеличивается с очень большой скоростью, в том числе большой вклад в это развитие вносят и сами производители микроконтроллеров ST и NXP, создавая различные апноуты и библиотеки. Другим фактором является лень многих людей осваивать новую для них архитектуру, а также необходимость приобретения средств для отладки, ведь им зачастую хватает и восьми битных микроконтроллеров, при этом они очень много сил и времени тратят на то, чтобы уложиться в имеющиеся в микроконтроллере ресурсы. Для начинающих же такое обилие имеющийся периферии и настроек пугает кажущейся сложностью в освоении, но в действительности это является заблуждением, поскольку производители микроконтроллеров позаботились и создали удобные библиотеки для работы с периферией, позволяющей практически не открывая даташит настроить основные периферийные модули. Также сдерживающим фактором на применение микроконтроллеров ARM Cortex-M3 в «домашних условиях» является наличие микроконтроллеров в корпусах LQFP с шагом ножек 0.5 мм, но тем не менее, такую плату при определенной сноровке изготовить ЛУТом не составит большого труда.
Таким образом, рассеяв последние опасения, и убедившись в том, что STM32 на ядре ARM Cortex-M3 это действительно достойный для изучения и применения микроконтроллер, можно смело переходить к первому шагу. Для начала нам потребуется скачать и установить необходимые для работы программы, справочные материалы и библиотеки. Поскольку большинство пользователей, работают под операционной системой Windows, то я буду рассматривать описание программ только для данной операционной системы, но хочу заметить, что пользователи других операционных систем также имеют возможность заниматься разработкой программ для МК ARM STM32. Для этого им необходимо использовать ПО для своей операционной системы, например все необходимое ПО для Linux можно скачать здесь. Но в любом случае описанные мною программы для Windows. возможно запустить под Wine, за исключением возможности внутрисхемной отладки и программирования.
-Flash Loader Demonstrator — программа необходима для загрузки микропрограммы во флеш контроллер, через встроенный бутлоадер;
-ST-LINK Utility – программа для записи/чтения флеш памяти микроконтроллера через отладчик ST-LINK;
-ST-LINK USB – драйвер для отладчика ST-LINK;
-UM0919: STM32VLDISCOVERY STM32 value line Discovery — описание отладочной платы STM32VL Discovery, включающее в себя назначение выводов платы и схему электрическую принципиальную;
-STM32F10x standard peripheral library – стандартная библиотека для работы с периферией от компании ST;
IAR Embedded Workbench for ARM — мощная и эффективная среда разработки для ARM микроконтроллеров на языке C. Поскольку программа является платной, то ссылку для скачивания не указываю, но хочу заметить, что помимо платной версии также существуют и бесплатные версии с ограничением по времени работы программы. Официально бесплатные версии можно скачать с сайта производителя http://www.iar.com, пробная 30 дневная версия доступна по ссылке.
Официальная утилита для конфигурирования периферии microxplorer — Пока что данная программа находится на этапе разработке и в ней реализованы еще не все задуманные функции.
STM32 Генератор программного кода – бесплатная программа для наглядного создания кода настройки микроконтроллера. Данная программа пока что еще является развивающейся и содержит много недоработок, но автор работает над данной программой, постоянно исправляя ошибки, совершенствуя программу и добавляя новые возможности.
Ознакомительное руководство по ARM-микроконтроллерам Cortex-M3– Данное руководство будет полезно для ознакомления со структурой микроконтроллеров семейства STM32 Cortex-M3.
STM_DOC_RU — содержит переводы трех документов с сайта фирмы ST:
Частичный перевод файла «STM32F10xxx Cortex-M3 programming manual.PDF» ревизия 2 от 18.01.2010.
Частичный перевод файла «STM32F105_107_Reference manual.pdf» ревизия 9 от 14.09.2009.
Полный перевод файла «Errata_stm32f107.pdf» ревизия 3 от 14.01.2010.
Работа с данными программами (за исключением IAR Embedded Workbench) довольна простая и не должна вызвать затруднения. О работе в среде программирования IAR Embedded Workbench будет рассказано в третьей части.
Скачав необходимую документацию и установив программы, можно переходить непосредственно к изучению микроконтроллеров.
Что такое микроконтроллер ARM STM32 и как он устроен?
Для начала выясним, что же такое микроконтроллер. Микроконтроллер (англ. Micro Controller Unit, MCU) — микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает в себе функции процессора и периферийных устройств, содержит Оперативное Запоминающее Устройство (ОЗУ) или Постоянное Запоминающее Устройство (ПЗУ). По сути, это однокристальный компьютер, способный выполнять простые задачи. Как и компьютер, микроконтроллер — это электронное устройство, работой которого управляет программа — последовательность команд, заранее загруженная в память. В отличие от микропроцессоров, используемых в персональных компьютерах, микроконтроллеры содержат встроенные дополнительные устройства (такие периферийные модули как таймеры, SPI, USART и т.п.).
Для хранения исполняемого кода программ используется flash память, называемая также ROM памятью или памятью программ. Данная память является энергонезависимой, а количество циклов записи/стирания ограничено порядка 10 000 раз. Данная память является неким подобием жесткого диска компьютера.
Для хранения различных изменяющихся данных, используемых во время выполнения программы, предназначена оперативная память (RAM), или её также называют памятью данных. Эта память может быть записана/стерта любое количество раз, но данные в этой памяти могут сохраняться только пока на микроконтроллер подано питание. Данная память является подобием оперативной памяти компьютера.
Для сохранения редко изменяющихся данных и хранения их во время, когда питание микроконтроллера отключено, используется EEPROM память. Данная память имеется у некоторых видов микроконтроллеров, но в виду её отсутствия в микроконтроллерах ARM Cortex данный вид памяти эмулируется программно, и в качестве физической памяти для сохранения данных используется flash память.
Разумеется, любая выполняющаяся программа на любом микроконтроллере должна «общаться» с внешним миром, для этого у всех микроконтроллеров существуют группы выводов, называемых портами ввода/вывода. Для обозначения выводов портов используется буквенно-цифровое обозначение, такое как А0, А1, А5, В4 и т.п. Буквой обозначается имя самого порта, а цифрой указывается конкретный вывод данного порта. Все выводы одного порта могут быть одновременно изменены на требуемое состояние, выводы разных портов только поочередно, сперва изменяется состояние всех нужных выводов одного порта, затем другого порта. Количество выводов одного порта может насчитывать до 16шт, нумерация выводов начинается с нулевого.
Для примера рассмотрим микроконтроллер STM32F100Cxx. Данный микроконтроллер изготовлен в корпусе LQFP48, и имеет 48 выводов, 37 из которых могут использоваться как порты ввода/вывода. Этот микроконтроллер имеет 4 порта, два из которых, порт А и порт В полные, т.е. содержат все 16 выводов, и два не полных порта, это порты С и D, содержащие только 3 и 2 вывода соответственно.
Оставшиеся выводы задействованы для других функций, таких как питание самого микроконтроллера, выводы Vdd и Vss, питание аналоговой части Vdda и Vssa, вход батарейного питания Vbat, для работы встроенных часов реального времени и вход BOOT0, для выбора загрузки встроенного бутлоадера.
Рис. 2. Расположение выводов микроконтроллера STM32F100Cxx
Порты микроконтроллера могут быть сконфигурированы как на вход, так и как на выход, причем каждый вывод порта настраивается индивидуально. Если вывод порта настроен как вход, то возможны следующие режимы его работы:
- аналоговый вход (для выводов, на которые выведен вход АЦП, аналогового компаратора) (см. рис 3);
- цифровой вход, для непосредственной работы с портом (может иметь верхний (к питанию) и нижний (к общему проводу) подтягивающий резистор) (см. рис. 4);
- цифровой вход в режиме альтернативной функции (используется как вход для различных периферийных модулей) (см. рис. 6).
- В режиме работы на выход, выводы порта могут быть настроены следующим образом:
- выход с непосредственным программным управлением с симметричным выходом (push-pull) (см. рис. 5);
- выход с непосредственным программным управлением с открытым стоком (см. рис. 5);
- выход в режиме работы альтернативной функции (выход для различных периферийных моделей, таких как SPI, USART, ШИМ (PWM) и пр.), с симметричным выходом (push-pull) (см. рис. 6);
- выход в режиме работы альтернативной функции, с открытым стоком (например, выход ШИМ) (см. рис. 6).
Помимо этого, в настройках порта также задается максимальная частота работы порта, данная настройка позволяет снизить энергопотребление микроконтроллера, если не требуется высокая скорость переключения состояния вывода.
Рис. 3 Режим работы вывода порта в качестве аналогового входа
Рис. 4 Режим работы вывода порта в качестве цифрового входа
Рис. 5 Режим работы вывода порта в качестве цифрового выхода
Рис. 6 Режим работы вывода порта в качестве цифрового входа/выхода в режиме альтернативной функции
Несмотря на то, что для работы микроконтроллера достаточно процессорного ядра, RAM и ROM памяти, а также портов ввода/вывода, разработчики микроконтроллеров добавляют в свои изделия различные периферийные модули, позволяющие существенно упростить написание программ, а также повысить эффективность, надежность программ, сократить необходимое количество внешних элементов и многое другое.
Среди имеющихся в микроконтроллере периферийных модулей, можно выделить довольно большую группу, основной задачей которых является обмен данными с различными внешними устройствами, данные модули называются интерфейсами передачи данных. В микроконтроллерах STM32 доступны следующие интерфейсы передачи данных:
Таблица 2. Периферийные интерфейсные модули
Название интерфейса
Описание
FSMC
Интерфейс подключения внешней SRAM, PSRAM, NOR, NANDROM, RAM, NandFlash, Compact Flash памяти, а также для подключения LCD дисплеев с параллельной шиной.
Ethernet
Интерфейс для подключения к компьютерной сети.
SPI/(I2S)
Широко распространенный последовательный интерфейс передачи данных, служит для подключения различных микросхем, карт памяти, LCD дисплеев с последовательной шиной и многое другое.
I2C
Двухпроводная шина передачи данных, служит для подключения различных микросхем и других модулей.
USART
UART
Стандартный универсальный синхронный (асинхронный) приемо-передающий интерфейс, служит для обмена данными с другими устройствами через RS-232, RS-485 шины и т.п..
USB
Современный компьютерный интерфейс передачи данных, предназначен для подключения к микроконтроллеру USB клавиатур, flash накопителей, а также для подключения микроконтроллера к ПК, может работать как в режиме устройства (Device), так и в режиме хоста (Host).
CAN
Промышленный интерфейс передачи данных, также используется в автомобилестроении и т.п.
Camera interface
Специализированный интерфейс, предназначенный для подключения высокоскоростной цифровой камеры, с 8-, 10-, 12- или 14-битной параллельной шиной данных
SDIO
Интерфейс для высокоскоростного подключения SD карт памяти.
HDMI
Мультимедийный интерфейс высокой четкости
Благодаря наличию данных интерфейсов в микроконтроллере, существенно упрощается часть программы, отвечающая за обмен данными с внешними устройствами. Поскольку все функции по передачи и приему данных возлагаются на микроконтроллер, в программе достаточно лишь правильно настроить интерфейсный модуль, а для работы с ним необходимо только записать в соответствующий регистр данные для передачи, всю работу по передаче данных сделает сам микроконтроллер.
Помимо периферийных модулей, отвечающих за обмен данными с внешними устройствами, существуют также и другие различные периферийные модули, значение которых не менее важное, чем интерфейсных модулей. Список этих периферийных модулей приведен в таблице 3.
Таблица 3. Периферийные модули
Название модуля
Описание
Таймер
Очень важный модуль, позволяющий точно отмерять интервалы времени, генерировать выходной ШИМ сигнал, подключать энкодер, подсчитывать период входного сигнала и др.
ADC (АЦП)
Аналогово-цифровой преобразователь (имеет встроенный датчик температуры) предназначен для измерения значений аналоговых напряжений, также может работать как оконный компаратор.
DAC (ЦАП)
Цифро-аналоговый преобразователь выдает на выходе аналоговый сигнал соответствующий заданному цифровому значению.
CRC
Модуль подсчета CRC
RTC
Часы реального времени
DMA
Модуль прямого доступа к памяти
JTAG
Модуль внутрисхемной отладки программы
Прерывания
Поскольку программа выполняется микроконтроллером шаг за шагом в определенной последовательности, а, например, внешнее устройство, подключенное к микроконтроллеру через какой либо интерфейс, может передать данные в совершенно произвольное время, то было бы очень затруднительно постоянно следить за принятием данных от таких внешних устройств, помимо этого очень много процессорного времени уходило бы на постоянные проверки наличия таких событий. По этой причине в микроконтроллерах была добавлена возможность прервать последовательное выполнение основной программы, в случае возникновения определенных событий, и перейти к выполнению подпрограммы, занимающейся обработкой данного события. Такой переход называется «прерывание». По окончанию обработки события («обработчика прерывания») вызвавшего прерывание, программа возвращается к выполнению основной программы, к тому самому месту, с которого она была прервана.
Но прерывание может быть вызвано не только внешними сигналами, но и внутренними устройствами самого микроконтроллера: таймерами, часами реального времени и др. Опять-таки, делается это в основном для того, чтобы уменьшить количество выполняемых команд по анализу состояния этих периферийных устройств и облегчить написание программ.
Немного подытоживая описанное, можно сделать вывод, что любой микроконтроллер состоит из:
Ядра микроконтроллера (в нашем случае ARM Cortex-M3), выполняющего программные команды;
Flash памяти для хранения кода выполняемой программы;
RAM памяти, для хранения переменных данных;
Портов ввода/вывода, для «общения с внешним миром»;
Периферийных модулей, выполняющих программные и/или аппаратные действия;
Контроллера вложенных векторизованных прерываний, позволяющего по определенному событию прервать выполнение основной программы и перейти к выполнению другой подпрограммы;
Шины данных, соединяет всё вышеперечисленное в единое целое устройство.
Устройство микроконтроллера
Немного разобравшись со структурой микроконтроллеров серии STM32, можно переходить к более детальному изучению данной серии микроконтроллеров основываясь на конкретном микроконтроллере. Поскольку на нашей отладочной плате установлен микроконтроллер STM32F100RBT6B, то именно на его примере мы и продолжим наше изучение.
Для начала рассмотрим схему включения микроконтроллера STM32F100RBT6B в отладочной плате STM32VLDiscovery (см. рис. 7).
Рис. 7. Схема электрическая принципиальная включения отлаживаемого микроконтроллера платы STM32VLDiscovery
Как видно из схемы на рисунке 7, все выводы портов микроконтроллера выведены на внешний разъем, это сделано для возможности использования подключения к данному контроллеру внешних устройств и элементов.
На данной плате также имеется пользовательская кнопка В1, подключенная к нулевому выводу порта А (РА0). В свободном состоянии кнопка разомкнута и через резистор R21 вход порта подтянут на землю, конденсатор С22 защищает вход от внешних наводок. При нажатии на кнопку, вход микроконтроллера РА0 замыкается на плюс питания, таким образом на микроконтроллер подается логическая единица.
Кнопка В2 замыкает вывод микроконтроллера RESET на общий провод, таким образом, это приводит к аппаратному сбросу программы. По отпускании кнопки, через подтягивающий резистор R24, вход RESET подтягивается к +3,3В, и контроллер начинает выполнение программы с самого начала.
Вывод микроконтроллера BOOT0, разрешающий запуск встроенного загрузчика (бутлоадера), через резистор R14 и перемычку SB16 подключен к общему проводу, таким образом, он запрещает запуск встроенного бутлоадера. Для разрешения запуска встроенного бутлоадера необходимо замкнуть вывод BOOT0 на +3,3В. Если в момент сброса на BOOT0 окажется низкий логический уровень, то не зависимо от того, какой уровень на BOOT1 МК грузится из внутренней флеш памяти (запускается написанная нами программа). В случае если на BOOT0, во время перезагрузки/включения, окажется высокий уровень, тогда анализируется вход BOOT1, чтобы определить вариант дальнейшей загрузки, т.е. грузиться микроконтроллеру из внутреннего бутлоадера или из оперативной памяти.
К выводам 3 микроконтроллера (OSC32_OUT) и 4 (OSC32_IN) подключен кварцевый резонатор Х3, с рабочей частотой 32768Гц. Данный кварцевый резонатор предназначен для тактирования встроенных часов реального времени. Для тактирования самого микроконтроллера установлен кварцевый резонатор Х2, работающий на частоте 8МГц. Этот кварц установлен в специальную панельку и без проблем может быть заменен на другой либо убран.
К выводам 8 и 9 порта С через токоограничительные резисторы подключены зеленый LD3 и синий LD4 светодиоды.
Выводы 46 (TMS/SWDIO) и 49 (TCK/SWCLK) контроллера подсоединены к установленному на этой же плате ST-Link программатору-отладчику и используются для программирования и внутрисхемной отладки микроконтроллера.
Установленный микроконтроллер имеет следующие характеристики:
- ROM 128кБайт,
- 8кБайт RAM,
- 7 таймеров,
- 2 SPI интерфейса,
- 2 I2C интерфейса,
- 3 USART интерфейса,
- Один 16-и канальный, 12-и битный АЦП,
- Два двухканальных 12-и битных ЦАП,
- 7-и канальный DMA контроллер,
- 51 линию ввода/вывода
- Максимальная тактовая частота 24МГц,
- Диапазон питающих напряжений 2.0-3.6В
Расположение выводов микроконтроллера, с кратким описанием некоторых из них приведено в таблице 4.