Что нужно для программирования stm32
Перейти к содержимому

Что нужно для программирования stm32

  • автор:

Практический курс STM32. Урок 0 — Вводный. Документация. Установка IDE

Примерно год назад, освоив MSP430 я решил подобраться к ARM. Купил себе F4-Discovery, но вот засада, если у Texas Instruments был отличнейший учебник, который позволял на практике освоить MSP в кратчайшие сроки, то с STM32 дела обстояли намного хуже: половина уроков была по серии F0(Cortex-M0 слегка далек от M4 знаете ли), остальные же уроки либо были предназначены для людей имевших ранее дело с ARM, либо основывалась на магии, то есть «вставляем вот этот кусок кода, нажимаем такую-то кнопку, смотрим на плату. Ура, светодиоды мигают, поздравляем» без объяснений что какой кусок кода делает.

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

О чем и для кого этот курс

Прежде всего хочу сразу оговорить, что в основном курс будет касаться серии STM32-F4. Это Cortex-M4, который является прямым наследником Cortex-M3(STM32- L1, F1, F2) и отличается от него главным образом ядром с наличием DSP (цифрового сигнального процессора) и FPU (модуля операций с плавающей запятой).

  1. Мелкие корпуса — рекомендую посмотреть видео/почитать статьи по пайке и обзавестись более-менее приличным инструментом.
  2. Отсутствие единого руководства. Надеюсь мой курс сильно сэкономит вам время в поиске документации или руководства как провернуть ту или иную операцию.
Документация

Обзор платы F4-Discovery можно посмотреть тут. На плате установлен камень STM32F407VG. Идем за документацией к нему сюда(ссылку стоит добавить в закладки), открываем вкладку Design Resources, скачиваем:

  1. Из Product SpecificationsDS8626: ARM Cortex-M4 32b MCU+FPU, 10DMIPS, up to 1MB Flash/192+4KB RAM, USB OTG HS/FS, Ethernet, 17 TIMs, 3 ADCs, 15 comm. interfaces & camera. Это Даташит, в нем описана конкретная специфика конкретного контроллера семейства. Даташит как бы уточняет и дополняет Справочное руководство(о нем чуть ниже).
  2. Из Reference ManualRM0090: STM32F405xx/07xx, STM32F415xx/17xx, STM32F42xxx and STM32F43xxx advanced ARM-based 32-bit MCUs. Это то самое Справочное руководство(далее — СР). Оно описывает серию из нескольких микроконтроллеров. Этот документ станет основным талмудом по части железа. В Даташит же будем лезть когда чего-то не найдем в СР или если нам потребуется что-либо уточнить. Обычно в таких случаях в СР дается прямая отсылка, мол «смотрите даташит на конкретный кристалл»
  3. Из Related Tools and SoftwareSTSW-STM32065: STM32F4 DSP and standard peripherals library. Это просто гениальная библиотека от ST, которая значительно упрощает жизнь при написании и переносе кода, она позволяет думать на уровне архитектуры в целом, а не на уровне скажем регистров. Даже не знаю, почему ST ее так запрятала, видимо скромничают =). Из скачанного архива нам потребуется файл "stm32f4xx_dsp_stdperiph_lib_um.chm". Он представляет собой автоматически собранную из сопровождения к коду библиотеки документацию, следовательно то же самое можно увидеть и в .h или .c файлах. Тут уже кому как удобнее. Остальные файлы из архива нам не понадобятся, так как библиотеку будем подключать непосредственно из «репозитория» IDE.
  1. Из User ManualUM1472: Discovery kit for STM32F407/417 lines. Это руководство к плате. Рекомендуется заглядывать сюда перед тем, как что-то к ней подключить.
  2. Из Schematic PackSTM32F4DISCOVERY schematics(а больше и нечего). Достаем из архива pdf’ку со схемами, кладем к остальным документам.
Установка IDE
  • Keil MDK-ARM
  • IAR Embedded Workbench for ARM (EWARM)
  • Atollic TrueSTUDIO
  • Altium TASKING VX-Toolset
  1. Идем на ST и скачиваем ST-LINK utility. Устанавливаем. Эта штука является продвинутым программатором(только не подумайте что мы будем отладки ради зашивать через нее в камень скомпилированный код — нет, у нас ведь для таких целей есть кокос). Кстати в случае необходимости можно обновить ПО самого ST-Link(встроенный в Discovery программатор) через нее же. Отдельно драйвера ставить не нужно, они в этот установщик уже включены.
  2. Идем на оффсайт кокоса и скачиваем CoIDE. Устанавливаем. Крайне рекомендую скачивать и устанавливать через CoCenter, он значительно упрощает обновление в дальнейшем.
  3. Идем на ланчпад и скачиваем последнюю версию любезно собранного для нас тулчейна (gcc-arm-none-eabi-тратата-win32.exe). Устанавливаем, лучше директорию установки не менять.
  4. Открываем CoIDE. Сверху нажимаем Project -> Select Toolchain Path

    Ну и выбираем директорию установки тулчейна, а в ней bin.

A Beginner’s Guide to Developing on STM32

Sanskar Biswal

STM32 is a series of 32-bit Microcontrollers developed and marketed by the company STMicroelectronics. There are various types and varieties of STM32 Microcontrollers available and they belong to the ARM-architecture family of Microcontrollers. These microcontrollers are used in a variety of applications, from simple printers to complex circuit boards in vehicles. As a result, the technical know how of developing firmware and embedded systems using STM32 microcontrollers are an essential skill-set for an engineer in electronics and communications.

ARM Architecture

ARM stands for Advanced Risk Machine. It is one of the most popular architectures used in devices like cameras, mobile phones and embedded system devices. These are known for their low-power-consumption vs better performance abilities.

ARM is a 32-bit RISC (Reduced Instruction Set Computing) architecture. 32-bit implies that there are 32-lines in the address bus, ie; it can address up to 2³² locations. The RISC instruction implies that the hardware is complex and a lot of process handling is done by the hardware, thus making it easier to code instructions for ARM processors.

The STM32F4-Discovery

Since STM32 is an ARM based microcontroller, it will have distinctions based on whether it is Core 7, Core 4, Core 0 etc. In this blog, I have made use of a development kit ie; STM32F4 Discovery board. A dev-kit, as can be guessed from the name, is used when developing an application. It is essentially a break-out board, which gives access to almost all the pins on the STM32 IC and also has a built-in accelerometer and magnetometer. Thus, it is a great tool to develop and test your application/firmware. Once it can be ensured that the code is good and working, it can then be ported to an actual IC on a production grade PCB.

The STM32F4 dev-kit has the STM32F407VGTx as the on-board IC. If we go through the datasheet, the IC part number gives the specific details and capabilities of the IC.

The Startup Procedure

The startup procedure for the STM32 is not as simple as it would be in an Arduino. There is a learning curve, and it is quite steep but I will try to explain it in a concise manner. To learn more, we will need to refer to the user manual. A link to it, is given below.

Firstly, we need to setup the system clocks and peripherals of the STM32 chip. This is done via setting the configuration of the RCC registers. The RCC is a set of registers which have the clock control, like clock frequency and prescaler settings. Then we need to set the registers of the peripherals that we need to use. The following is a screen-shot of the register map.

We can learns a few things from this image. Firstly, there are 32-bits in the register since STM32 is a 32-bit microcontroller. Now, if we need to use I2C in our program, we need to set the bit corresponding I2C bit in the APB1ENR register. The STM32F4 has 3 I2C peripherals. So, if we need to use the 2nd I2C peripherals. So we need to set APB1ENR-bit-22 of the register.

The code snippet above is to set the 22nd bit of the register. This is usually how we use C when doing firmware programming. Bit-wise operations are essential to writing firmware codes.

Next, if we are going to use GPIO pins; any I/O operations from the pins of STM32, we need to set the pins in the RCC->AHB1ENR to setup the GPIO clocks. The register maps is as follows:

Once, the right clocks are enabled, we can now start programming their use. As of now, you might have realized that we cannot easily add and modify peripherals as per our use. There is also a huge chance that we make an error in assigning the right bit to the right register. Thus, although this gives us a great control over the system resources.

However, it is not easy to use and usually a cumbersome process.

The Easy Method to Setup STM32 Microcontrollers

Personally, I make use of the STM-CubeMX tools for setting up the clocks and configuring the STM32 chips.

CubeMX is a free tool provided by STMicrocontrollers for setting up the initial config of STM32 microcontroller. It also includes a code generator, which will self-generate the code required for system initialization. This makes it a perfect tool for developers to focus their attention on developing actual applications instead of working on the difficult process of configuring the clocks of the microcontroller. The download link is given at the end.

Начинаем изучать Cortex-M на примере STM32

Данная статья является первой в планируемом цикле статей по изучению программирования микроконтроллеров. Изучая различные материалы я отметил, что практически все они начинаются с того, что новичку предлагается скачать (или использовать идущую со средой разработки) библиотеку для работы с периферийными устройствами и использовать ее для написания своей первой программы (обычно мигание светодиодом).

Меня это сильно удивило. Если верить данным статьям, для программирования не обязательно даже читать документацию к программируемому контроллеру. Меня же учили премудростям «железного программирования» совершенно иначе.

В этой статье, путь от фразы «Да, я хочу попробовать!» до радостного подмигивания светодиода, будет значительно длиннее чем у других авторов. Я постараюсь раскрыть аспекты программирования микроконтроллеров, которые прячутся за использованием библиотечных функций и готовых примеров.
Если вы намерены серьезно изучать программирование микроконтроллеров данная статья для вас. Возможно, она может заинтересовать и тех, кто вдоволь наигрался с Arduino и хочет получить в свои руки все аппаратные возможности железа.

Выбор микроконтроллера

Многие могут сказать, что начинать изучение микроконтроллеров лучше с AVR, PIC, 8051 или чего-то еще. Вопрос многогранный и спорный. Я знаю достаточно примеров, когда люди изучив Cortex-M, программировали AVR, ARM7 и т.д. Сам же я начинал с Cortex-M3. Если перед вами стоит определенная задача, в интернете достаточно много информации со сравнением различных типов микроконтроллеров и решаемых с их помощью задач. На хабре этот вопрос тоже поднимался, например тут.

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

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

Что необходимо для изучения?

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

Сам я использую демонстрационную плату STM3220G-EVAL и программатор J-Link PRO. Но для начала, будет вполне достаточно STM32F4DISCOVERY, которую можно купить без особых проблем за небольшую сумму.

Все примеры будут именно для отладочной платы STM32F4DISCOVERY. На данном этапе нам будет совершенно не важно, что этой плате стоит МК на базе ядра Cortex-M4. В ближайшее время мы не будем использовать его особенности и преимущества над Cortex-M3. А как там будет дальше — посмотрим.

Если у вас есть в наличии любая другая плата на базе STM32F2xx/STM32F4xx, вы сможете работать с ней. В изложении материала я постараюсь максимально подробно описывать почему мы делаем именно так, а не иначе. Надеюсь ни у кого не возникнет проблем с переносом примеров на другое железо.

Среда разработки

Процесс установки я описывать не буду.

С чего начать?
Создание проекта

Для начала создадим пустой проект. IAR позволяет создать проекты на ASM, C и C++. Мы будем использовать C.

Перед нами появится пустой проект с main файлом.

Теперь необходимо настроить проект для начала работы с «нашим» МК и отладчиком. На плате STM32F4DISCOVERY установлен MK STM32F407VG . Его необходимо выбрать в свойствах проекта (General Options->Target->Device):

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

После этого необходимо настроить отладчик. Отладка программы происходит непосредственно «в железе». Производится это с помощью JTAG отладчика. Более подробнее ознакомиться с тем, как это происходит можно на Википедии. На плату STM32F4DISCOVERY интегрирован отладчик ST-LINK/V2. Для работы с отладчиком необходимо выбрать его драйвер в меню Debugger->Setup->Driver. Так же необходимо указать, что отладка должна производиться непосредственно в железе. Для этого необходимо поставить флаг Debugger->Download->Use flash loader(s)

Теперь проект готов для работы (программирования, заливки и отладки).

«ТЗ» для первого проекта

Подведем промежуточный итог: МК и отладочная плата выбраны, проект подготовлен. Пора определиться с задачей.

Не будем отходить от классики. Первым проектом будет мигающий светодиод. Благо на плате их предостаточно.Что же это означает с точки зрения программирования? Первым делом необходимо изучить принципиальную схему демонстрационной платы и понять как «заводится» светодиод.
User manualдоступен на сайте производителя. В данном описании даже есть отдельный раздел про светодиоды на плате —4.4 LEDs. Для примера, будем использовать User LD3. Найдем его на схеме:

Простейший анализ схемы говорит о том, что для того, что бы «зажечь» светодиод необходимо на пин МК подать «1» (которая для данного МК соответствует 3.3В). Выключение производится подачей на этот пин «0». На схеме этот пин обозначается PD13 (это, наверное, самая важная информация из этого документа).

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

В итоге, мы можем написать «ТЗ» для нашей первой программы:
Программа для МК должна переводить состояние пина МК PD13 из состояния «0» в состояние «1» и обратно с некоторой периодичностью, различимой для человеческого глаза (важное замечание, если моргать светодиодом слишком часто глаз может этого не различить).

Прежде чем приступать к программированию, или немного теории

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

Начнем с того, что любой МК включает ядро, память и периферийные блоки. Думаю, что с памятью пока все понятно. Упомяну лишь, в STM32 есть флеш память в которой хранится программа МК (в общем случае это не верное утверждение, программа может храниться во внешней энергонезависимой памяти, но пока это опустим) и другие данные, в том числе и пользовательские. Так же есть SRAM — оперативная память.

Ядро — часть микроконтроллера, осуществляющая выполнение одного потока команд. В нашем МК тип ядра — Cortex-M4. Ядро МК можно сравнить с процессором в ПК. Оно умеет только выполнять команды и передавать данные другим блокам (в этом сравнении не учитываются процессоры с интегрированными графическими ускорителями).
При этом производитель МК не разрабатывает ядро. Ядро покупается у компании ARM Limited. Главное отличие между различными МК — в периферии.

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

Взаимодействие ядра с периферийным блоком

Взаимодействие ядра МК с периферийным блоком осуществляется с помощью спецрегистров (есть еще взаимодействие через механизм прерываний и DMA, но об этом в следующих постах). С точки зрения ядра это просто участок памяти с определенным адресом, вот только на самом деле это не так. Запись данных в спецрегистр эквивалентна передаче команды или данных периферийному блоку. Считывание — получение данных от блока или считывание его состояния. Описание периферийных блоков и их спецрегистров занимает львиную долю описания МК.

ВАЖНО: После записи данных в спецрегистр и последующем чтении вы можете получить совершенно иные данные. Например, передача данных блоку UART для отправки, и считывание данных, полученных блоком от внешнего устройства, осуществляется с помощью одного и того же регистра.

Спецрегистры обычно разделены на битовые поля. Один (или несколько) бит управляют определенным параметром периферийного блока, обычно независимо. Например, разные биты одного регистра управляют состоянием разных выходов МК.

Вспоминаем С

Если вы гуру в языке C, то можете смело пропускать данный раздел. Он предназначен в первую очередь для тех, кого учили (или ктоучился сам) программировать для ПК. Опыт показывает, что люди часто не помнят важных команд. Здесь я вкратце напомню про побитовые операции и работу напрямую с памятью по ее адресу.

Запись данных по адресу в памяти

Предположим, что читая описание периферийного блока, мы поняли, что для его корректной работы необходимо записать в него число 0x3B. Адрес спецрегистра 0x60004012. Регистр 32-битный.
Если вы сразу не знаете как это сделать, попробую описать цепочку рассуждений для получения правильной команды.

Значение 0x60004012 есть не что иное, как значение указателя на ячейку памяти. Нужно именно это и указать в нашей программе, тоесть сделать преобразование типов согласно синтаксису языка C:

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

Установка произвольных бит в 1

Предположим, что необходимо установить «1» в 7 и 1 биты по адресу 0x60004012, при этом не изменив значение всех остальных бит в регистре. Для этого необходимо использовать бинарную операцию |. Сразу приведу правильный ответ:

Обратите внимание на 2 факта. Биты считаются с нулевого, а не с первого. Данная операция на самом деле занимает неменее 3 тактов — считывание значения, модификация, запись. Иногда это не допустимо, поскольку между считыванием и записью значение одного из бит, которые нам запрещено изменять, могло быть изменено периферийным блоком. Незабывайте про эту особенность, иначе могут полезть баги, которые крайне сложно отловить.

Установка произвольных бит в 0

Предположим, что необходимо установить «0» в 7 и 1 биты по адресу 0x60004012, при этом не изменив значение всех остальных бит в регистре. Для этого необходимо использовать бинарную операцию &. Сразу приведу правильный ответ:

Или его более простою запись (не переживайте за лишнюю операцию, компилятор все заранее посчитает даже при минимальной оптимизации):

Некоторые особенности программ для МК

Здесь я постараюсь описать некоторые особенности программ для МК, которые важно помнить. Вещи достаточно очевидные, но все же.
У программы нет конца
В отличии от большинства программ для ПК, программа для МК не должна заканчиваться, НИКОГДА! А что собственно должен будет делать МК после завершения вашей программы? Вопрос, практически, риторический. Поэтому не забываем убедиться в том, что вы не забыли вечный цикл. При желании, можно перевести МК в режим сна.
Пользуйтесь целочисленными переменными
Не смотря на то, что мы используем МК с ядром Cortex-M4, который аппаратно выполняет операции над числами с плавающей точкой, советую вам отказаться от их использования. В МК без поддержки таких операций время вычислений будет просто огромным.
Откажитесь от динамического выделения памяти
Это только совет. Причина проста — памяти мало. Я не раз встречался с библиотеками, в которых были «медленные утечки» памяти. Было очень неприятно, когда после нескольких недель стабильной работы МК зависал с ошибкой. Лучше заранее продумать архитектуру своей программы так, чтобы не пришлось использовать динамическое выделение памяти.
Если же все-таки хочется использовать — внимательно изучите работу менеджера памяти или пишите свой.

Приступаем к работе!

Работа над программой для МК всегда начинается с чтения документации. Для нашего МК Reference manual доступен на сайте производителя. Страниц много, но все читать пока не нужно. Как уже было сказано, большую часть документации составляет описание периферийных блоков и их регистров. Так же хочу обратить внимание на то, что этот Reference Manual написан не для одного МК, а для нескольких линеек. Это говорит о том, что код будет переносим при переходе на другие МК в этих линейках (если конечно не пытаться использовать периферийные блоки которых нет в используемом МК).

В первую очередь необходимо определиться с какими блоками предстоит работать. Для это достаточно изучит разделы Introduction и Main features.

Непосредственное управление состоянием пинов МК осуществляется с помощью блока GPIO. Как указано в документации в МК STM32 может быть до 11 независимых блоков GPIO. Различные периферийные блоки GPIO принято называть портами. Порты обозначаются буквам от A до K. Каждый порт может содержать до 16 пинов. Как мы отметили ранее, светодиод подключается к пину PD13. Это означает, что управление этим пином осуществляется периферийным блоком GPIO порт D. Номер пина 13.

Ни каких других периферийных блоков на это раз нам не понадобится.

Управление тактированием периферийных блоков

Для снижения электропотребления МК практически все периферийные блоки после включения МК отключены. Включение/выключение блока производится подачей/прекращением подачи тактового сигнала на его вход. Для корректной работы, необходимо сконфигурировать контроллер тактового сигнала МК, чтобы необходимому периферийному блоку поступал тактовый сигнал.
Важно:Периферийный блок не может начать работу сразу после включения тактового сигнала. Необходимо подождать несколько тактов пока он «запустится». Люди, использующие библиотеки для периферийных устройств, зачастую даже не знают об этой особенности.

За включение тактирования периферийных блоков отвечают регистры RCC XXX peripheral clock enable register.На месте XXX могут стоять шины AHB1, AHB2, AHB3, APB1 и APB2. После внимательного изучения описания соответствующих регистров, можно сделать вывод о том, тактирование периферийного блока GPIOD включается установкой «1» в третий бит регистра RCC AHB1 peripheral clock enable register (RCC_AHB1ENR):

Теперь необходимо разобраться с тем, как узнать адрес самого регистра RCC_AHB1ENR.

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

Определение адресов спецрегистров

Определение адресов спецрегистров необходимо начинать с чтения раздела Memory map в Reference manual. Можно заметить, что каждому блоку выделен свой участок адресного пространства. Например, для блока RCC это участок 0x4002 3800 — 0x4002 3BFF:

Перейдя по ссылке к Register map блока RCC находим строчкку с интересующим нас регистром RCC_AHB1ENR:

Для получения адреса регистра, необходимо к начальному значению адресного пространства блока RCC прибавить Addr. offset нужного регистра. Addres offset указывается и в описании регистра (см. скриншот выше).

В итоге, мы определили адрес регистра RCC_AHB1ENR — 0x4002 3830.

Блок GPIO

Для общего ознакомления с блоком GPIO я настоятельно рекомендую полностью прочитать соответствующий раздел Reference Manual. Пока можно не особо обращать внимание на Alternate mode. Это оставим на потом.

Сейчас же наша задача научиться управлять состоянием пинов МК. Перейдем сразу к описанию регистров GPIO.

Режим работы

В первую очередь необходимо установить режим работы 13 пина порта D как General purpose output mode, что означает что блок GPIO будет управлять состоянием пина МК. Управление режимом работы пинов МК производитсяс помощью регистра GPIO port mode register (GPIOx_MODER) (x = A..I/J/K):

Как видно из описания для совершения требуемой нам настройки необходимо записать значение 01b в 26-27 биты регистра GPIOx_MODER. Адрес регистра можно определить тем же методом, что описан выше.

Настройка параметров работы выходных пинов порта GPIO
  • GPIO port output type register (GPIOx_OTYPER) — задается тип выхода push-pull или open-drain
  • GPIO port output speed register (GPIOx_OSPEEDR) — задается скорость работы выхода
Установка значения на пине МК

Наконец-то мы подошли к моменту управления состоянием выхода МК. Для утановки выходного значения на определенном пине МК есть два метода.

Используем регистр GPIO port bit set/reset register (GPIOx_BSRR)

Запись «0» или «1» в биты 0-16 приводят к соответствующему изменению состояния пинов порта. Для того, чтобы установить определенное значение на выходе одного или нескольких пинов МК и не изменить состояния остальных, необходимо будет пользоваться операцией модификации отдельных бит. Такая операция выполняется не менее чем за 3 такта. Если же необходимо в часть битов записать 1, а в другие 0, то понадобится не менее 4 тактов. Данный метод предпочтительнее всего использовать для изменения состояния выхода на противоположное, если его изначальное состояние не известно.

GPIO port bit set/reset register (GPIOx_BSRR)

В отличии от предыдущего метода, запись 0 в любой из битов данного регистра не приведет ни к чему (да и вообще, все биты write-only!). Запись 1 в биты 0-15 приведет к установке «1» на соответствующем выходе МК. Запись 1 в биты 16-31 приведет к установке «0» на соответствующем выходе МК. Этот метод предпочтительнее предыдущего, если необходимо установить определенное значение на пине «МК», а не изменить его.

Зажигаем светодиод!

Найдя адреса всех необходимых регистров, можно написать программу, которая включает светодиод:

Можно компилировать (Project->Compile) и заливать (Project->Download->Download active application). Или запустить отладку (Project->Dpwnload and Debug) и начать выполнение (F5).
Светодиод загорелся!

Мигаем светодиодом

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

Значение 1000000 в задержке подобрано экспериментально так, чтобы период мигания светодиода был различим глазом, но и не был слишком велик.

Оптимизируем алгоритм

Минусом выбранного подхода миганием светодиодом является то, что ядро МК большую часть времени проводит в пустых циклах, хотя мог бы заниматься чем-нибудь полезным (в нашем примере других задач нет, но в будущем они появятся).

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

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

Немного об отладке

IAR позволяет осуществлять отладку приложения непосредственно в железе. Все выглядит практически так же, как и отладка приложения для ПК. Есть режим пошагового выполнения, входа в функцию, просмотр значения переменных (В режиме отладки View->Watch->Watch1/4).

Но помимо этого, присутствует возможность просмотра значений регистров ядра, спецрегистров периферийных блоков (View->Register) и т.п.
Я настоятельно рекомендую ознакомиться с возможностями дебаггера во время изучения программирования МК.

Несколько слов в заключение
  • В библиотеках от производителя иногда встречаются ошибки! Я один раз чуть не сорвал срок проекта из-за этого. Несколько раз перепаивал чип, думая, сто повредил кристалл при пайке (до этого такое случалось). А проблема заключалась в том, что в библиотеке был неверно прописан адрес спецрегистра. Обычно такое случается с МК или линейками МК только вышедшими на рынок.
  • Библиотеки для работы спериферией некоторых производителей не реализуют всех возможностей периферийных блоков. Особенно этим грешилb Luminary Micro, которых в последствии выкупили TI. Приходилось писать инициализацию периферии вручную.
  • Многие привыкают начинать программирование МК с изучения примеров. Я считаю, что сперва необходимо определиться с тем, что позволяет реализовать МК. Это можнопонять только прочитав документацию. Если чего-то нет в примерах, это не значит, что железоэто не поддерживает. Последний пример — аппаратная поддерка PTP STM32. В сети, конечно, можно кое-что найти, но это не входит в стандартный набор от производителя.
  • Драйверы периферийных блоков некоторых производителей настолько не оптимизированы, что на переключение состояния пина средствами библиотеки тратится до 20 тактов. Это непозволительная роскошь для некоторых задач.

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

STM32 IDE

STm32 IDE

Программирование stm32 стоит начать с изучения программного обеспечения для написания программ под данный микроконтроллер. На сегодняшний день разработано достаточно большое количество программ для написания программного кода под микроконтроллер Stm32 ( STM32 IDE ) и связанно это с большой популярностью данных микроконтроллеров.

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

  1. STM32CUBEMX;
  2. STM32CUBEIDE;
  3. KEIL;
  4. IAR Embedded Workbench for ARM;
  5. CodeGrip.

STM32CUBEMX

CubeMX

CubeMx не случайно попал в нашу подборку. Данный программный продукт не позволяет разрабатывать приложения под контроллеры STM32. Но он является отличным генератором кода под все микроконтроллеры STM32.

С помощью CubeMX пользователю предоставляется возможность настроить и сгенерировать библиотеку для работы с периферией STM32. Т.е. нет необходимости писать с нуля код для работы с UART или SPI, не нужно писать функцию чтения ADC или функции работы PWM. За вас все это сделает CubeMX. Нужно только правильно настроить необходимые блоки в визуальном редакторе.

Большим плюсом является то, что эта программа абсолютно бесплатная и разрабатывается производителем STM32 – STMicroelectronics. Это означает, что обновление будет выходит на постоянной основе, а так же при появлении новых микроконтроллеров, в этой среде они будут появляется раньше остальных. Сгенерировать библиотеки можно под разработку в таких STM32 IDE, как STM32CUBEIDE и KEIL.

STM32CUBEIDE

CubeIDE

CUBEIDE STM32, среда разработки под контроллеры STM32 от компании производителя чипов STMicroelectronics. Данный программный продукт поставляется совершенно бесплатно. Что является большим плюсом.

На время написания статьи программу можно скачать, зарегистрировав аккаунт и указав европейскую страну. Так же необходимо использовать ВПН. Интерфейс CUBEIDE интуитивно понятен и содержит всё, что нужно для комфортной разработки (дебагер с отладкой в real time, просмотр переменных и т.д.).

Так же стоит отметить, что CUBEIDE все время развивается и поддерживается разработчиком. К минусам отнесем отсутствие документации на русском языке.

IDE KEIL

Keil — одна из самых мощных IDE для разработки программ под микроконтроллеры STM32. Keil имеет свой собственный компилятор, позволяющий комфортно отлаживать программный код. В IDE используется язык программирования С\С++. Так же Keil имеет в своем распоряжение симулятор, который позволяет эмулировать некоторое железо, например UART.

Минусом данной IDE является платная лицензия. А так же то, что программа работает только в ОС Windows. На просторах интернета можно скачать активатор для Keil, но в таком случае у пользователей наблюдаются вылеты и подвисания программы.

IAR Embedded Workbench for ARM (IAR-EWARM)

IAR IDE

Еще один хороший редактор кода с компилятором C\C++ для микроконтроллеров STM32. Этот редактор кода имеет в своем распоряжении более 4000 примеров по работе с периферией STM32. Так же IDE IAR в автоматическом режиме проверяет ваш код на правила MISRA C (MISRA C: 2004). Это правила написания отказа устойчивого программного кода.

Редактор поддерживает все контроллеры STM32, библиотеки для работы с периферией, а так же плагин для работы с RTOC (операционная система реального времени).

Минусом использования IDE IAR это то, что она является платной.

CodeGrip

CodeGRIP IDE

Еще один редактор кода для микроконтроллеров STM32 от компании MICROE. Одним из отличий данного редактора является то, что редактор имеет такие компиляторы как: microC, microPascal, microBasic. Компиляторы разработаны под экосистему Microe, оптимизированы под отладочные комплекты компании. Большим минусом является платная лицензия на компилятор.

Какую выбрать среду разработки для STM32?

В заключение необходимо сказать о выборе STM32 IDE. Каждый из редакторов имеет и плюсы и минусы, в частности я выбрал для себя CUBEIDE в связке с CUBEMX. Данная среда разработки удовлетворяет всем моим запросам, а так же что немало важно она является бесплатной.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *