Вы находитесь на странице: 1из 8

Лабораторная работа № 1

Основные сведения о микроконтроллерах STM32

Микроконтроллер (МК) – это кусок кремния в пластиковом корпусе с металлическими


выводами, который самостоятельно не выполняет никаких функций. Однако он способен решать
множество сложных задач с довольно высокой скоростью при наличии записанной («прошитой»)
в него программы. Поэтому нашей задачей является научиться писать программы для
микроконтроллера, тем самым превращая его из куска кремния в кусок «золота».

Кристаллы МК размещаются в стандартных корпусах, которые имеют строго определенное


количество выводов. Микроконтроллеры изготавливаются в трех принципиально разных видах
корпусов.

DIP корпус

Сокращенно от английского Dual In—Line Package – корпус с двумя рядами выводов. Расстояние
между выводами составляет 0,1 дюйма, что равно 2,54 мм. Также подобные корпуса еще
обозначают PDIP. Первая буква “Р” обозначает, что корпус пластиковый – Plastic.

SOIC корпус

Его аббревиатура расшифровывается так: Small—Outline Integrated Circuit. Он используется при


пайке поверхностным монтажом, т. е. выводы микросхемы припаиваются к контактным
площадкам, расположенным на поверхности платы, а не вставляются в отверстия, как DIP корпус.
Расстояние между выводами у SOIC корпусов в два раза меньше, чем в DIP и составляет 1,27 мм.

QFP и TQFP корпуса

Еще меньшие габариты имеет тип корпуса QFP (Quad Flat Package) или TQFP (Thin Quad Flat
Package). Отличительной особенностью его является расположение выводов по всем четырем
сторонам, а сам корпус имеет форму квадрата. Как и SOIC, TQFP предназначен для
поверхностного монтажа. Расстояние между выводами в 3 раза меньше, чем в DIP корпусах.
QFN корпус

Наиболее экзотическим с точки зрения любительской практики является корпус QFN (Quad Flat
No—leads). Такой корпус имеет наименьшие габариты среди всех рассмотренных корпусов. В
качестве выводов здесь используются контакты, расстояние между которыми в 6 раз меньше, чем
в DIP корпусах. По этой причине они редко применяются радиолюбителями. Однако в
промышленности такие корпуса находят широкое применение, поскольку габариты готового
электронного устройства можно снизить в десятки раз.

Сравнение

Основные возможности микроконтроллеров

Микроконтроллеры способны принимать сигналы, например, с различных датчиков, кнопок или


клавиатуры, обрабатывать их и выдавать управляющие сигналы, например, для отображения
информации на семисегментных индикаторах или жидкокристаллических дисплеях.

С помощью МК можно формировать очень точные временные интервалы благодаря наличию


встроенных таймеров-счетчиков. Это позволяет создавать часы, таймеры, секундомеры и прочие
устройства, где необходимо учитывать отрезки времени.
Также МК применяются для подсчета импульсов, что дает возможность сосчитать количество
срабатываний какого-либо устройства. Например, можно подсчитать количество срабатываний
реле с целью контроля или автоматизации определенного процесса.

Если подсчитать количество импульсов за единицу времени, то мы получим частотомер.

Наличие встроенного устройства широтно-импульсной модуляции (ШИМ) позволяет управлять


частотой вращения вала двигателя.

Многие микроконтроллеры имеют в своем кристалле аналогово-цифровые преобразователи, с


помощью которых можно создавать различные измерительные устройства, такие как вольтметры,
амперметры, омметры, измерители емкости и т. п.

Еще микроконтроллеры могут обмениваться данными между компьютером и другим МК. Для
этого практически в любом МК имеется встроенный один или несколько интерфейсов передачи
данных: USART, SPI, CAN, USB и др.

В чем отличие микроконтроллера от микропроцессора?

Часто микроконтроллер называют микропроцессором, однако, это не совсем так. Микропроцессор


выполняет лишь ряд арифметических и логических операций. Микроконтроллер же содержит в
себе микропроцессор и другие функциональные узлы, такие как порты ввода-вывода, память
аналогово-цифровые преобразователи, ШИМ и прочее. В общем случае микроконтроллер
является аналогом материнской платы компьютера, на которой расположены все устройства, в том
числе и центральный процессор. А микропроцессор – это всего лишь отдельный элемент,
обладающий высокой вычислительной мощностью.
Какой тип микроконтроллера выбрать для начального изучения?

Для того чтобы освоить программирование микроконтроллеров на достаточно хорошем уровне,


сначала необходимо научится программировать какой-то один тип микроконтроллеров и изучить
все его возможности. Тогда гораздо проще будет освоить и другие типы МК.

К основным критериям выбора МК относится:

— доступность, т. е. МК можно легко купить в любом радиомагазине;

— низкая стоимость. Здесь все понятно;

— наличие подробной технической документации;

— бесплатное программное обеспечение;

— наличие литературы и достаточного количества примеров по выбранному типу МК.

Для того чтобы микроконтроллер мог решать задачи и выполнять определенные функции, его
нужно запрограммировать, т. е. записать в него программу или же код программы.
IDE – Integrated Development Environment – интегрированная среда разработки. В них можно
писать код, компилировать и отлаживать его.

Если микроконтроллера в наличии нет, то его работу можно имитировать с помощью программы
Proteus. Она значительно упрощает процесс отладки программы даже при наличии МК, чтобы его
часто не перепрошивать, ведь любой МК имеет конечное число перезаписей, хотя это число
достаточно большое.

Память

В общем случае внутри микроконтроллера может быть четыре вида памяти:

Постоянная память (флэш-память) используется для хранения пользовательских программ и,


иногда, некоторых настроек самого микроконтроллера. Если при указании на характеристики
микроконтроллера пишут объём памяти, не указывая, какой именно — как правило, это про флэш.
Содержимое флэша не сбрасывается при пропадании питания, срок хранения информации в нём в
нормальных условиях обычно не менее 10 лет.
Оперативная память используется для выполнения пользовательской программы и хранения
«сиюминутных» данных. ОЗУ всегда сбрасывается при перезагрузке или выключении питания, а
также может не сохраняться при входе в некоторые режимы сна. В микроконтроллерах часто нет
чёткого разделения на память программ и память данных — в результате можно встретить термин
«выполнение из ОЗУ», означающий, что в ОЗУ находятся не только данные, но и сама программа;
впрочем, это достаточно экзотические случаи.
EEPROM. Тоже относится к постоянной памяти, но существенно отличается от флэш-памяти
своими характеристиками. У флэша есть два больших недостатка, делающие его очень неудобным
для сохранения из программы каких-то текущих данных: во-первых, у флэша ограниченное число
перезаписей одной и той же ячейки, во-вторых, с флэшом часто можно работать только целыми
страницами, которые имеют размер в сотни байт, даже если вам надо перезаписать всего один
байт. EEPROM этих недостатков лишён — срок его службы обычно вдесятеро больше (от 100 тыс.
до 1 млн. перезаписей), и работать в нём можно с каждым байтом по отдельности. По этой
причине EEPROM используют для постоянного хранения данных, генерируемых самой
программой (архивы измерений, настройки программы и т.п.), его типовой объём составляет
единицы килобайт, но есть он не во всех контроллерах.
Системная память. Области постоянной памяти, недоступные пользователю для записи, а
записывающиеся при производстве микроконтроллера. Обычно в них находится исполняемый код
загрузчика, но могут также храниться какие-либо калибровочные константы, серийные номера
или даже вспомогательные библиотеки для работы с периферийными устройствами

Посмотреть на организацию памяти конкретного контроллера можно в его даташите.

Общение со всеми периферийными устройствами микроконтроллера и всеми его настройками


осуществляется с помощью всего двух операций:
 прочитать значение по заданному адресу
 записать значение по заданному адресу

Всё, что есть внутри микроконтроллера, обязательно отображено на какой-то адрес. Эти адреса
называются регистрами. В них находятся некие специальные данные, которые специфическим
образом отображаются на состояние различных аппаратных блоков микроконтроллера.
Всё, что не является вычислительными операциями, за которые отвечает само ядро процессора,
осуществляется с помощью записи или чтения того или иного регистра. Какие бы библиотеки не
были наворочены в вашей программе сверху — в конечном итоге всё сводится к регистрам.

Работать с числовыми адресами довольно неудобно, поэтому для каждого микроконтроллера на


ядре Cortex-M существует библиотека CMSIS (Cortex Microcontroller Software Interface Standard),
самый важный компонент которой для нас — заголовочный файл, описывающий имеющиеся в
конкретном контроллере регистры и дающий им относительно человекочитаемые имена.
С использованием CMSIS можно записать некоторые операции:

int pin_num = 2; /* PA2*/


GPIOA->MODER &= ~(0b11 << (pin_num*2)); /* сбросили биты настройки ножки PA2 на всякий
случай */
GPIOA->MODER |= 0b01 << (pin_num*2); /* установили биты настройки ножки PA2 в 01 — выход
*/
GPIOA->ODR |= 1 << pin_num; /* установили ножку PA2 в 1 */

GPIOA->MODER &= ~(0b11 << (pin_num*2)); /* сбросили биты настройки ножки PA2, теперь это
вход */
uint32_t pa2_value = GPIOA->IDR & (1 << pin_num); /* прочитали состояние ножки PA2 */

Все названия регистров и значения полей в них описаны в справочном руководстве, который
можно считать Библией программиста микроконтроллеров — Reference Manual (он свой для
каждого семейства контроллеров). Более чем 900 страниц, например, это не очень большой объём
информации, легко можно встретить контроллеры с руководствами по 1500-2000 страниц. Вряд ли
есть кто-то, помнящий хотя бы треть такого руководства наизусть, но умение быстро в нём
ориентироваться — обязательное качество для хорошего программиста.

Этот код — лишь условно человекопонятный. Использование буквенных названий вместо адресов
радикально снижает процент ошибок в коде и увеличивает его читаемость, но всё ещё крайне
далеко от того, что большинство людей назовёт «нормальным» кодом. Понимая это,
производители контроллеров начали выпускать вспомогательные библиотеки, собирающие
наборы обращений к регистрам в функции. Например, если при работе с регистрами напрямую
для включения какого-либо такового генератора вам надо сделать два действия (поставить в 1 бит,
включающий генератор, и подождать, пока в 1 встанет флаг, индицирующий, что генератор вышел
на режим), то в функции включения генератора в такой библиотеке они будут объединены.

В случае с STM32 основная библиотека называется Standard Peripherals Library (Библиотека


стандартных периферийных устройств), она же StdPeriphLib, она же SPL. Помимо неё, существует
выпускаемая ST библиотека LL, и ряд сторонних библиотек — например, LibOpenCM3.
Сторонние библиотеки часто поддерживают и контроллеры других производителей, но в силу
распространённости STM32 они обычно оказываются на первом месте.
Библиотека SPL служит для управления всеми основными устройствами, входящими в состав
микроконтроллера: USART, SPI, DMA, ADC, DAC и другие. Основным достоинством библиотеки
является то, что она делает более понятным управление микроконтроллером для разработчика, в
том числе и начинающего, который еще не знает всех тонкостей настроек. Кроме того, вместе с
самой библиотекой распространяются и демонстрационные проекты для работы с основными
устройствами, на которые можно опираться при написании собственных проектов.
Для STMF103C8T6
Онлайн просмотр — http://stm32.kosyak.info/doc
Архив документации — http://stm32.kosyak.info/stm32-doc.tar.gz

При использовании SPL обращения к регистрам, которые мы совершали, чтобы зажечь светодиод,
превратятся в обращения к функциям GPIO_Init и GPIO_Write.

Среди профессиональных разработчиков отношение к SPL — двойственное.


С одной стороны, SPL позволяет значительно быстрее набросать «скелет» проекта, особенно при
использовании графических средств конфигурирования контроллера, таких как STM32 CubeMX.
При этом код будет довольно хорошо переноситься между разными контроллерами семейства
STM32.
С другой стороны, В SPL, как и в любой библиотеке, могут быть ошибки и логика разработчиков
SPL может не совпадать с вашим представлением о том, что должно происходить с контроллером
при тех или иных действиях — в результате при попадании в такую ситуацию вам всё равно
придётся открывать исходники SPL и смотреть, что конкретно там происходит на уровне
регистров. На практике это может иногда занять времени не меньше, чем написание нужной вам
функциональности с нуля.
Не всегда помогает SPL и читаемости кода — в программах, написанных с её использованием,
нередко можно увидеть простыни размером в полстраницы, состоящие из одних только вызовов
SPL.
SPL решает лишь одну проблему — абстрагирования от «железа» и работы с регистрами.

Несмотря на то, что ОС требует для своего существования дефицитных ресурсов контроллера
(обычно 5-20 КБ постоянной памяти и ещё столько же оперативной), преимущества
использования ОС настолько велики, что на данный момент в профессиональной разработке для
встраиваемых систем около 70 % проектов используют ту или иную ОС

ОС помогает решать следующие проблемы:

Виртуализация периферийных устройств. Например, в вашем контроллере есть всего один


таймер часов реального времени (RTC), на который можно установить два независимых события
— и в то же время в серьёзной программе запросто может оказаться пять-шесть функций, который
используют таймер регулярно (для периодического выполнения заданий) или разово (например,
для отсчёта задержки), причём другие таймеры им не подходят. В этой ситуации вам потребуется
функция-менеджер, которая будет организовывать одновременную работу всех этих процедур с
единственным имеющимся таймером.
Многозадачность. Любая достаточно сложная система быстро обрастает большим количеством
всевозможных процедур, которым надо срабатывать с различной периодичностью или по
различным событиям. Знакомый многим по Arduino цикл loop() уже на полудесятке
утрамбованных в него разношёрстных процедур начинает выглядеть уродливым монстром, а
попытка организовать в его рамках ещё и приоритизацию задач вселяет ужас в сердца людей. В
этот момент вы захотите вынести все задачи из loop() в независимые функции, оставив в цикле
только планировщик, который будет к указанным задачам обращаться. Это будет первыми
зачатками многозадачности.
Разделение труда. Как только разработка системы выйдет на уровень, на котором её ведут
несколько человек, перед вами встанет задача разделения обязанностей — помимо оптимизации
разработки, имеющая ещё и чисто практический смысл: в мире довольно мало программистов-
универсалов, которые могут с одинаковой эффективностью отлаживать и работу с процессором, и
сетевой стек, и пользовательский интерфейс. Со значительно большей вероятностью каждый из
членов вашей команды будет лучше других разбираться в какой-то одной области — поэтому вам
быстро захочется разделить эти области на уровне кода, чтобы, например, специалист по
пользовательскому интерфейсу не был вынужден через строчку сталкиваться с обращением к
регистрам контроллера, и наоборот. Это приведёт к разбиению вашего кода на отдельные модули,
общающиеся друг с другом через стандартизированные API.
Компания STMicroelectronics предлагает:
STM32CubeMX – графический редактор для конфигурирования микроконтроллеров STM32,
позволяющий автоматически генерировать конфигурационный С-код и «скелет» прикладной
программы с помощью набора визуальных утилит. Благодаря STM32CubeMX этап создания
функций инициализации происходит очень быстро. При этом от программиста не требуется
написание ни единой строчки кода, хотя, конечно, алгоритмическую и смысловую части
программы по-прежнему нужно создавать вручную.
STM32CubeIDE - это продвинутая платформа разработки C / C ++ с IP-конфигурацией
микроконтроллера STM32, генерацией кода, компиляцией кода и функциями отладки.
STM32 ST-LINK Utility – используется для прошивки МК
SW4STM32 – интегрированная среда разработки встраиваемого ПО компании AC6 для
микроконтроллеров STM32, позволяющая писать программы, загружать и отлаживать их.
STM Studio – фирменная утилита от STMicroelectronics, которая помогает отслеживать значения
пользовательских переменных при выполнении кода в реальном времени.

Контрольные вопросы
1. Типы корпусов МК
2. Применение МК
3. Отличие МК от процессора
4. Назначение программы Proteus.
5. Основные компоненты МК
6. Что такое CMSIS
7. Что такое SPL, назначение. Особенности использования/ Отношение разработчиков к SPL.
8. Описать STM32CubeMX
9. Описать STM32CubeIDE
10. Описать STM32 ST-LINK Utility

Вам также может понравиться