Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Предисловие

Насколько я знаю, эта книга является первой попыткой написать систематический текст о платформе STM32 и ее официальном HAL STM32Cube. Когда я начал работать с данной микроконтроллерной архитектурой, я повсюду искал книгу, способную познакомить меня с этой тематикой, но все было безуспешно.

Данная книга разделена на три части: вводная часть, показывающая, как настроить полноценную среду разработки и как с ней работать; часть, которая знакомит с основами программирования STM32 и основными аспектами официального HAL (Hardware Abstraction Layer – уровня аппаратной абстракции); а также более сложный раздел, охватывающий такие аспекты, как использование операционных систем реального времени, последовательность начальной загрузки и организацию памяти приложения STM32.

Однако данная книга не ставит своей целью заменить официальные технические описания (datasheets) от ST Microelectronics. Техническое описание по-прежнему является основным справочником по электронным устройствам, и невозможно (и не имеет особого смысла) упорядочить содержимое десятков технических описаний в книге. Вы должны учитывать, что официальное техническое описание одного только микроконтроллера STM32F4 составляет почти тысячу страниц, а это больше, чем данная книга! Следовательно, представленный текст будет помощником для начала погружения в официальную документацию ST. Более того, данная книга не будет фокусироваться на низкоуровневых темах и вопросах, связанных с аппаратным обеспечением, оставляя эту тяжелую работу техническим описаниям. Наконец, данная книга не является «сборником рецептов» с нестандартными и забавными проектами: в Интернете вы найдете несколько хороших руководств.

Почему я написал книгу?

Я начал освещать темы о программировании на STM32 в своем личном блоге в 2013 году. Сначала я начал писать посты только на итальянском, а затем переводил их на английский. Я затронул несколько тем, начиная с того, как настроить полноценный бесплатный инструментарий, и заканчивая определенными аспектами, касающимися программирования на STM32. С тех пор я получил много комментариев и запросов на самые разные темы. Благодаря взаимодействию с читателями моего блога, я понял, что не так просто подробно охватить сложные темы на личном веб-сайте. Блог – это отличное место, где можно освещать довольно специфичные и ограниченные по объему темы. Если вам нужно объяснить более широкие темы, касающиеся программных платформ или аппаратного обеспечения, книга по-прежнему является верным ответом. Книга вынуждает вас систематизировать темы и дает вам все необходимое пространство для расширения темы по мере необходимости (я один из тех людей, которые все еще считают, что чтение длинных текстов на мониторе – плохая идея).

Предисловие

ii

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

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

Яполагаю, что еще одной причиной является то, что, если вы хотите написать книгу о микроконтроллере, вы должны иметь возможность блуждать от аспектов электроники до более высокоуровневых тем программирования. Это требует много времени и усилий, что действительно трудно, особенно когда все меняется быстрыми темпами (во время написания первых нескольких глав данной книги ST выпустила более двенадцати версий своего HAL). В электронной промышленности инженеры аппаратного обеспечения и разработчики микропрограмм традиционно являются двумя разными личностями, и иногда они не знают, что делают по другую сторону.

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

По этим и другим незначительным причинам я решил написать данную книгу, используя платформу самоиздания, такую как LeanPub, которая позволяет постепенно создавать книги. Я думаю, что идея, лежащая в основе LeanPub, идеально подходит для книг по нишевым предметам и дает авторам время и инструменты для написания настолько сложных тем, насколько они хотят.

Для кого эта книга?

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

1 Это не совсем верно, поскольку есть хорошая и бесплатная книга от Джеффри Брауна (Geoffrey Brown) из Университета Индианы (https://legacy.cs.indiana.edu/~geobrown/book.pdf). Тем не менее, по моему мнению,

она ведет к сути слишком быстро, оставляя без внимания важные темы, такие как использование полноценного инструментария. Она также не охватывает HAL STM32Cube, который заменил старую библиотеку std peripheral library. Наконец, она не показывает различия между каждым подсемейством STM32 и ориентирована только на семейство STM32F4.

Предисловие

iii

Тем не менее, данная книга не для людей, совершенно не знакомых с языком Си или програм-

мированием встраиваемых систем. Я предполагаю, что вы хорошо знакомы с Си и не новичок в большинстве базовых понятий цифровой электроники и программирования на микроконтроллере. Идеальный читатель этой книги может быть как любителем, так и студентом, который знаком с платформой Arduino и хочет изучить более мощную и всеобъемлющую архитектуру, или профессионалом, отвечающим за работу с микроконтроллером, которого он/она еще не знает.

Что насчет Arduino?

Я получал этот вопрос много раз от нескольких людей, сомневающихся в том, какую платформу микроконтроллеров изучать. Ответ не прост по нескольким причинам.

Во-первых, Arduino не является конкретным семейством микроконтроллеров или производителем интегральных схем. Arduinoa – это и бренд, и экосистема. На рынке доступны десятки отладочных плат (development boards) Arduino, несмотря на то что обычно плату Arduino UNO называют просто «Arduino». Arduino UNO – это отладочная плата, построенная на основе 8-разрядного микроконтроллера ATMega328, разработанного Atmel. Atmel является одной из ведущих компаний вместе с Microchipb, которые управляют сегментом 8-разрядных микроконтроллеров. Тем не менее, Arduino – это не только полностью аппаратное обеспечение, но и сообщество, созданное на основе Arduino IDE (производной версии Processingc) и библиотек Arduino, которые значительно упрощают процесс разработки на микроконтроллерах ATMega. Это достаточно большое и постоянно растущее сообщество разработало сотни библиотек для взаимодействия как с множеством аппаратных устройств, так и с тысячами примеров и приложений.

Итак, вопрос в следующем: «Подходит ли Arduino для профессиональных приложений или для тех, кто хочет разработать последний широко распространенный продукт на Kickstarter?». Ответ: «Определенно ДА». Я сам разработал несколько пользовательских плат для клиента, и, поскольку данные платы основаны на микросхеме ATMega328 (версия SMD), микропрограммное обеспечение было разработано с использованием Arduino IDE. Таким образом, это неправда, что Arduino только для любителей и студентов.

Однако, если вы ищете что-то более мощное, чем 8-разрядный микроконтроллер, или если вы хотите расширить свои знания о программировании микропрограммного обеспечения (среда Arduino скрывает слишком много подробностей о том, что у вас «под капотом»), то STM32, вероятно, является лучшим выбором для вас. Благодаря среде разработки с открытым исходным кодом, основанной на Eclipse и GCC, вам не придется тратить целое состояние для того, чтобы начать разработку приложений STM32. Более того, если вы создаете чувствительное к стоимости устройство, в котором каждый квадратный дюйм печатной платы имеет для вас значение, учтите, что линейка STM32F0 является также известной, как 32-разрядный микроконтроллер за 32 цента. Это означает, что недорогая линейка STM32 обладает ценой, совершенно сопоставимой с 8-разрядными микроконтроллерами, но предлагает гораздо больше вычислительной мощности, аппаратных возможностей и встроенных периферийных устройств.

ahttp://www.arduino.cc/

bMicrochip приобрела Atmel в январе 2016 года

chttps://processing.org/

HAL_NVIC

Предисловие

iv

Как использовать эту книгу?

Данная книга не является полным руководством по микроконтроллерам STM32, но она представляет собой руководство по разработке приложений с использованием официального HAL от ST. Настоятельно рекомендуется использовать ее с книгой об архитектуре ARM Cortex-M, и серия статей Джозефа Ю2 – лучший источник для каждого разработчика Cortex-M.

Как организована книга?

Книга разделена на двадцать семь глав, которые охватывают следующие темы.

Глава 1 дает краткое и предварительное введение в платформу STM32. В ней представлены основные аспекты данных микроконтроллеров, знакомящие читателя с архитектурой ARM Cortex-M. Кроме того, кратко поясняются ключевые особенности каждого подсемейства STM32 (L0, F1 и т. д.). В данной главе также рассказывается об отладочной плате Nucleo, используемой в этой книге в качестве тестовой платы для представленных тем.

Глава 2 показывает, как настроить полноценный и работающий инструментарий, чтобы начать разработку приложений STM32. Глава разделена на три различные ветви, каждая из которых объясняет процесс настройки инструментария для платформ Windows, Linux

и Mac OS X.

Глава 3 посвящена демонстрации того, как создать первое приложение для отладочной платы STM32 Nucleo. Это довольно простое приложение с мигающим светодиодом, которое, без сомнения, является аппаратным приложением Hello World.

Глава 4 посвящена инструменту STM32CubeMX – нашему главному компаньону всякий раз, когда нам нужно запустить новое приложение на основе микроконтроллеров STM32. В данной главе дается практическое представление инструмента, объясняются его возможности и способы конфигурации периферийных устройств микроконтроллера в соответствии с необходимыми нам функциями. Кроме того, в ней объясняется, как погрузиться в сгенерированный код и настроить его, а также как импортировать проект, сгенерированный с помощью STM32CubeMX, в IDE Eclipse.

Глава 5 знакомит читателя с отладкой. Дается практическая демонстрация OpenOCD, показывающая, как интегрировать его в Eclipse. Кроме того, представлен краткий обзор возможностей отладки Eclipse. Напоследок, читатель знакомится с достаточно важной темой: полухостинг ARM (ARM semihosting).

Глава 6 делает краткий обзор ST CubeHAL, объясняя, как периферийные устройства отображаются в HAL с использованием дескрипторов (handlers) в области отображения периферийной памяти. Далее представлены библиотеки HAL_GPIO и все параметры конфигурации, предлагаемые портами GPIO STM32.

Глава 7 объясняет механизмы, лежащие в основе контроллера NVIC – аппаратного блока, встроенного в каждый микроконтроллер STM32, который отвечает за управление исключениями и прерываниями. Широко представлен модуль и выделены раз-

личия между Cortex-M0/0+ и Cortex-M3/4/7.

2 http://amzn.to/1P5sZwq

Предисловие

v

Глава 8 дает практическое введение в модуль HAL_UART, используемый для программирования интерфейсов UART, предоставляемых всеми микроконтроллерами STM32. Кроме того, дается краткое введение в различие между интерфейсами UART и USART. Представлены два способа обмена данными между устройствами с использованием UART: режимы, ориентированные на опросы и на прерывания. Наконец, мы рассмотрим на практике, как использовать встроенный в каждую плату Nucleo модуль VCP, и как перенаправить функции printf()/scanf() с помощью UART Nucleo.

Глава 9 рассказывает о контроллере DMA, показывая различия между несколькими семействами STM32. Представлен более подробный обзор внутренних компонентов микроконтроллера STM32, описывающий взаимосвязи между ядром Cortex-M, контроллерами DMA и ведомыми (slave) периферийными устройствами. Кроме того, в главе показано, как использовать модуль HAL_DMA в режимах опроса и прерываний. Напоследок, представлен анализ производительности передач память-в-память (memory-to-memory).

Глава 10 знакомит со схемой тактирования микроконтроллера STM32, показывая основные функциональные блоки и способы их конфигурации с использованием модуля HAL_RCC. Кроме того, продемонстрировано представление CubeMX Clock Configuration, объясняющее, как изменить его настройки для генерации правильной конфигурации тактирования.

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

общего назначения и расширенного управления. Более того, проиллюстрированы не-

сколько продвинутых режимов использования (ведущий/ведомый (master/slave), внешний запуск (external trigger), захват входного сигнала (input capture), сравнение выходного сигнала (output compare), ШИМ (PWM) и т. д.) практическими примерами.

Глава 12 содержит обзор аналого-цифрового преобразователя (АЦП). Она знакомит читателя с понятиями, лежащими в основе АЦП последовательного приближения (SAR ADC), а затем объясняет, как программировать это полезное периферийное устройство с помощью упомянутого модуля CubeHAL. Кроме того, в данной главе представлен практический пример, который показывает, как использовать аппаратный таймер для управления преобразованиями АЦП в режиме DMA.

Глава 13 кратко описывает цифро-аналоговый преобразователь (ЦАП). В ней представлены наиболее фундаментальные понятия, лежащие в основе ЦАП R-2R (R-2R DAC), и способы программирования этого полезного периферийного устройства с использованием упомянутого модуля CubeHAL. В данной главе также показан пример, подробно описывающий, как использовать аппаратный таймер для управления преобразованиями ЦАП в режиме DMA.

Глава 14 посвящена шине I²C. В данной главе начинается знакомство с основами протокола I²C, а затем показываются наиболее важные процедуры из CubeHAL для использования данного периферийного устройства. Кроме того, приведен готовый пример, объясняющий, как разрабатывать приложения с ведомыми I²C-устройствами.

Глава 15 посвящена шине SPI. Глава начинает знакомство с основами спецификации SPI, а затем показывает наиболее подходящие процедуры из CubeHAL для использования этого фундаментального периферийного устройства.

Предисловие

vi

Глава 16 рассказывает о периферийном устройстве CRC, кратко описывается математический аппарат, лежащий в основе его вычислений, и демонстрируется соответствующий модуль CubeHAL, используемый для его программирования.

Глава 17 посвящена таймерам IWDG и WWDG и кратко знакомит с их ролью и способами использования соответствующих модулей CubeHAL для их программирования.

Глава 18 рассказывает о периферийном устройстве RTC и его основных функциях. Также показаны наиболее важные процедуры CubeHAL для программирования RTC.

Глава 19 знакомит читателя с возможностями управления питанием, предлагаемыми микроконтроллерами STM32F и STM32L. Она начинается с рассмотрения того, как ядра Cortex-M обрабатывают режимы пониженного энергопотребления, вводя в инструкции WFI и WFE. Затем объясняется, как эти режимы реализованы в микроконтроллерах STM32. Также описан соответствующий модуль HAL_PWR.

Глава 20 анализирует действия, связанные с процессами компиляции и компоновки, которые определяют организацию памяти приложения STM32. Показан «скелет» приложения и разработан с нуля готовый и работающий скрипт компоновщика, показывающий, как организовать пространство памяти STM32. Кроме того, показано использование CCMRAM, а также другие важные функции Cortex-M, такие как смещение таблицы векторов.

Глава 21 содержит введение во внутреннюю Flash-память и связанный с ней контроллер, доступный во всех микроконтроллерах STM32. Она иллюстрирует, как сконфигурировать и запрограммировать данное периферийное устройство, показывая связанные с ним процедуры CubeHAL. Более того, обзор структуры шины и памяти STM32F7 знакомит читателя с архитектурой этих высокопроизводительных микроконтроллеров.

Глава 22 описывает операции, выполняемые микроконтроллерами STM32 при запуске. Описан весь процесс начальной загрузки и объяснены некоторые продвинутые методы (например, перемещение таблицы векторов в микроконтроллерах Cortex-M0). Кроме того, показан пользовательский и безопасный загрузчик, который может обновлять встроенное микропрограммное обеспечение через периферийное устройство USART. Загрузчик использует алгоритм AES для шифрования микропрограммного обеспечения.

Глава 23 посвящена операционной системе реального времени FreeRTOS. Она знакомит читателя с наиболее важными понятиями, лежащими в основе ОСРВ (RTOS), и показывает, как использовать основные функциональные возможности FreeRTOS (такие как потоки, семафоры, мьютексы и т. д.) с использованием уровня CMSIS-RTOS, разработанного ST поверх API-интерфейса FreeRTOS. Кроме того, показаны некоторые продвинутые технологии, такие как бестиковый режим (tickles mode) в проекте с пониженным энергопотреблением.

Глава 24 знакомит читателя с некоторыми продвинутыми методами отладки. Глава начинается с объяснения роли исключений отказов в ядрах на базе Cortex-M, и того, как интерпретировать соответствующие аппаратные регистры, чтобы вернуться к источнику отказа. Кроме того, представлены некоторые продвинутые средства отладки Eclipse, такие как точки наблюдения и отладочные выражения, а также способы использования пакетов Keil Packs, интегрированных в инструментарий Eclipse с GNU MCU. Напоследок, дается краткое введение в профессиональные отладчики SEGGER J-LINK и способы их использования в инструментарии Eclipse.

Предисловие

vii

Глава 25 кратко знакомит читателя с промежуточным программным обеспечением FatFS (FatFS middleware). Эта библиотека позволяет манипулировать структурированными файловыми системами, созданными с помощью широко распространенной файловой системы FAT12/16/32. В данной главе также показано, как инженеры ST интегрировали эту библиотеку в CubeHAL. Наконец, в ней представлен обзор наиболее важных процедур и параметров конфигурации FatFS.

Глава 26 описывает решение для подключения плат Nucleo к Интернету с помощью сетевого процессора W5500. В данной главе показано, как разрабатывать Интернет- и вебприложения с использованием микроконтроллеров STM32, даже если они не предоставляют встроенное периферийное устройство Ethernet. Кроме того, глава знакомит читателя с возможными стратегиями обработки динамического контента на статических веб-страницах. Наконец, показано применение промежуточного программного обеспечения FatFS для хранения веб-страниц и т. п. на внешней SD-карте.

Глава 27 показывает, как начать проектирование новой пользовательской печатной платы (PCB), использующей микроконтроллер STM32. Данная глава в основном посвящена аппаратным аспектам, таким как развязка, методы трассировки сигналов и так далее. Кроме того, в ней показано, как использовать CubeMX в процессе проектирования печатной платы и как создать каркас приложения после завершения проектирования платы.

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

STM32.

Вы также найдете несколько замечаний, каждое из которых начинается с иконки слева. Позвольте объяснить их.

Это область с предупреждением. Содержащийся текст объясняет важные аспекты или дает важные указания. Настоятельно рекомендуется внимательно прочитать текст и следовать инструкциям.

Это информационная область. Содержащийся текст разъясняет некоторые концепции, представленные ранее.

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

упростить процесс обучения.