STM32 против Arduino

  Давайте спорить о вкусе устриц и кокосовых орехов с теми кто их ел…   М. Жванецкий

А началось с того, что один наш соратник прикупил в Поднебесной вместо Arduino Nano чуть-чуть другой модуль — STM32F103C8T6.
То ли он перепутал, то ли китайцы, —  теперь уже не важно. Хотя если смотреть на платы и их цены «невооруженным» взглядом, действительно немудрено перепутать.

STM32F103C8T6-DEV-BOARD-1

STM32

5робот

Arduino Nano

В общем взял я у него на «поиграться» и реально был удивлен. О чем хочу поведать читателям в этом посте.

Для начала сравним характеристики:

Характеристики                              STM32F103C8T6     Arduino Nano
Частота контроллера, МГц                             72                      16
Память программ, кБайт                                64                      32
Питание, В                                                        3.3                      5
ОЗУ, кБайт                                                        20                       2
USB 2.0                                                              да                       нет
DMA                                                                   да                       нет
CAN                                                                    да                       нет
RTC                                                                    да                       нет
UART                                                                   3                        1
Прошивка через USB                                       нет                      да
Цена, $                                                              2.1                      1.8

Как результат —  имеем  замечательный микроконтроллер по цене чуть дороже Arduino. Но почему STM32 не получил такого распространения? Почему в Интернете так мало проектов и примеров использования?

Первым аргументом, объясняющим эту несправедливость является сравнительно небольшое время существования серии STM32 по сравнению с Arduino. Ну тут без комментариев.

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

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

На самом деле программатор можно и не использовать — смотрим, как прошить STM32 через дешевый китайский переходник USB-COM FTDI232. Типа такого — FT232RL FTDI USB 3.3 В 5.5 В для TTL

Как видите, в программаторе уже предусмотрен переключатель 5 — 3,3 вольт (напомню STM32 питается в диапазоне 2,5-3,6 вольт). Не забудьте его выставить в нужное положение. Соединяем выводы питания переходника с соответствующими выводами платы STM32 —  на фото розовый и коричневый провод. А вот выводы RX и TX соединяются с выводами последовательного порта платы — А9 и A10 соответственно. На фото оранжевый и розовый.

aLtCedx

После соединения обратите внимание на два желтых переключателя на борту отладочной платы микроконтроллера. Они определяют режим работы STM32. При таком режиме как видите на фото контроллер исполняет команды своей прошивки из памяти программ. Для переключения в режим «прошивки» дальний от кнопки «reset»  переключатель надо поставить в противоположное положение и нажать «reset». Не забудьте вернуть его обратно после прошивки и опять перегрузить контроллер для начала выполнения программы.

Подготовим тестовую прошивку для тестирования процесса программирования. Конечно же это будет классический «blink». Причем пока без использования таких «наворотов» STM32 как таймеры и прерывания. Моргать будем встроенным в отладочную плату светодиодом, который присоединен к 13 пину порта GPIOC.

Установим программу EmBitz как наиболее простую среду программирования для STM32 — не буду описывать детально — для этого есть Google, и загрузим в нее тестовую программу (так и тянет сказать скетч 🙂  )

#include <stm32f10x_conf.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#define RCC_GPIO RCC_APB2Periph_GPIOC
#define LED_PORT GPIOC
#define LED1_PIN GPIO_Pin_13
void Delay(volatile uint32_t nCount) {
for (; nCount != 0; nCount--);
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_GPIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( LED_PORT , &GPIO_InitStructure);
while (1) {
LED_PORT->ODR ^= LED1_PIN;
Delay(0xfFF00);
}
return 0;
}

 

 

С содержимым программы мы разберемся в другой раз, а пока скомпилируем ее, найдем hex файл и приступим к процессу прошивки. Для прошивки используем утилиту Flash Loader Demonstrator.

Запустим эту утилиту.

Выбираем нужный COM порт, скорость 115200 и !Внимание! паритет ставим в значение Even.

FlashLoaderDemonstrator

Если все прошло успешно уведите зеленый «сфетофор».

FlashLoaderDemonstrator1

Проверяем настройки контроллера:

FlashLoaderDemonstrator2

Указываем путь к нашему hex файлу:

FlashLoaderDemonstrator3

Результатом прошивки будет такой экран:

FlashLoaderDemonstrator4

Теперь переставляем желтую перемычку, как я говорил выше и наслаждаемся ритмичным морганием светодиода на плате!!!

У меня моргает — см. фото выше 🙂

 

Теперь в чем лично я вижу выгоду для себя от использования STM32:
— Питать устройства на STM32 можно от 3 вольт и процесс перевода в «спящий» режим достаточно прост, что позволяет питать от автономного источника (батарей), а также снимает вопросы с согласованием уровней с ESP8366 при проектировании устройств для Интернет-Вещей. (IoT);

— У современных заказчиков сформировалось стойкое мнение, что Arduino — это детская игрушка и для более-менее серьезных проектов она не пригодна. Выход для разработчика — используем в проекте STM32;

— Разобраться начинающему программисту микроконтроллеров с STM32 немного сложнее чем с AVR, но это того стоит.

 Ближайшие планы:

На базе платы STM32 и ESP8266 сделать универсальную конструкцию для устройств Интернета вещей. (IoT)

Полезные ссылки:

STM32F103C8T6 datasheet

Комментируем…

P.S. Присоединяйтесь к нашей группе в FaceBook — самые свежие новости о 3D технологиях, жаркие обсуждения животрепещущих вопросов и раздача бесплатных 3D моделей.
Посмотрите так же...
11 комментариев
  1. Billy:

    Замечательно! Пора мне смахнуть пыль с подобного устройства. А слабо автору связать STM с индикатором? Ну например с тем, что описан в статье за 20 января?
    http://smart-el.ru/?p=687

  2. Martin:

    Отличие между стмкой и ардуинкой как между лего и картонными кубиками. то есть на стмке можно собрать чтото более тонкое и изящное, но нужно реально подолбаться. на ардуине можно быстро нагородить некое сооружение, а потом убеждать Заказчика, что ему именно это и ндо было :))))) ИМХО

    • Vlad:

      Не согласен.
      Каждому устройству свое место. Зачем городить огород на STM если клиенту надо просто засветить пару линеек трехцветных светодиодов? Это быстро и просто сделает ардуинка.
      А вот если надо что-то более тонкое и изщьное — как пример, есть у меня тут пример насоса на ардуинке, так вот — как оно тупит межу выводом на экран и степами на ШД с задержками. А это простецкая задача, и не сильно нагруженная, но присутствие на STM таймеров (и не одного), делает то, на чем ардуинка начинает скрипеть…. И это только таймеры, а на STM есть много вкусного и неисследованного:)
      Так что — ардуине — ардуинованое, а СТМу — стмовое!

    • Vlad:

      В догонку — в статье автор, чисто по Ардуиновски «моргнул» светодиодом. Задать параметры, зажечь, подождать, интерпретировать и далее.
      А вот вам решение, что на Ардуине не то что бы не решить, решить можно но не так изящно:
      #include
      #include
      #include
      #define RCC_GPIO RCC_APB2Periph_GPIOB
      #define LED_PORT GPIOB
      #define LED1_PIN GPIO_Pin_7
      #define LED2_PIN GPIO_Pin_6

      void TIM2_IRQHandler(void) //Функция обработчика прерывания от таймера 6
      {
      TIM2->SR &= ~TIM_SR_UIF; //Сбрасываем бит вызова прерывания.
      LED_PORT->ODR ^= LED2_PIN;//Инвертируем состояние вывода — зажигаем/гасим светодиод
      LED_PORT->ODR ^= LED1_PIN;
      }

      void Delay(volatile uint32_t nCount) {
      for (; nCount != 0; nCount—);
      }

      int main(void) {
      NVIC_SetPriority(TIM2_IRQn, 1); //Приоритет прерывания
      NVIC_EnableIRQ(TIM2_IRQn); //Разрешаем обработку прерывания от таймера 2
      RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;//Тактирование таймера TIM2
      TIM2->PSC = 23999;//Настройка предделителя таймера
      TIM2->ARR = 1000;//Загружаем число миллисекунд в регистр автоперезагрузки
      TIM2->DIER |= TIM_DIER_UIE; //Разрешаем прерывание при переполнении счетчика
      TIM2->CR1 |= TIM_CR1_CEN;//Запускаем счет
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_GPIO, ENABLE);
      GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( LED_PORT , &GPIO_InitStructure);
      LED_PORT->ODR ^= LED2_PIN;
      while (1) {}
      return 0;
      }

  3. modus:

    Ардуина хороша тем что не надо думать за регистры и библиотеки.

  4. Евгений:

    Вот когда проект для CNC контроллера на STM появиться, тогда ее преимущества станут очевидны, но тогда лучше бы она была 5 вольтовая TTL совместимая. ИМХО
    Если например GRBL перенесут на нее, я первый пойду ее покупать… )

  5. Andrey:

    Ардуина то-попроще, но stm32f103c8t6 и attiny2313 стоят одних денег = так что выбрать лучше?

  6. admin:

    На вкус и цвет, как говорится, все фломастеры разные… У Attiny, на мой взгляд более простая среда разработки. У stm32f103c8t6 да и у любого STM32 на борту больше возможностей, но GRBL для нее нет пока. Arduino имеет готовую обвязку, не требует разработки и заказа печатной платы. Так что — кому что нравится.

  7. Владимир:

    Спасибо автору за статью, но с одной оговоркой. Прошивать все же лучше St-Link -ом, стоит он 2$ и прекрасно подходит к этой плате. Шьется по SWD по двум проводам + 2(питание). Писать программы и шить мне нравится в IDE Keil. В Keil-е есть отличный симулятор и возможность отладить программу прямо в железе. Keil программа платная, но авторы этого продукта позволяют бесплатно собирать код до 32Кб. для небольших, но полезных программ этого вполне достаточно. В ардуино действительно все просто, и без лишних усилий, но когда нужно собрать все в кучу, например выводить по I2C на дисплей, читать с датчика температуру, а еще обрабатывать поток а UART-а, то ардуино отказывается корректно работать. И тут нужно напреч обленившийся мозг, начать изучать как в ардуино работать с прерываниями и лезть все в те же регистры. Так что же лучше тогда…вопрос. Еще один мой хороший друг сказал очень правильную фразу: ардуино для тех КТО НЕ ЛЮБИТ ПРОГРАММИРОВАТЬ.

  8. RomanPhith:

    Как хорошо, что наткнулся на ваш сайт, очень много информации почерпнул

  9. Андрей:

    Автору лайк!После своего проекта «частотмер до 10МГц с точностью 1Гц» обнаружил, что к ATMega8 нужно прикручивать внешний 32-битный счетчик.Не хватало разрядности у таймера 1 и быстродействия.Писал код на С.Промучившись, выкинул все эти АВРки и прешел (с трудом) на STM32.Написал код под CMSYS так как про библиотеки HAL STDPeriph ходят плохие слухи в сети.Драйвер дисплея от Нокиа1102 + сама программа + термостат с цифровым фильтром для датчика температуры — ВСЕ ЭТО ВЛЕЗЛО.Но таймеры все заняты.С AVRдуиной этого в принципе сделать бы не удалось, разве светодиодом помигать или таймер сделать.

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

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