Плюсы и минусы микроконтроллеров Arduino и STM32
Начнём с достоинств преждевременного фаворита – самого ардуино. И главное из них известно всем, кто работал с данным чипом и его собратьями – собственная экосистема. Вы можете найти ответы на все возникающие вопросы в интернете, ведь база знаний и количество пользователей микроконтроллера даже в СНГ сегменте поражает. А это значит, что не придётся искать инструкции на английском, чего не скажешь об stm32f103c8t6 arduino. Большое количество пользователей подразумевает и широкий программный функционал, лишь крупинка которого предоставляется самими производителями.
Фанатская база ежедневно создаёт десятки библиотек, поэтому вы сможете воплотить в жизнь любую свою задумку. Некоторые схемные решения с микроконтроллером stm8s001j3 могут не порадовать новичков в этом деле, ардуино же старается максимально угодить новому пользователю и не предоставляет никаких сложностей.
Отсюда выплывают доступные шилды, простота использования, чем не могут похвастаться микроконтроллеры stm, и простое программирование под Atmel, без необходимости учить все тонкости языка на практике. Ну а более продвинутые оценят EEPROM, идущий с коробки, чем микроконтроллер stm32 не может похвастаться.
Однако, как и везде, есть свои недостатки:
- Низкий порог вхождения предполагает большое количество кривых и неотлаженных библиотек, работающих чуть ли не на последнем издыхании. Наткнувшись пару раз на такой софт и занимаясь его дебагингом в течение пары дней, вы решите, что проще написать собственный.
- Следующее преимущество stm32 ардуино не предоставляет нормальной отладки, из-за чего поиск ошибок в тех же кривых библиотеках и занимает так много времени.
- Нормальная производительность на Атмега – миф, и на деле вам потребуется изворачиваться и отказываться от многих функций продукта, чтобы он работал без подлагиваний. Нормальных планировщиков тоже не найти, а те, что можно подсоединить, съедают слишком много ресурсов. Из-за чего поделки на ардуино славятся кривым и лагающим интерфейсом с долгим временем отклика, если речь идёт о чём-то сложнее, чем электронная щеколда или конструкция из микроконтроллера и датчика движений.
- Множество кривой и откровенно бесполезной продукции на этих платах, в особенности от китайцев, лишь ухудшает имидж Ардуино.
- Нормальных книг по микроконтроллерам stm32, конечно, не найти, но и ардуино не предоставляет много профессиональной информации, помимо форумов, где отладкой занимаются сами пользователи.
- А сама среда разработки софта под неё требует просто невероятной производительности, не сравнимой ни с чем, что есть на рынке. Притом, куда идут все съедаемые ресурсы, не совсем понятно. А соответственно, виной всему – ужасающая оптимизация.
С другой стороны, перед пользователем встаёт arduino stm32f103 и arduino stm8 высокопроизводительный контроллер, упрощающий переход с микроконтроллера stm32 на микроконтроллер миландр и множеством периферии в дополнение.
Вы можете скачать файлы поддержки stm32 плат на Arduino IDE 1.8.x по этой ссылке.
Проектировка плат значительно облегчается благодаря свободному ходу ног, стоковая среда разработки – достаточно мощный инструмент, а отладка изначально построена так, чтобы работать без нареканий даже в чужих средах. Вам предоставляют красочные графики и точки, не говоря уже о текстовой информации. Простой перенос кода, возможность запускать отдельные контроллеры в 41 Мбитной развёртке и наличие USB портов практически везде. Всё это может запросто завлечь более продвинутых разработчиков, но им стоит ознакомиться и с рядом недостатков:
- Высокий порог входа, для нормального пользования необходим хороший базис.
- Библиотеки также присутствуют, но большинство из них устарели или же сделаны каждым лично для себя. Проще уже создать собственную. Но если вспомнить о проблемах Ардуино, то вполне вероятно, что вы уже умеете это делать.
- Нижние пробелы и, в целом, некрасивая семантика в сравнении с простыми функциями конкурента.
- С99 это всё же далеко не С++, и вы сразу прочувствуете все сложности перехода. Однако многие утверждают, что спустя время – наоборот, рады такому нюансу.
- В целом, дешевизна плат в сравнении с Ардуино.
Распиновка MINI-M4 для STM32
Программное обеспечение для работы с контроллером
Для ARM архитектуры разработано множество сред разработки. К самым известным и дорогостоящим относятся инструменты фирм Keil и IAR System. Программы этих компаний предлагают самые продвинутые инструментарии для оптимизации кода. Также дополнительно существуют различные системы – USB стеки, TCP/IP-стеки и прочие. Применяя системы Keil, пользователь получает хороший уровень технической поддержки.
Также для STM32 используется среда разработки Eclipse и построенные на ней системы Atollic TrueStudio (платная) и CooCox IDE (CoIDE) (бесплатная). Обычно используется последняя. Ее преимущества перед другими средами разработки:
- Свободно распространяемое программное обеспечение;
- Удобство использования;
- Имеется много примеров, которые можно загрузить.
Единственный недостаток среды разработки CooCox IDE – сборка есть только под Windows.
Запуск на STM32F7Discovery
На 32F746GDISCOVERY есть несколько аппаратных разделов памяти, которые мы можем так или иначе использовать
- 320KiB оперативной памяти
- 1MiB флэш-памяти для образа
- 8MiB SDRAM
- 16MiB QSPI NAND-флэшка
- Разъём для microSD-карточки
SD-карту можно использовать для хранения изображений, но в контексте запуска минимального примера это не очень полезно.
Дисплей имеет разрешение 480×272, а значит, память под фреймбуффер составит 522 240 байт при глубине 32 бита, т.е. это больше, чем размер оперативной памяти, так что фреймбуффер и кучу (которая потребуется в том числе для OpenCV, чтобы хранить данные для изображений и вспомогательных структур) будем располагать в SDRAM, всё остальное (память под стэки и прочие системные нужды) отправится в RAM.
Если взять минимальный конфиг для STM32F7Discovery (выкинуть всю сеть, все команды, сделать стэки как можно меньше и т.д.) и добавить туда OpenCV с примерами, с требуемой памятью будет следующее:
Для тех, кто не очень знаком с тем, какие секции куда складывается, поясню: в и лежат интструкции и константы (грубо говоря, readonly-данные), в лежат данные изменяемые, в лежит «занулённые» переменные, которым, тем не менее, нужно место (эта секция «отправится» в RAM).
Хорошая новость в том, что / должны помещаться, а вот с беда — под образ есть только 1MiB памяти. Можно выкинуть из картинку из примера и читать её, например, с SD-карты в память при запуске, но fruits.png весит примерно 330KiB, так что проблему это не решит: большая часть состоит именно из кода OpenCV.
По большому счёту, остаётся только одно — загрузка части кода на QSPI-флэшку (у неё есть спец. режим работы для мэпирования памяти на системную шину, так что процессор сможет обращаться к этим данным напрямую). При этом возникает проблема: во-первых, память QSPI-флэшки недоступна сразу после перезагрузки устройства (нужно отдельно инициализировать memory-mapped-режим), во-вторых, нельзя «прошить» эту память привычным загрузчиком.
В итоге было решено слинковать весь код в QSPI, а прошивать его самописным загрузчиком, который будет получать нужный бинарник по TFTP.
Результат
Идея портировать эту библиотеку на Embox появилось ещё примерно год назад, но раз за разом это откладывалось из-за разных причин. Одна из них — поддержка libstdc++ и standart template library. Проблема поддержки C++ в Embox выходит за рамки этой статьи, поэтому здесь только скажу, что нам удалось добиться этой поддержки в нужном объёме для работы этой библиотеки 🙂
В итоге эти проблемы были преодолены (по крайней мере, в достаточной степени для работы примера OpenCV), и пример запустился. 40 длительных секунд занимает у платы поиск границ фильтром Кэнни. Это, конечно, слишком долго (есть соображения, как это дело оптимизировать, об этом можно будет написать отдельную статью в случае успеха).
tl;dr: пошаговая инструкция
0: Качаем исходники Embox, например так:
1: Начнём со сборки загрузчика, который «прошьёт» QSPI-флэшку.
Теперь нужно настроить сеть, т.к. загружать образ будем по TFTP. Для того, чтобы задать IP-адреса платы и хоста, нужно изменить файл conf/rootfs/network.
Пример конфигурации:
— адрес хоста, откуда будет загружаться образ, — адрес платы.
После этого собираем загрузчик:
2: Обычная загрузка загрузчика (простите за каламбур) на плату — здесь ничего специфичного, нужно это сделать как для любого другого приложения для STM32F7Discovery. Если вы не знаете, как это делается, можно почитать об этом тут.
3: Компиляция образа с конфигом для OpenCV.
4: Извлечение из ELF секций, которые нужно записать в QSPI, в qspi.bin
В директории conf лежит скрипт, который это делает, так что можно запустить его
5: С помощью tftp загружаем qspi.bin.bin на QSPI-флэшку. На хосте для этого нужно скопировать qspi.bin в корневую папку tftp-сервера (обычно это /srv/tftp/ или /var/lib/tftpboot/; пакеты для соответствующего сервера есть в большинстве популярных дистрибутивов, обычно называется tftpd или tftp-hpa, иногда нужно сделать для старта).
На Embox-е (т.е. в загрузчике) нужно выполнить такую команду (предполагаем, что у сервера адрес 192.168.2.1):
6: С помощью команды нужно «прыгнуть» в QSPI-память. Конкретная локация будет варьироваться в зависимости от того, как образ слинкуется, посмотреть этот адрес можно командой (адрес старта укладывается во второе 32-битное слово образа); также потребуется выставить стэк флагом , адрес стэка лежит по адресу 0x90000000, пример:
7: Запускаем
и наслаждаемся 40-секундным поиском границ 🙂
Библиотека ST ZigBee Pro
Компания STMicroelectronics предоставляет своим клиентам библиотеку ST ZigBee Pro, которая совместно с библиотекой для стандартной периферии позволяет реализовывать надежные и экономичные сети на базе микроконтроллеров STM32W108. Примеры использования библиотеки ST ZigBee Pro показаны на рис. 2.
Рис. 2. Использование библиотеки ST ZigBee Pro
В зависимости от сложности приложения используются соответствующие модули библиотеки. Стек ZigBee PRO занимает на 20% меньше места, чем предыдущее поколение программных продуктов.
Код библиотеки ST ZigBee Pro, так же как и код библиотеки стандартной периферии, выполняются в системном режиме ядра, тогда как пользовательский код, реализующий алгоритмы сбора и обработки данных, работает в режиме приложения. Это позволяет четко разграничить приоритеты выполнения задач и обеспечить более быстрое реагирование на события, происходящие на аппаратном уровне и связанные с информацией, проходящей через канал обмена данными с внешней средой.
Добавим таймер
Задержка пустым циклом — это кощунство, тем более на таком мощном кристалле как STM32, с кучей таймеров. Поэтому сделаем эту задержку с помощью таймера.
В STM32 есть разные таймеры, отличающиеся набором свойств. Самые простые — Basic timers, посложнее — General purpose timers, и самые сложные — Advanced timers. Простые таймеры ограничиваются просто отсчётом тактов. В более сложных таймерах появляется ШИМ. Самые сложные таймеры, к примеру, могут сгенерировать 3–фазный ШИМ с прямыми и инверсными выходами и дедтаймом. Нам хватит и простого таймера, под номером 6.
Немного теории
Всё, что нам требуется от таймера — досчитывать до определённого значения и генерировать прерывание (да, мы ещё и научимся использовать прерывания). Таймер TIM6 тактируется от системной шины, но не напрямую а через прескалер — простой программируемый счётчик–делитель (подумать только, в СССР выпускались специальные микросхемы–счётчики, причём программируемые были особым дефицитом — а теперь я говорю о таком счётчике просто между делом). Прескалер можно настраивать на любое значение от 1 (т.е. на счётчик попадёт полная частота шины, 24МГц) до 65536 (т.е. 366 Гц).
Тактовые сигналы в свою очередь, увеличивают внутренний счётчик таймера, начиная с нуля. Как только значение счётчика доходит до значения ARR — счётчик переполняется, и возникает соответствующее событие. По наступлению этого события таймер снова загружает 0 в счётчик, и начинает считать с нуля. Одновременно он может вызвать прерывание (если оно настроено).
На самом деле процесс немного сложнее: есть два регистра ARR — внешний и внутренний. Во время счёта текущее значение сравнивается именно со внутренним регистром, и лишь при переполнении внутренний обновляется из внешнего. Таким образом, можно безопасно менять ARR во время работы таймера — в любой момент.
Код
Код будет очень похож на предыдущий, т.к. инициализация всей периферии происходит однотипно — за тем лишь исключением, что таймер TIM6 висит на шине APB1. Поэтому включение таймера: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
Теперь заводим структуру типа TIM_TimeBaseInitTypeDef, инициализируем её (TIM_TimeBaseStructInit), настраиваем, передаём её в функцию инициализации таймера (TIM_TimeBaseInit) и наконец включаем таймер (TIM_Cmd).
Что за магические числа? Как мы помним, на шине присутствует тактовая частота 24МГц (при наших настройках проекта). Настроив предделитель таймера на 24000, мы поделим эту частоту на 24 тысячи, и получим 1кГц. Именно такая частота попадёт на вход счётчика таймера.
Значение же в счётчике — 1000. Значит, счётчик переполнится за 1000 тактов, т.е. ровно за 1 секунду.
После этого у нас действительно появляется работающий таймер. Но это ещё не всё.
Programming Manual
Programming Manual не является документом первой необходимости в самом начале знакомства с STM-ми, однако является очень важным при углубленном изучении этих микроконтроллеров. Он содержит информацию о процессорном ядре, системе команд и периферии ядра. Причем это не та же самая периферия, которая описана в Reference manual-е. В нее входят:
- System timer — системный таймер
- Nested vectored interrupt controller — контроллер приоритетных прерываний
- System control block
- Memory protection unit
Как только мы начнем знакомится с прерываниями в STM32, нам понадобится раздел 4.3 Nested vectored interrupt controller (NVIC). Ну и системный таймер является очень прикольной вещью, который будет полезен в каких-нибудь RTOS или для создания программных таймеров.
Регистры CR и CFGR
Открываем Reference manual на микроконтроллер STM32F103x8 и переходим к разделу 7: Low-, medium-, high- and XL-density reset and clock control (RCC). RCC имеет довольно много регистров, целых 10 штук. Однако, для настройки источника тактирования и делителей шин нам понадобится только 2 из них.
Clock control register (RCC_CR)
Рис. 1. Биты регистра CR
Описание основных битов регистра:
PLLRDY — флаг готовности PLL. Устанавливается аппаратно и сигнализирует о том, что PLL заблокирован.
PLLON — Включить PLL. Устанавливается и сбрасывается программно. При переходе в режим Stop или Standby сбрасывается аппаратно. Этот бит не может быть сброшен, если PLL используется как источник системного тактирования.
CSSON — включить систему CSS
HSEBYP — Если вместо кварцевого резонатора HSE мы хотим использовать внешний прямоугольный тактовый сигнал, то этот бит нужно установить в 1
HSERDY — Флаг готовности генератора HSE. Аппаратно устанавливается в 1 после успешного запуска и стабилизации частоты HSE-генератора
HSEON — Запустить HSE генератор. Устанавливается и сбрасывается программно. При переходе в режим Stop или Standby сбрасывается аппаратно и HSE генератор останавливается. Этот бит не может быть сброшен, если HSE используется как источник системного тактирования.
HSIRDY — то же самое, что и HSERDY, только для встроенного RC-генератора HSI
HSION — то же самое, что и HSEON, только для встроенного RC-генератора HSI
Clock configuration register (RCC_CFGR)
Рис. 2. Биты регистра CFGR
Описание основных битов регистра:
MCO — подача тактового сигнала на MCO-пин микроконтроллера.
- 0xx: Функция отключена
- 100: Выбран System clock (SYSCLK)
- 101: Выбран сигнал с HSI
- 110: Выбран сигнал с HSE
- 111: Выбран сигнал с PLL, который поделен на 2
PLLMUL — коэффициент умножения PLL. Эти биты могут быть записаны программно только при отключенном PLL
- 0000: Входную частота PLL умножить на 2
- 0001: —//— на 3
- 0010: —//— на 4
- 0011: —//— на 5
- 0100: —//— на 6
- 0101: —//— на 7
- 0110: —//— на 8
- 0111: —//— на 9
- 1000: —//— на 10
- 1001: —//— на 11
- 1010: —//— на 12
- 1011: —//— на 13
- 1100: —//— на 14
- 1101: —//— на 15
- 1110: —//— на 16
- 1111: —//— на 16
Два последних значения соответствуют одинаковому коэффициенту умножения.
PLLXTPRE — Делитель частоты с HSE генератора перед подачей на PLL. Этот бит не может быть изменен, если PLL запущен. При установке в 1 частота HSE будет поделена на 2, если 0, то делитель отключен.
PLLSRC — Источник входной частоты PLL. Не может быть изменен, если PLL запущен.
- 0: частота HSI генератора поделенная на 2
- 1: частота HSE генератора. Делитель может быть выбран PLLXTPRE битом.
PPRE2 — Делитель шины APB2 prescaler
- 0xx: HCLK без деления
- 100: HCLK / 2
- 101: HCLK / 4
- 110: HCLK / 8
- 111: HCLK / 16
PPRE1 — Делитель шины APB1 prescaler. Частота шины APB1 не должна превышать 36 МГц.
- 0xx: HCLK без деления
- 100: HCLK / 2
- 101: HCLK / 4
- 110: HCLK / 8
- 111: HCLK / 16
HPRE — AHB prescaler
- 0xxx: SYSCLK без деления
- 1000: SYSCLK / 2
- 1001: SYSCLK / 4
- 1010: SYSCLK / 8
- 1011: SYSCLK / 16
- 1100: SYSCLK / 64
- 1101: SYSCLK / 128
- 1110: SYSCLK / 256
- 1111: SYSCLK / 512
SWS — Состояние переключателя тактирования системы. Устанавливается аппаратно и указывает на текущий источник тактирования.
- 00: HSI генератор используется как источник тактирования системы
- 01: HSE генератор используется как источник тактирования системы
- 10: PLL используется как источник тактирования системы
SW — Переключатель источника тактирования системы. Изменяется программно для выбора источника SYSCLK. Устанавливается аппаратно для принудительного переключения на HSI генератор переходе в режим Stop или Standby или в случае срыва генерации HSE, который используется в качестве источника SYSCLK (только если активна система CSS)
- 00: HSI выбран в качестве источника системного тактирования
- 01: HSE выбран в качестве источника системного тактирования
- 10: PLL выбран в качестве источника системного тактирования
Первая программа
CooCox
Выполняем пункт меню Project -> New
Указываем имя проекта:
Выбираем Чип:
В репозитории выбираем какие именно модули мы будем использовать:
Открываем main.c і набираем следующий код программы:
Компилируем (Project->Build)
При первой компиляции IDE может запросить указать местонахождение компилятора.
Надо корректно указать место, куда был установлен GCC.
После удачной компиляции заливаем программу в микроконтроллер. Эта программа будет мигать светодиодом на плате. Как залить программу в микроконтроллер мы рассматривали в предыдущей статье.
Если Вы будете заливать прошивку через UART с помощью UART-USB переходника, файл для заливки найдете в директории:
C:\CooCox\CoIDE\workspace\Example_GPIO\Example_GPIO\Debug\bin\Example_GPIO.bin
Если у Вас есть установленный ST-Link программатор, программу в микроконтроллер можно залить прямо с IDE (Flash -> Program Download).
Если при этом возникла ошибка «Error: Flash driver function execute error» Рекомендуется:
- Запустить STM32 ST-LINK Utility и выполнить Frimware update.
-
Скопировать файл STLinkUSBDriver.dll из папки
C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility
в папку
C:\CooCox\CoIDE\bin
после чего перезапустить CooCox IDE
Перечень проектов
Example_First_Programm — GPIO. Первая программа. Мигание светодиодом
Example_GPIO — GPIO. Пример работы с входами и выходами
Example_StepMotor — GPIO. Пример работы с шаговым двигателем 28BYJ-48
Example_Nokia5110 — GPIO. Remap. Пример работы с выходами
Example_WG12864A — GPIO. Пример работы с LCD дисплеем WG12864A (KS0108/KS0107)
Example_ADC — ADC. Простой пример работы с АЦП
Example_ADC_DMA — ADC. Работа с АЦП с использованием DMA
Example_ADC_Injected — ADC. Работа с АЦП с настройкой Injected каналов
Example_ADC_Temperature — ADC. Использование встроенного термометра
Example_ADC_Watchdog — ADC. Аналоговый Watchdog
Example_Sonar — EXTI. Пример работы с сонаром HC-SR04
Example_USART1 — USART. Пример простого терминала
Example_USART_DMA — USART. Отправка данных через последовательный порт с помощью DMA
Example_DFPlayerMini — USART. Пример работы с MP3 плеером DFPlayer Mini. Функция произнесения числа
Example_SysTick — Таймер. Системный таймер SysTick. Задержка на SysTick
Example_TIM_CLK — Таймер. Генерирование прерывания через равные промежутки времени
Example_TIM_Time — Таймер. Измерение времени между двумя событиями
Example_PPM — Таймер. Захват сигнала
Example_Encoder — Таймер. Работа с энкодером
Example_Encoder_IT — Таймер. Работа с энкодером
Example_PWM_LED — Таймер. PWM. Управление яркостью светодиода
Example_PWM_RGB — Таймер. PWM. Управление цветом RGB светодиода
Example_PWM_Servo — Таймер. PWM. Управление сервоприводом
Example_PWM_Sound — Таймер. PWM. Генерирование звука
Example_RTC — RTC. Пример работы с часами реального времени
Example_BKP — BKP. Пример работы с регистрами Backup registers
Example_FLASH — FLASH. Пример сохранения настроек во FLASH память
Example_Watchdog — Watchdogs. Пример использование IWDG и WWDG
Example_I2C_Master — I2C. Работа с шиной I2C на примере датчика атмосферного давления BMP280
Example_I2C_Slave — I2C. Работа с шиной I2C в качестве Slave устройства
Example_BMP280 — I2C. Пример работы с датчиком атмосферного давления BMP280
Example_MS5611 — I2C. Пример работы с датчиком атмосферного давление MS5611
Example_USB_Virtual_Com_Port — USB. Пример работы с USB. Виртуальный последовательный порт
Example_USB_Keyboard — USB. Пример работы с USB. Эмуляция клавиатуры и мышки
Example_USB_Mass_Storage — USB. Пример работы с USB. STM32F103 в качестве Mass Storage Device
Example_PWR_Sleep — PWR. Использование энергосберегающего режима SLEEP
Example_PWR_Stop — PWR. Использование энергосберегающего режима STOP
Example_PWR_Standby — PWR. Энергосберегающий режим Standby. Пробуждение от Wake Up Pin
Example_PWR_Standby_RTC — PWR. Энергосберегающий режим Standby. Пробуждение от RTC
Example_Bootloader — Bootloader. Пример собственного загрузчика
Example_BLDC — Управление бесколлекторным двигателем с датчиками Холла (Sensored Brushless)
Example_PMSM — Управление PMSM с датчиками Холла с помощью STM32
Смотри также:
- 1. STM32. Программирование STM32F103. Тестовая плата. Прошивка через последовательный порт и через ST-Link программатор
- 2. STM32. Программирование. IDE для STM32
- 3. STM32. Программирование STM32F103. GPIO
- 4. STM32. Программирование STM32F103. Тактирование
- 5. STM32. Программирование STM32F103. USART
- 6. STM32. Программирование STM32F103. NVIC
- 7. STM32. Программирование STM32F103. ADC
- 8. STM32. Программирование STM32F103. DMA
- 9. STM32. Программирование STM32F103. TIMER
- 10. STM32. Программирование STM32F103. TIMER. Захват сигнала
- 11. STM32. Программирование STM32F103. TIMER. Encoder
- 12. STM32. Программирование STM32F103. TIMER. PWM
- 13. STM32. Программирование STM32F103. EXTI
- 14. STM32. Программирование STM32F103. RTC
- 15. STM32. Программирование STM32F103. BKP
- 16. STM32. Программирование STM32F103. Flash
- 17. STM32. Программирование STM32F103. Watchdog
- 18. STM32. Программирование STM32F103. Remap
- 19. STM32. Программирование STM32F103. I2C Master
- 20. STM32. Программирование STM32F103. I2C Slave
- 21. STM32. Программирование STM32F103. USB
- 22. STM32. Программирование STM32F103. PWR
- 23. STM32. Программирование STM32F103. Option bytes
- 24. STM32. Программирование STM32F103. Bootloader
- STM32. Скачать примеры
- System Workbench for STM32 Установка на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Управление бесколлекторным двигателем постоянного тока (BLDC) с помощью STM32
- Управление PMSM с помощью STM32
Atolic TrueStudio – новая бесплатная среда для STM32
Ранее компания ST уже оказала широкую поддержку компании AC6 и разрабатываемой ею бесплатной среде System Workbench. После этого ST продолжила двигаться в схожем направлении и приобрела компанию Atolic, которая занималась разработкой среды TrueStudio.
С первого взгляда это кажется не вполне логичным, однако, понять этот шаг можно. Дело в том, что AC6 System Workbench изначально была некоммерческим проектом, и ее функционал, видимо, не до конца устраивал ST. Теперь у компании появился серьезный и в то же время «карманный» проект, в котором в первую очередь будут учитываться интересы STM32.
Совсем недавно ST объявила о своих планах развития TrueStudio. Для пользователей наиболее значимыми будут следующие изменения:
- В новых версиях TrueStudio останется возможность работы только с STM32;
- Поддержка старых лицензионных версий TrueStudioPro продолжится в течение 1 года;
- Новые версии TrueStudio станут бесплатными и будут обладать неограниченным функционалом TrueStudioPro.
Регистры в CMSIS
Во второй части мы учились подключать библиотеку CMSIS к IAR-у, сейчас нам понадобится этот проект, так как мы переходим к практике. Но перед этим немного поговорим о том, как устроено обращение к регистрам периферии в CMSIS.
Каждый экземпляр периферии является структурой, в которой находятся все регистры, относящиеся к данному устройству. Почти во всех случаях имя структуры совпадает с именем периферийного модуля. Для микроконтроллера STM32F103C8 все структуры периферийных модулей объявлены в файле stm32f103xb.h:
#define TIM2 ((TIM_TypeDef *)TIM2_BASE) #define TIM3 ((TIM_TypeDef *)TIM3_BASE) #define TIM4 ((TIM_TypeDef *)TIM4_BASE) #define RTC ((RTC_TypeDef *)RTC_BASE) #define WWDG ((WWDG_TypeDef *)WWDG_BASE) #define IWDG ((IWDG_TypeDef *)IWDG_BASE) #define SPI2 ((SPI_TypeDef *)SPI2_BASE) #define USART2 ((USART_TypeDef *)USART2_BASE) #define USART3 ((USART_TypeDef *)USART3_BASE) #define I2C1 ((I2C_TypeDef *)I2C1_BASE) #define I2C2 ((I2C_TypeDef *)I2C2_BASE) #define USB ((USB_TypeDef *)USB_BASE) #define CAN1 ((CAN_TypeDef *)CAN1_BASE) #define BKP ((BKP_TypeDef *)BKP_BASE) #define PWR ((PWR_TypeDef *)PWR_BASE) #define AFIO ((AFIO_TypeDef *)AFIO_BASE) #define EXTI ((EXTI_TypeDef *)EXTI_BASE) #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE) #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) #define GPIOE ((GPIO_TypeDef *)GPIOE_BASE) #define ADC1 ((ADC_TypeDef *)ADC1_BASE) #define ADC2 ((ADC_TypeDef *)ADC2_BASE) #define ADC12_COMMON ((ADC_Common_TypeDef *)ADC1_BASE) #define TIM1 ((TIM_TypeDef *)TIM1_BASE) #define SPI1 ((SPI_TypeDef *)SPI1_BASE) #define USART1 ((USART_TypeDef *)USART1_BASE) #define SDIO ((SDIO_TypeDef *)SDIO_BASE) #define DMA1 ((DMA_TypeDef *)DMA1_BASE) #define DMA1_Channel1 ((DMA_Channel_TypeDef *)DMA1_Channel1_BASE) #define DMA1_Channel2 ((DMA_Channel_TypeDef *)DMA1_Channel2_BASE) #define DMA1_Channel3 ((DMA_Channel_TypeDef *)DMA1_Channel3_BASE) #define DMA1_Channel4 ((DMA_Channel_TypeDef *)DMA1_Channel4_BASE) #define DMA1_Channel5 ((DMA_Channel_TypeDef *)DMA1_Channel5_BASE) #define DMA1_Channel6 ((DMA_Channel_TypeDef *)DMA1_Channel6_BASE) #define DMA1_Channel7 ((DMA_Channel_TypeDef *)DMA1_Channel7_BASE) #define RCC ((RCC_TypeDef *)RCC_BASE) #define CRC ((CRC_TypeDef *)CRC_BASE) #define FLASH ((FLASH_TypeDef *)FLASH_R_BASE) #define OB ((OB_TypeDef *)OB_BASE) #define DBGMCU ((DBGMCU_TypeDef *)DBGMCU_BASE)
RCC_CRHSEON
RCC->CR |= RCC_CR_HSEON_Msk;
RCC->CR |= (1 << RCC_CR_HSEON_Pos);
Сначала идет имя периферийного модуля, в нашем случае «RCC». Затем символ «->», после чего имя регистра «CR». RCC_CR_HSEON_Msk представляет собой вот такой #define:
#define RCC_CR_HSEON_Msk (1<<16)
HSEONCRRCC_CR_HSEON_Msk_MskRCC_CR_HSEON_Msk
#define RCC_CR_HSEON RCC_CR_HSEON_Msk
_Msk.
Второй случай выглядит аналогичным образом:
где
#define RCC_CR_HSEON_Pos 16
RCC_CR_HSEON_Pos_Pos
А как быть с параметрами, которые имеют несколько битов? К примеру в регистре CFGR мы хотим установить значение множителя PLL равное девяти, имеющее код 0111 (см. рис. 2 биты PLLMUL). Тут вот такое решение:
RCC->CFGR |= RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2; RCC->CFGR &= ~(RCC_CFGR_PLLMULL_3);
PLLMULPLLMUL
RCC->CFGR |= RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2;
RCC->CFGR |= (7 << RCC_CFGR_PLLMULL_Pos);
PLLMUL
Заключение
В заключение хочется отметить, что с выпуском микроконтроллеров STM32W108 пользователи получили платформу, обладающую повышенным уровнем надежности за счет резервирования тактовых генераторов, улучшенной схемы обработки ошибочных ситуаций на уровне ядра, наличия системного и пользовательского режима выполнения кода и имеющую низкий уровень энергопотребления в спящем режиме. Все это позволяет рекомендовать микроконтроллеры STM32W108 для использования в беспроводных приложениях, требующих высокого уровня надежности, в том числе тех из них, которые используют батарейное питание.