Быстрый старт c микроконтроллерами STM32F10x. Использование библиотеки STM32 Standard Peripheral Library

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

Что такое STM32

STM32 – это платформа, в основе которой лежат микроконтроллеры STMicroelectronics на базе ARM процессора, различные модули и периферия, а также программные решения (IDE) для работы с железом. Решения на базе stm активно используются благодаря производительности микроконтроллера, его удачной архитектуре, малом энергопотреблении, небольшой цене. В настоящее время STM32 состоит уже из нескольких линеек для самых разных предназначений.

История появления

Серия STM32 была выпущена в 2010 году. До этого компанией STMicroelectronics уже выпускались 4 семейства микроконтроллеров на базе ARM, но они были хуже по своим характеристикам. Контроллеры STM32 получились оптимальными по свойствам и цене. Изначально они выпускались в 14 вариантах, которые были разделены на 2 группы – с тактовой частотой до 2 МГц и с частотой до 36 МГц. Программное обеспечение у обеих групп одинаковое, как и расположение контактов. Первые изделия выпускались со встроенной флеш-памятью 128 кбайт и ОЗУ 20 кбайт. Сейчас линейка существенно расширилась, появились новые представители с повышенными значениями ОЗУ и Flash памяти.

Достоинства и недостатки STM32

Основные преимущества:

  • Низкая стоимость;
  • Удобство использования;
  • Большой выбор сред разработки;
  • Чипы взаимозаменяемы – если не хватает ресурсов одного микроконтроллера, его можно заменить на более мощной, не меняя самой схемы и платы;
  • Высокая производительность;
  • Удобная отладка микроконтроллера.

Недостатки:

  • Высокий порог вхождения;
  • На данный момент не так много литературы по STM32;
  • Большинство созданных библиотек уже устарели, проще создавать свои собственные.

Минусы STM32 не дают пока микроконтроллеру стать заменой Ардуино.

Сравнение STM32 с Arduino

Сравнение STM32 с Arduino

По техническим характеристикам Ардуино проигрывает STM32. Тактовая частота микроконтроллеров Ардуино ниже – 16 МГц против 72 МГц STM32. Количество выводов GRIO у STM32 больше. Объем памяти у STM32 также выше. Нельзя не отметить pin-to-pin совместимость STM32 – для замены одного изделия на другое не нужно менять плату. Но полностью заменить ардуино конкуренты не могут. В первую очередь это связано с высоким порогом вхождения – для работы с STM32 нужно иметь базис. Платы Ардуино более распространены, и, если у пользователя возникает проблема, найти решение можно на форумах. Также для Ардуино созданы различные шилды и модули, расширяющие функционал. Несмотря на преимущества, по соотношению цена/качество выигрывает STM32.

Семейство микроконтроллеров STM32 отличается от своих конкурентов отличным поведением при температурах от -40С до +80 С. Высокая производительность не уменьшается, в отличие от Ардуино. Также можно найти изделия, работающие при температурах до 105С.

Обзор продуктовых линеек

STM32L

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

Серии STM32F-1, STM32F-2 и STM32L полностью совместимы. Каждая из серий имеет десятки микросхем, которые можно без труда поменять на другие изделия. STM32F-1 была первой линейкой, ее производительность была ограничена. Из-за этого по характеристикам контроллеры быстро догнали изделия семейства Stellaris и LPC17. Позднее была выпущена STM32F-2 с улучшенными характеристиками – тактовая частота достигала 120 МГц. Отличается высокой процессорной мощностью, которая достигнута благодаря новой технологии производства 90 нм. Линейка STM32L представлена моделями, которые изготовлены по специальному технологическому процессу. Утечки транзисторов минимальны, благодаря чему приборы показывают лучшие значения.

Важно отметить, что контроллеры линейки STM32W не имеют pin-to-pin совместимости с STM32F-1, STM32F-2 и STM32L. Причина заключается в том, что линейку разрабатывала компания, которая предоставила радиочастотную часть. Это наложило ограничения на разработку для компании ST.

STM32F100R4

Микросхема STM32F100R4 имеет минимальный набор функций. Объем флэш памяти составляет 16 Кбайт, ОЗУ – 4 Кбайт, тактовая частота составляет 12 МГц. Если требуется более быстрое устройство с увеличенным объемом флэш-памяти до 128 Кбайт, подойдет STM32F101RB. USB интерфейс имеется у изделия STM32F103RE. Существует аналогичное устройство, но с более низким потреблением – это STM32L151RB.

Программное обеспечение для работы с контроллером

Keil Uvision 4

Для ARM архитектуры разработано множество сред разработки. К самым известным и дорогостоящим относятся инструменты фирм Keil и IAR System. Программы этих компаний предлагают самые продвинутые инструментарии для оптимизации кода. Также дополнительно существуют различные системы – USB стеки, TCP/IP-стеки и прочие. Применяя системы Keil, пользователь получает хороший уровень технической поддержки.

Также для STM32 используется среда разработки Eclipse и построенные на ней системы Atollic TrueStudio (платная) и CooCox IDE (CoIDE) (бесплатная). Обычно используется последняя. Ее преимущества перед другими средами разработки:

  • Свободно распространяемое программное обеспечение;
  • Удобство использования;
  • Имеется много примеров, которые можно загрузить.

Единственный недостаток среды разработки CooCox IDE – сборка есть только под Windows.

STM32 Discovery

STM32 Discovery

Начать изучение микроконтроллера STM32 лучше с платы Discovery. Это связано с тем, что на этой плате есть встроенный программатор. Его можно подключить к компьютеру через USB кабель и использовать как в качестве программируемого микроконтроллера, так и для внешних устройств. Плата Discovery имеет полную разводку пинов с контроллера на пины платы. На плату можно подключать различные сенсоры, микрофоны и другие периферийные устройства.

Что потребуется для подключения STM32 к компьютеру

Чтобы начать работу, потребуются следующие компоненты:

  • Сама плата STM32 Discovery;
  • Datasheet на выбранную модель;
  • Reference manual на микроконтроллер;
  • Установленная на компьютер среда разработки.

В качестве примера первая программа будет рассмотрена в среде  CooCox IDE.

Первая программа

CooCox CoIDE

Обучение следует начинать с простейшего – с Hello World. Для начала нужно установить CooCox IDE на компьютер. Установка стандартная:

  • Скачивается программа с официального сайта;
  • Там нужно ввести адрес своей электронной почты и начать загрузку файла с расширением .exe;
  • Нужно открыть CooCox IDE вкладку Project, Select Toolchain Path;
  • Указать путь к файлу;
  • Снова открыть среду разработки и нажать View -> Configuration на вкладку Debugger;
  • Теперь можно записывать программу.

Когда программа установлена, ее нужно открыть. Следует перейти во вкладку Browse in Repository и выбрать ST – свой микроконтроллер.

Далее на экране появится список библиотек, которые можно подключить. Для первой программы потребуются системные 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--);    }  

Затем добавляется тактирование порта в главной функции main. Какой контакт за что ответственен, можно просмотреть в даташите к микроконтроллеру.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  

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

После этого нужно сделать зацикливание в while, чтобы светодиод мигал, пока не отключится питание.

Когда программа написана, ее можно загружать в контроллер. Если есть отладочная плата, ее нужно подключить через USB кабель и нажать Download Code To Flash. Если плата отсутствует, потребуется переходник, который нужно подключить к порту компьютера. Контакт BOOT 0 подключается к плюсу питания контроллера, а затем включается само питание МК. После этого начнется прошивка.

Чтобы загрузить программу в микроконтроллер, нужно следовать указаниям от приложения. Сначала прописывается код порта, к которому подключен микроконтроллер. Также указывается скорость. Советуется брать небольшое значение, чтобы не было сбоев. Программа найдет микроконтроллер, и нужно будет нажать кнопку «далее». Во вкладке Download to device нужно в поле Download from file выбрать написанную программу и нажать «далее».

После этого нужно отключить питание контроллера STM32, закрыть Flash Loader Demonstrator, выключить переходник. Теперь можно снова включить микроконтроллер в обычном режиме. Когда программа будет загружена, светодиод начнет мигать.

Работа в других программах проходит подобным образом. Также выбираются нужные библиотеки, и прописывается код. У платных утилит функционал больше, и можно создавать более сложные проекты.

Добрый… день? Сегодня я хотел бы поделиться моим опытом начинающего экспериментатора с stm32. В данном посте мне хотелось бы помочь тем, кто хочет перейти с ардуино или просто начать использовать stm32 для своих поделок. Я и сам не имею богатого опыта работы с данными контроллерами, но буду рад поделиться своим первым опытом, и сделанными на этом пути ошибками. Надеюсь, кому-то это будет интересно.

Для начала, нам понадобится stm32f103C8T6, и дебаггер ST-Link V2. И то и другое можно купить в китае или в местных магазинах электроники, цена обоих, примерно по 2$. А так же нам потребуется 4 джампера, для соединения этих устройств. Этого будет достаточно, что-бы помигать светодиодом или управлять какими-либо внешними устройствами, но начнем с малого.

Первое, что нам понадобится – установить драйвер для программатора. Его можно найти здесь (внизу): http://www.st.com/en/development-tools/stsw-link009.html

Кроме того нам понадобятся STM32CubeMX его качаем тут: http://www.st.com/en/development-tools/stm32cubemx.html

А так же среда разработки, я предпочитаю официальный софт с поддержкой, потому берем ставую не так давно бесплатной Atollic TrueSTUDIO вот тут: http://www.st.com/en/development-tools/truestudio.html

Затем, нам нужно подключить, используя 4 джампера, наш программатор к плате контроллера следующим образом:

image

После этого, если возможность записи прошивки в память на вашей плате не заблокирована – все готово к созданию нового проекта. Если же запись в память вашей платы заблокирована, вы можете решить это, подключив плату аналогичным образом, но используя улилиту STM32 ST-Link Utility и переключив джампер Boot0 в положение 3.3v. Что такое Boot0 можно глянуть тут: http://wiki.stm32duino.com/images/a/ae/Bluepillpinout.gif но вообще эта статья не об этом.

Итак, для начала создадим проект, используя STM32CubeMX, эта программа предназначена для удобной инициализации периферии и создания проекта, для IDE в которой мы будем далее работать, поверьте, куб действительно прекрасен. После нажатия на кнопку “New Project”, попадаем на окно выбора чипа. В нашем случае это stm32f103c8tx. Выбираем его и нажимаем “Start Project”.

image

Следующее за этим окно выгляит довольно пугающе для начинающих, но в действительности, не представляет особых сложностей. Перед нами изображение установленного на плату чипа микроконтроллера. И все что нам нужно для начала это помигать светодиодом, потому, по аналогии с ардуино, если вы с ним работали, выбираем ножку, к которой присоединен светодиод, которым мы будем мигать. В нашем случае – это ножка PC13. Кликаем на ножку и выбираем GPIO_Output.

Вообще в stm32, в отличие от ардуино, где визуально пины делятся только на аналоговые и цифровые, пины разделены на группы, PA, PB, PC, PD. Это обусловлено тем, что stm имеет 32 разрядные регистры (GPIOA, GPIOB, GPIOC, GPIOD) для управления выходами, потому каждый регистр может управлять 16 выходами микроконтроллера, у микросхем старших поколений stm этих выходов очень много, потому было принято решение сгруппировать выходы, в соответствии с именами регистров.

Так же !ВНИМАНИЕ нужно включить возможность дебага ВНИМАНИЕ! микроконтроллера иначе, прошивка у вас зальется только 1 раз а затем вам потребуется выводить ваш контроллер из состояния легкого ступора, потому как ST-Link не будет его видеть. Если это произошло, вам прийдется потанцевать с бубном используя STM32 ST-Link Utility и так же переключив джампер Boot0 в положение 3.3v.

Так же по желанию можно подключить внешний кварц, который припаян на плате, что позволит нашему камню работать быстрее. Но это не обязательно, хотя желаемо:

Stm32 может тактироваться от любого из 2х встроенных резонаторов, медленного и быстрого LSI 40KHz(по умолчанию) и HSI 8MHz, встроенных в сам чип и таким образом, обходиться без внешнего резонатора. Либо же использовать внешние резонаторы с частотой 4-16MHz (HSE), если вам нужно ускорить ваш камень или LSE c частотами 0-1000 KHz если вам нужно жертвовать скоростью ради энергопотребления.

Настройку частоты камня и переферии делаем во вкладке ClockConfiguration следующим образом, для этого просто задаем значение 72 в поле HCLK(MHz) и нажимаем enter. Затем соглашаемся с тем, что б STM32CubeMX настроил все за нас и нажимаем снова ок, готово. Внимание! Если на предыдушем шаге вы не вклчили RCC -> HSE -> Crystal/Ceramic Resonator, то вы не сможете установить значение 72 MHz и ваш камень может работать на частоте максимум 36MHz используя внутренний кварц.

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

В открывшемся окне заполняем поля:

Project Name, Project Location и ВНИМАНИЕ! выбираем IDE для которой будет создан наш проект, в нашем случае это TrueSTUDIO, если этого не сделать, то будет создан проект для IAR (EWARM).

Так же, я рекомендю переключиться на следующую вкладку (Code Generation) и выбрать в разделе Generated files пункт Generate peripheral initialization as a pair of .c/.h files per peripheral. Это позволит очистить ваш main файл проекта от инициализации перефирии, путем выноса ее в отдельные файлы. Я рекомендую делать так всегда.

Затем нажимаем ок и создаем проект. Если вы все сделали верно, то куб сразу же предложит вам скачать необходимые для вашего контроллера библиотеки и затем отрыть проект в Atollic TrueSTUDIO:

Все что нам необходимо, это добавить следующий код внутрь цикла while в нашем main и нажать debug, перед этим убедитесь, что оба режима бут отключены (желтые переключатели установлены, как на первом фото):

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

HAL_Delay(100);

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

HAL_Delay(100);

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

Это моя первая статья про микроконтроллеры и первая статья по электронике в целом, не судите строго, надеюсь она будет интересна хотя бы кому-то. Если будет интерес с вашей стороны – дайте знать, буду писать про stm32 дальше.

В этой публикации я попытаюсь акцентировать внимание на основных моментах для быстрого начала работы с микроконтроллерами STM32F10x на основе библиотеки стандартной периферии от компании-производителя STMicroelectronics.

В качестве среды разработки в статье будет использоваться Eclipse CDT. Поскольку основное внимание будет сосредоточено вокруг программного кода, то вы можете спокойно проделать все манипуляции в Code::Blocks.

Общая структура проекта для ARM микроконтроллеров описана в моей статье «Программирование AVR и ARM микроконтроллеров в Eclipse. Часть 2».

Здесь я коротко напомню, что для сборки проекта для ARM — микроконтроллеров (STM32F10x в частности) понадобится скрипт компоновщика и C-Startup файл.

Скрипт компоновщика представляет собой файл с инструкциями по размещению кода программы и данных в памяти микроконтроллера. Он может скомандовать загрузить код вашей программы в Flash -память программ или SRAM -память данных.

Узнайте, в какой из этих плат используется микроконтроллер той же линейки, что и ваш. Скопируйте файл stm32_flash.ld из соответствующего каталога в свой проект.

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

Это самый тяжелый и бессмысленный путь. Второй способ — использовать библиотеку CMSIS, которая предоставляет синтаксис обращения к структурам языка С для доступа к различной периферии микроконтроллера. Самым простым и логичным способом (на мой взгляд) является использование библиотек.

Если вы категорически настроены против STM32F10x SPL, то специально для вас имеется еще одна альтернатива — библиотека libopencm3. В ней основное количество примеров сосредоточено вокруг основной серии микроконтроллеров STM32F10x , но появление примеров для других серий ( STM32F2xx/4xx) является только вопросом времени. Вы всегда можете присоединиться к проекту libopencm3 и ускорить этот процесс.

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

Или вам необходимо реализовать программное обеспечение на языке С для микроконтроллеров с ядром ARM9, для которого производители ориентируются на использование готовых операционных систем (Linux, QNX, Windows CE), поэтому библиотек для программирования на языке С в чистом виде или в сочетании с более легковесной RTOS производители могут не предоставлять.

К счастью производители микроконтроллеров на основе ядра Cortex-M3 предоставляют в распоряжение разработчиков большое количество библиотек кода. Это касается и микроконтроллеров STM32. Продолжим рассмотрение библиотеки STM32F10x SPL. Рассматривать ее будем на примере stm32f10xQuickstart. Вы можете открыть этот пример или же создать свой проект «с нуля», чтобы лучше осознать весь процесс происходящего.

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

  • Создать в Eclipse новый пустой проект
  • Скопировать в проект скрипт компоновки и стартовый файл
  • Создать новый или скопировать шаблонный Makefile
  • При использовании в качестве шаблона Makefile из моего примера необходимо создать внутри проекта каталоги src, inc, bin, obj , внутри каталогов bin и obj создать подкаталоги Debug и Release.
  • Скопировать необходимые исходные и заголовочные файлы из библиотек CMSIS и STM32F10x SPL.
  • Внести необходимые изменения в секции настроек пользователя шаблонного Makefile, если он используется.
  • Создать в окне Eclipse “make target ” новые цели “Debug”, “cleanDebug”, “Release”, “cleanRelease”, “Program”.
  • Запустить на выполнение цель «Debug» и проследить за ее выполнением в окне «Console».

Конфигурирование STM32F10x SPL с помощью макроопределений

Для конфигурирования библиотеки используются предопределенные значения макросов, которые мы сейчас и рассмотрим. Их можно задать внутри заголовочных файлов с помощью директивы препроцессора #define или же передать значения макроопределений через ключ -D компилятора GCC. В своем примере я использую второй способ. В Makefile переменная DEFINE содержит макросы, необходимые для компиляции библиотеки STM32F10x SPL. Макроопределение STM32F10X_MD задает принадлежность используемого микроконтроллера к линейке Medium-density. Сюда входят микроконтроллеры с объемом Flash-памяти от 64 до 128кБ . В следующей таблице перечислены названия макросов для разных серий микроконтроллеров :

Наименование серии

Макрос

Описание

Low density Value line STM32F10X_LD_VL микроконтроллеры серии STM32F100xx с объемом Flash-памяти 16 — 32кБ
Low density STM32F10X_LD
Medium density Value line STM32F10X_MD_VL
Medium-density STM32F10X_MD микроконтроллеры серии STM32F101xx, STM32F102xx, STM32F103xx с объемом Flash- памяти 64 — 128кБ
High density Value line STM32F10X_HD_VL
High density STM32F10X_HD
XL-density STM32F10X_XL
Connectivity line STM32F10X_CL микроконтроллеры серии STM32F105xx и STM32F107xx

Для задания тактовой частоты микроконтроллера необходимо раскомментировать в файле system_stm32f10x.c макрос с необходимым значение тактовой частоты.

Использование макроса assert_param в библиотеке

Все функции библиотеки STM32F10x SPL используют для проверки своих аргументов макрос assert_param. Этот макрос выполняет проверку выражения с участием проверяемого аргумента функции на равенство нулю. Если значение выражения равно нулю, то вызывается функция-обработчик ошибки аргумента assert_failed, в противном случае (выражение не равно нулю) проверка аргумента проходит успешно. В своей программе вам необходимо реализовать функцию assert_failed. В ней выводится сообщение об ошибке , название файла и номер строки кода, вызвавшей ошибку. Макрос debug_printf может осуществлять вывод через USART c помощью стандартной библиотеки new_lib или, например, библиотеки от мистера Чена.

Реализованная в вашем коде функция assert_failed используется только когда объявлен макрос USE_FULL_ASSERT. В противном случае весь отладочный код исключается из исходника. Этот функционал реализован в заголовочном файле настроек библиотеки драйверов stm32f10x_conf.h.

Тут объяснять особо нечего. Лучше рассмотрим пример использования assert_param.

C-Startup файл в библиотеке STM32F10x SPL

Наименование серии

Название файла

Описание

Low density Value line startup_stm32f10x_ld_vl.s
Low density startup_stm32f10x_ld.s
Medium density Value line startup_stm32f10x_md_vl.s
Medium-density startup_stm32f10x_md.s
High density Value line startup_stm32f10x_hd_vl.s
High density startup_stm32f10x_hd.s
XL-density startup_stm32f10x_xl.s
Connectivity line startup_stm32f10x_cl.s микроконтроллеры серии STM32F105xx и STM32F107xx

Состав библиотеки CMSIS

  • core_cm3.h
  • core_cm3.c

Вторая часть CMSIS включает в себя С-Startup файл, а также файлы :

  • stm32f10x.h
  • system_stm32f10x.h
  • system_stm32f10x.c

Состав и конфигурация библиотеки STM32F10x SPL

Акроним

Периферийный модуль

ADC аналогово-цифровой преобразователь
BKP регистры резервного копирования
CAN интерфейс CAN
CEC контроллер потребления
CRC модуль расчета контрольной суммы
DAC цифро-аналоговый преобразователь
DBGMCU отладка микроконтроллера
DMA контроллер прямого доступа к памяти
EXTI контроллер внешних прерываний
FSMC контроллер внешней памяти
FLASH Flash-память программ
GPIO порты ввода/вывода общего назначения
I2C интерфейс I2C
I2S интерфейс I2S (Sound)
IWDG независимый сторожевой таймер
NVIC контроллер вложенных прерываний
PWR контроллер питания
RCC контроллер сброса и тактирования
RTC контроллер реального времени (часы)
SDIO интерфейс SDIO
SPI интерфейс SPI
SysTick системный таймер
TIM базовый таймер или таймер с расширенными возможностями
USART
WWDG оконный сторожевой таймер

Для включения нужного модуля необходимо раскомментировать директиву #include с соответствующим заголовочным файлам. Заголовочный файл stm32f10x_conf.h включен в stm32f10x.h, поэтому для использования функций библиотеки STM32F10x SPL достаточно подключить в своем исходнике только один заголовочный файл stm32f10x.h

Использование библиотеки STM32F10x SPL. Механизмы работы

По названиям макросов определяем какие модули к каким шинам подключены. Также для определения принадлежности к одной из трех шин можно воспользоваться здравым смыслом. Например, модуль USART является устройством ввода/вывода, значит подключен к одной из шин APB. USART является достаточно низко-скоростным интерфейсом, поэтому наверняка он подключен к шине APB1.

Однако USART1 подключен к более высокоскоростной шине APB2 :

После подачи тактового сигнала на периферийный модуль можно настроить его параметры путем вызова функции инициализации :

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

Можно сначала создать структуру, а потом присвоить ее элементам необходимые значения:

Рассмотрим пример из проекта stm32f10xQuickstart :

Mode – режим работы вывода (вход/выход). Точнее этих значений несколько больше, настроенные как выходные, порты имеют ограничение максимальной частоты выводимого сигнала.

Режим Mode

Описание

00 вход
01 выход с частотой до 10МГц
10 выход с частотой до 2МГц
11 выход с частотой до 50МГц

CNF – биты конфигурации вывода. Зависят от режима работы :

CNF

Mode

Описание конфигурации вывода

00 вход (00) Вход с подтяжкой к питанию
00 выход(01 — 11) Аналоговый режим
01 вход(00) Плавающий вход
01 выход(01 -11) Выход с открытым стоком
10 вход(00) Вход с подтяжкой к питанию/земле
10 выход(01 — 11) Альтернативная функция вывода с подтяжкой к питанию
11 вход(00) Зарезервировано
11 выход(01 — 11) Альтернативная функция вывода с открытым стоком

Для модулей GPIO этой функции не существует, после инициализации вы можете сразу пользоваться выводами GPIO. Необходимо помнить, что библиотека предоставляет только интерфейс к аппаратуре микроконтроллера. Если у аппаратного модуля нет флага активации/деактивации, то и вызов функции PPP_Cmd(PPP, ENABLE) невозможен. Для управления состоянием вывода GPIOx в режиме выхода и считывания значения в режиме входа или выхода в библиотеке предусмотрены следующие функции :

Обработка прерываний и исключений

Номер

Обработчик

Приоритет

Описание

1 Reset_Handler -3(наивысший) Вектор сброса
2 NMI_Handler -2 Немаскируемое прерывание
3 HardFault_Handler -1 Аварийные состояния

Название группы приоритетов

NVIC_PriorityGroup_0 16
NVIC_PriorityGroup_1 2 8
NVIC_PriorityGroup_2 4 4
NVIC_PriorityGroup_3 8 2
NVIC_PriorityGroup_4 16

Рассмотрим использование контроллера прерываний в примере stm32f10xQuickstart :

Для разрешения/запрещения прерываний и исключений используются другие функции:

К примеру, если в stm32f10x_it.с определить обработчик HardFault_Handler, то будет использоваться именно этот обработчик при возникновении исключения HardFault, а не объявленный в стартовом файле.

Анализ содержимого Makefile.

Viewed 39980 times by 10343 viewers

Микроконтроллеры STM32 на ядре Cortex-M0+ упрощают проектирование печатных плат

Микроконтроллеры STM32 и в частности STM32G0 является по существу первым микроконтроллером общего назначения в новом семействе основной линейки микроконтроллеров, реализованный на базе на 90-нм технологии.

STM32G0 — новое семейство основной линейки микроконтроллеров компании STMicroelectronics (Швейцария, Женева), предназначенных для экономически ориентированных и промышленных приложений.

STM32G0 основан на популярной платформе STM32F0, тем не менее, вместо 180-нм технологии, он реализован на базе 90-нм решений, характерных для STM32L4. Такой подход позволил получить выигрыш в виде расширения возможностей реализации в разрабатываемых устройствах сверхнизкого энергопотребления L4, а также позволил интегрировать в используемом форм-факторе большее число компонентов и оптимизировать их архитектуру, выводя производительность и характеристики F0 на совершенно новый уровень.

Для получения этого результата была разработана и запатентована система связей по внутренней питающей шине, способная корректно распределять ток на все элементы архитектуры для питания как аналоговых, так и цифровых цепей. Ещё одним достижением новой архитектуры стали режимы с низким энергопотреблением. Благодаря узлу обработки, имеющим схожее с STM32L4 решение, микроконтроллер STM32G0 потребляет меньше 100 мкА/МГц на частоте 64 МГц.

Читайте также:  Компоненты Mornsun для AC/DC и DC/DC: как снизить стоимость тракта электропитания устройства

Структура одного из микроконтроллеров STM32

STM32G0 и защита данных

Специально для использования в следующих поколениях продуктов IoT применено уникальное крипто-ядро, способное производить 256-битные вычисления AES, а также генератор случайных чисел для оптимизации процедуры получения криптографических ключей. Но наиболее впечатляющим средством обеспечения безопасности стало реализация программируемой защищенной области памяти. Теперь разработчики могут определить часть Flash, которая будет недоступна для остальной системы после выхода из неё, что позволяет сохранять в ней корневые ключи и критичные подпрограммы реализующие таких функцоналы, как Secure Boot и Secure Firmware Upgrade.

STM32G0 и инновации

Дополнительно интегрирована быстрая и точная внутренняя схема тактирования (схожая с аналогичной схемой в STM32L4). Также реализованы таймеры, которые могут работать вдвое быстрее, чем MCU (до 128 МГц), обеспечивая существенно более высокий контроль над управлением цифровыми системами.

Для разработчиков доступна отладочная плата STM32G081B-EVAL на популярной платформе NUCLEO-G071RB, включающая поддержку STM32CubeMX.

Источник: gamma.spb.ru

В этой статье мы решим самую первую классическую задачу — мигание светодиодом. Это позволит нам пройти все процедуру от задумки до конечного результата . Напомним, что для программирования мы будем использовать CubeMX и Keil uVision, а также плату Nucleo-64 STM32F030. ПО должно быть установлено, как описано в предыдущей статье, а плата подключена к компьютеру.

image

Nucleo-64 STM32F030

Подготовка проекта в CubeMX

Начнем с запуска генератора инициализационного кода CubeMX. При ее запуске выбор небольшой. Нам нужен пункт меню New Project. image Обычно разработка электронных устройств предполагает то, что вы сами подбираете контроллер, готовите плату для устройства и т.д. На вкладке MCU Selector есть возможность найти выбранный ранее контроллер, либо при помощи параметрического поиска подобрать именно тот, который оптимально подойдет под ваши задачи, но у нас готовая отладочная плата от производителя, поэтому надо перейти на вкладку Board Selector. Если вы используете ту же плату что и мы, то необходимо выбрать те же пункты, что указаны на картинке. image После этого вам откроется окно на вкладке Pinout, в котором очень удобно при помощи графического интерфейса настраивается периферия контроллера. На основном экране показан условно сам контроллер. При нажатии мышкой на каждый из выводов контроллера выпадает меню, в котором перечислены все функции, которые он может выполнять (вход, выход, прерывания, АЦП и и.д.) В левой части список основных настроек периферийных модулей контроллера. Например, если вы в этом списке раскроете пункт меню USART2 и поставите в нем галочку, то увидите сразу как на контроллере соответствующие выводы изменят свое состояние. Но нам пока ничего здесь не надо менять. То есть мы работаем с заготовкой, которая уже настроена на нашу плату. В ней уже настроен UART, светодиод, кнопка и некоторые дополнительные функции, которые уже есть на плате. image Далее переходим на вкладку Clock Configuration. STM32 имеют очень сложную систему тактирования, которая позволяет замедлять работу отдельных функций на аппаратном уровне или полностью отключать отдельные модули, что в свою очередь дает дополнительные возможности по экономии энергии. Опять же нам тут трогать ничего не надо, но ознакомиться с ней стоит. image На вкладке Configuration вам предоставляется дополнительные возможности по настройке подключенной к проекту периферии, которая для нашего случая уже заранее настроена. image Нажмите на кнопку GPIO (General Purpose Input/Output, порты ввода/вывода общего назначения). У нас выбрано два вывода. К выводу PA5 мы еще на первой вкладке подключили светодиод, а к выводу PC13 кнопку. Здесь они настроены на выход и вход соответственно, а в этом меню можно произвести их более тонкую настройку. image Вкладку Power Consumption мы пока трогать не будем. Пока настройки и расчет потребляемой мощности нас не интересует. image На этом настройка завершена и мы готовы к тому, чтобы сгенерировать проект для дальнейшей работы в Keil. Во вкладке Project выбираем пункт Generate Project. На этом шаге среда уже не знает что мы собираемся делать далее и тут уже придется что-то делать. Задайте проекту имя и укажите директорию для его хранения (желательно без кириллических символов). Toolchain/IDE (инструментарий, Integrated Development Environment – интегрированная среда разработки) – в этом пункте необходимо выбрать MDK-ARM V5. После нажатия кнопки Ok утилита начнет скачивание необходимых файлов и подготовит структуру проекты. По окончании ее работы вы сможете найти файл проекта для Keil uVision. CubeMX сразу предложит вам открыть сгенерированный проект. Сделайте это и Keil uVision откроется автоматически. В проводнике слева найдите файл main.c и откройте его.

Работа с проектом в Keil uVision

Интерфейс среды относительно прост. Сверху панель инструментов, слева дерево файлов проекта, справа текстовый редактор, снизу выходная информация о сборке проекта. Обратите внимание на то, сколько всего для нас сделал CubeMX. Это он собрал воедино все файлы драйверов и библиотек, которые вы видите слева. И именно он написал весь текст файла main.c. Давайте немного подробнее поговорим о структуре этого автоматически сгенерированного кода. В нем много комментариев с подсказками и разъяснениями. Нас интересуют именно те в комментарии в которых есть слова USER CODE BEGIN и USER CODE END. Между этими комментариями можно писать свой код. Дело в том, что после того как проект сгенерирован в CubeMX и вы начали уже изменять его, у вас может возникнуть желание подключить что-то дополнительно или изменить настройки. Если вы будете писать свою программу только в этих выделенных частях, то при изменении проекта в CubeMX в ваш код будет не тронут. int main(void) – точка входа в программу. Затем по тексту происходит инициализация HAL-драйвера (Hardware Abstraction Layer). Это важный аспект нашего курса. Мы будем использовать именно этот драйвер и мы уже подбираемся к непосредственному написанию кода. В файлах этого драйвера содержится исчерпывающие описание всех функций работы с аппаратным обеспечением нашего контроллера. Мы планируем включить светодиод, подключенный к выводу PA5. Соответственно нас интересует файл stm32f0xx_hal_gpio.c. Найдите его в списке файлов и откройте. Желательно (а рано или поздно это произойдет), изучить все что там написано, но сейчас нам важен результат. Поэтому жмем Ctrl+F и ищем в документе слова HAL_GPIO_Write Находим строку 425 и копируем в буфер обмена описание функции, которая будет изменять состояние вывода. Затем мы возвращаемся к файлу main.c и в нем находим место где начинается бесконечный цикл while(1). В теле этого цикла у нас и будет происходить включение/выключение светодиода. Скопированный текст необходимо вставить дополнительной 101ой строкой. Обратите внимание, что слева появится крестик, который обозначает что этот код неправильный. В этой строке необходимо удалить типы переменных, указать конкретный порт и пин, и указать его состояние (ноль или единица). Для установки низкого напряжения на выводе необходимо написать GPIO_PIN_RESET. То есть в итоге у вас должно выглядеть все как на картинке: Далее, в соответствии с задачей, нам необходимо ввести задержку, переключить вывод в высокое логическое состояние и снова сделать задержку. Функция задержки описана в HAL-драйвере как HAL_Dealy();. Время задержки в ней указывается в миллисекундах. GPIO_PIN_SET – выставить вывод в единичное состояние. Допишите остальные функции так как показано на рисунке: Далее выполните команду Project -> Build, или нажмите F7. Если все сделано верно, то в нижнем окне после компиляции вы увидите сообщение о том, что axf-файл создан без ошибок и предупреждений.

Прошивка контроллера

Ранее мы уже подключили плату и проверили, что STLink работает. Можно прошить плату через STLink Utility, но лучше сразу настроить Keil на работу с ним. Откройте пункт меню Debug -> Options. На вкладке Debug у вас должен быть выбран Use ST-Link Debugger. Нажмите на кнопку Settings и перед вами откроется новое окно. Перейдите на вкладку Flash Download и установите галочку Reset and Run. Эта галочка нужна чтобы программа запускалась на выполнение сразу после перезагрузки. Теперь нажмите на кнопку Load на панели инструментов и через мгновение вы увидите как на плате замигает светодиод. Вы можете изменить время и убедиться в том, что это действительно вы его контролируете. Сам светодиод на плате подписан как LD2. Если он не замигал, то, возможно, плата просто не начала исполнять программу после обновления прошивки. Попробуйте перезагрузить ее при помощи черное кнопки.

Пользовательский светодиод на плате

Итоги

Ссылки на остальные статьи цикла можно найти здесь. Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: blink, CubeMX, hello world, Keil, Nucleo, STLink, STM32, курс, программирование, светодиод Просмотров: 17222

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий