О радостях и трудностях первого знакомства с STM32 после AVR. Как я реализовывал простейшую задачу — передачу данных на ПК.


Имея некий опыт работы с AVR, хочется сравнить приехавшие контроллеры (которые по отдельности стоят 1.7$/шт) с близкими к ним по цене ATMEGA328 (1.4 $/шт).
ATMEGA328 STM32F103C8T6 Выигрыш, раз
Flash, кБ 32 64 2
ОЗУ, кБ 2 20 10
Максимальная частота, МГц 20 72 3.6
Скорость АЦП, kSPS 15 2*1000 (можно разогнать) 133

На фоне роста показателей производительности в 10-100 раз, Flash увеличилась всего в 2 раза. Причём, эти 64 кБ расходуются чуть ли не быстрей, чем 32 на AVR. Логично применять такие контроллеры там, где нужна высокая производительность, но нет кодоёмких алгоритмов… например, осциллограф.

Внешний вид отладочных плат:
image
Слева направо:
  • Arduino UNO (ATmega328P), 3.59$;
  • Наша плата, которую будем мучить (STM32F103C8T6), 4.97$;
  • Ещё одна отладочная плата на STM32F103C8T6, 3.92$;
  • Arduino Nano (ATmega328P), 2.232.56$.


Чем программировать


Сред программирования STM32 великое множество — IAR, Keil, Coocox… поначалу кажется, что это хорошо и точно найдёшь что-то подходящее. Потом приходит понимание как такой зоопарк образовался. Просто кто-то сделал не очень хорошую IDE. Остальные на это посмотрели и решили, что они могут сделать лучше. И сделали. В чём-то получилось лучше, в чём-то хуже. Почитав обзоры и попробовав IAR, остановился на Coocox.

Есть ещё одна программа — STM32CubeMX. Дело в том, что периферии в STM32 гораздо больше, чем в AVR. Инициализировать её гораздо сложнее. STM32CubeMX позволяет выбрать контроллер, потыкать мышкой и сгенерировать код инициализации. Даже если мы не хотим использовать этот сгенерированный код, в STM32CubeMX удобно посмотреть распиновку и схему тактирования, подобрать делители, множители и вручную их прописать в своём коде! Очень рекомендую всем начинающим!

STMStudio — программа позволяющая в реальном времени наблюдать значения переменных в МК.

В качестве программатора решил использовать дешёвый ST-Link V2 за 2.6$.
Подключается всё очень просто. Берём распиновку JTAG,


смотрим рисунок на ST-Link,


и соединяем выводы (ST-LINK -> JTAG):
  • GND -> Pin 20;
  • 3.3V -> Pin 1;
  • RST -> Pin 15;
  • SWCLC -> Pin 9;
  • SWDIO -> Pin 7.

Запускаем CoIDE, пишем
Blink
#include "stm32f10x.h"
int main(void)
{
	RCC->APB2ENR |= RCC_APB2Periph_GPIOC; // включаем тактирование порта
	GPIOC->CRH |= (0x3 << 20); // ставим частоту 50 МГц
	GPIOC->CRH &= (~(0xC << 20)); // переводим ногу в режим выхода тяни-толкай
	volatile long i = 0;
	while(1)
	{
		GPIOC->BSRR = GPIO_BSRR_BR13;
		for(i = 0; i < 1000*1000*5; i++){;};
		GPIOC->BSRR = GPIO_BSRR_BS13;
		for(i = 0; i < 1000*1000*5; i++){;};
	}
}

Не сильно сложней, чем в AVR, однако, занимает программа 2264 байта во Flash… Это при том, что на AVR весь код металлоискателя занимал меньше.
Ради интереса удалил весь код и скомпилировал пустую программу — 2176 байт.
Отключил STDLIB — 1476 байт.

компилируем, прошиваем… и всё сразу заработало! Безо всяких танцев с бубном! Даже внутрисхемный отладчик заработал! Запускаем STMStudio — и она работает. Строит графики переменных во время работы МК! На плате есть перемычки, но ничего переключать, чтобы запрограммировать/запустить МК не надо! Прям как с Arduino! Ну не может же быть всё так хорошо… да не может.

Начинаем делать осциллограф


В моих мечтах осциллограф должен был работать следующим образом:
Оба АЦП одновременно обрабатывают сигнал со скоростью 1-2 MSPS. Далее 2 варианта:
  1. Всё это в реальном времени передаётся на ПК по USB и там принимается решение о том, что с этим делать (запомнить, построить график, как-то обработать, ...);
  2. После каждого преобразования происходит прерывание. В обработчике прерываний мы принимаем решение: ждать ещё или начать запоминать данные (например, хотим чтобы сигнал на экране начинался с некого уровня, как в аналоговом осциллографе, или чуть раньше этого уровня). В этом же обработчике складируем данные в буфер и по его заполнению отправляем на ПК.

Оба эти варианта реализовать не удалось.
Первый потому, что я не смог запустить USB. Вернее смог только сгенерировав проект в STM32CubeMX. Но после экспорта его в CoIDE потребовалось перемычками менять загрузчик для программирования/работы, что не удобно. Поэтому от этого варианта отказался. Ну и вдобавок скорость USB всего 12 МБит/с. Данные на высокой скорости в реальном времени всё равно не влезут. Чтобы хоть как-то передавать данные на комп, подключил преобразователь USB <-> UART

купленный в своё время для программирования Arduino Pro Mini.

Второй вариант накрылся т.к. обработчик прерывания работает дольше, чем АЦП. Скорость ограничилась всего 340-500 kSPS, что в разы меньше ожидаемой.

Единственным рабочим высокоскоростным вариантом оказался такой: АЦП непрерывно работают, когда нам нужен замер, включаем DMA, ждём наполнения буфера, отключаем DMA и потихоньку передаём данные на ПК через USART. Этот вариант превзошёл все ожидания. МК можно разогнать так, что получается 9 MSPS с двух АЦП! Т.е. в 4.5 раза больше, чем по документации! При этом достаточно комфортно наблюдать сигнал частотой до 1 МГц. По сравнению с тем, что удалось достичь раньше на Arduino (10 kSPS) результат очень хороший — скорость увеличил в 900 раз!

Однако, с разгоном не всё так радостно. В дальнейшем, чтобы мог работать USB, частоту придётся снизить в 16/9 = 1.8 раз и тогда получится всего 5 MSPS.

Пока пытался разобраться с USB и прочей периферией осознал существенный недостаток этих контроллеров — очень мало информации в интернете. Если на AVR есть куча всего, то тут найти пример одновременной работы двух АЦП в режиме Fast interleaved оказалось не так просто.

В качестве генератора сигналов для теста осциллографа был выбран… Arduino UNO! Не потому что он хороший или ещё что… просто это очень быстро.
Написать 8 строк:
 void setup() {
  pinMode(2, OUTPUT);  
  long d = 10;
  for(;;){
    PORTD = 255;
    delayMicroseconds(d);
    PORTD = 0;  
    delayMicroseconds(d);
  }
}

void loop() {
  
}


Подключить USB + 1 проводок (чтобы 3.3 вольтный STM32 не умер от 5 вольтного сигнала, сигнал подан через резистор в 2 кОм) и готово!

Получилось следующее (под каждым изображением фотография этого же сигнала на экране аналогового осциллографа):


Период сигнала 0.9 мкс. 1 замер = 10 пикселей. На осциллографе 1 деление = 0.5мкс.




Период сигнала 10 мкс. 1 замер = 5 пикселей. На осциллографе 1 деление = 2мкс. Верхушки обрублены из-за превышения сигналом опорного напряжения АЦП.

Что дальше


В планах:
  1. Победить USB, чтобы отказаться от преобразователя USB <-> USART;
  2. Доделать аналоговую часть, чтобы диапазон входных напряжений был не 0 — 3.3 В, а более приличным;
  3. Сделать многоканальный режим;
  4. Реализовать управление с ПК;
  5. Сделать законченное устройство в корпусе.


В заключение обращаю внимание на два вскрывшихся недостатка STM32 по сравнению с AVR:
  1. Повышенный расход Flash памяти;
  2. Сложная инициализация периферии, которая усугубляется нехваткой материалов.

На случай, если кому понадобится: проект CoIDE и рисовалка графика на C#. Код везде сырой. Не знаю как, но на такую простую задачу, ушло 31 кБ Flash.
Схема отладочной платы (найти было не просто).

Комментарии (39)


  1. sergku1213
    03.10.2015 07:26

    Круто! Спасибо! Давно поглядываю на такие контроллеры…


  1. NikitosZs
    03.10.2015 11:20
    +1

    О, хоть кто-то тоже со мной согласен в том, что информации и примеров по STM не так много, особенно по STM8. Дважды уже пытался начать осваивать МК этой конторы, оба раза полный провал. Ваш рывок побудил начать третий раз!


    1. xedas
      03.10.2015 14:52

      Тоже к STM8 присматриваюсь, а именно вот к этой платке. На Ebay'e она за 1.15$ продаётся. Есть ещё вариант: отдельно МК + адаптер… получится 55 центов за комплект, но как-то страшно браться за пайку корпусов с таким шагом выводов (0.65 мм).


      1. alexk24
        03.10.2015 17:07
        +2

        Шаг 0,65 — это очень много и без проблем паяется после небольшой тренировки нормальным паяльником.
        Паял как-то FT232 — шаг 0.3 — на удивление тоже относительно просто.

        Вот отличное видео по пайке.


        1. eta4ever
          03.10.2015 19:51
          +1

          Да, без видео от DiHalt в деле пайки SMD редко обходится :)


          1. alexk24
            04.10.2015 10:35
            +1

            Ага. У меня иной раз складывается впечатление что он пол страны паять научил :-)


        1. DanilinS
          04.10.2015 09:52

          В принципе есть и в DIP корпусе. Например STM8S105K4. Но естественно очень ограниченный выбор.


          1. xedas
            04.10.2015 22:04
            +1

            DIP — очень дорого. Я ещё когда металлоискатель собирал решил, что лучше взять SOIC + переходник, чем покупать дорогущие DIPы.


        1. xedas
          05.10.2015 17:50

          Припаял МК к адаптеру, всё получилось:
          image
          Только нужен ещё микроскоп, иначе перемычки плохо вижу. Использовал фотоаппарат в режиме веб камеры.

          Написал Blink в IAR:
          #include "iostm8.h"
          
          int main()
          { 
            PD_DDR_bit.DDR3 = 1;  // Ножка PD7 конфигурируется на вывод
            PD_CR1_bit.C13 = 1;   // Выход типа Push-pull
            PD_CR2_bit.C23 = 1;   // Скорость переключения - до 10 МГц.
            
            volatile int i;
            for(;;){
              PD_ODR_bit.ODR3 = 1;
              for(i=0; i<0xffff; i++){};
              PD_ODR_bit.ODR3 = 0;
              for(i=0; i<0xffff; i++){};
            };
          }
          


          1. alexk24
            05.10.2015 20:00

            Поздравляю!

            По поводу перемычек — если они у вас образуются — вероятно вы используете слишком много припоя. Нужно минимум раза в полтора меньше.

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

            Самое грустное что приходилось паять — акселерометр LIS344ALH и гироскоп LYPR540AH — контактные площадки под корпусом шириной 0.25 через 0.25 мм. В первый раз удивился когда удалось вытравить плату ЛУТом, во второй когда после пайки оно заработало. На паяльную станцию с термофеном все никак не разорюсь. Вот видео подобного сумасшествия от DiHalt. После этого на пайку всего что имеет выводы выступающие за пределы корпуса смотрю с оптимизмом. :-)


      1. wormball
        03.10.2015 19:27

        Собственно, там никакого сверхъестественного мастерства не надо. Секретов два. Первое — это жало не «как у советского паяльника», а «вечное» скошенное под 45 градусов. http://ec.hakko.com/imgs/det/900M-T-K.jpg А второе — т. н. оплётка для снятия припоя (можно даже не покупать, а раздраконить дохлый USB-кабель). Одним движением припаиваем все ноги с одной стороны микросхемы. А когда всё припаяли, точно так же обрабатываем ноги паяльником, но уже через оплётку, на каковую собирается лишний припой. Ежели не очень щедриться с припоем, даже оплётка может не понадобиться. Ну или феном можно — там ещё проще, но есть риск перегреть.


        1. argz
          03.10.2015 21:30

          Паяю давно и LQFP и безвыводные LGA.
          ИМХО.
          Использовал оплетку для снятия припоя с ног только один раз и успеха не добился. Пришлось плату выбрасывать. С тех самых пор вооружился припоем толщиной в 0.5 мм. В одной руке паяльник, в другой — припой. И дозировать удобно и просто паяется.

          В конце почти каждого даташита есть график «Solder Reflow Profile», описывающий как правильно паять деталь, чтобы не перегреть.


          1. wormball
            04.10.2015 05:00

            > Использовал оплетку для снятия припоя с ног только один раз и успеха не добился.

            Быть может, паяльник был недостаточно правильной формы? Или оплётку забыли флюсом смочить? Ну и некоторые оплётки вообще припоем не смачиваются.

            > Solder Reflow Profile

            Ага, только им можно воспользоваться только тогда, когда мы можем измерить температуру микросхемы и точно её регулировать. Ни с паяльником, ни с феном этого не получится, только паяльная печь.


          1. wormball
            04.10.2015 05:07

            А ежели какая-то сопля не убирается, то можно на неё нанести побольше припоя, тогда есть неплохая вероятность, что «за компанию» впитается.


      1. eta4ever
        03.10.2015 19:43
        +2

        При должной сноровке паяльником с нормальным жалом (необгорающим) STM32F030F4P6 в TSSOP чудесно паяется.

        image

        Это же чудо стоит 55 центов за чип, поэтому для меня смысл использования в самопальстве STM8 ускользает.


      1. link0ln
        05.10.2015 14:15

        Покупайте сразу esp-14, еще и вафляй будет на борту :)


    1. RaJa
      14.10.2015 17:25

      Зачем вообще нужен STM8, если цена STM32 копеечная, а функционал не в пример выше?


      1. ploop
        14.10.2015 23:56

        Ну у STM8 есть некие вкусные аппаратные решения, например драйверы LCD со сверхнизким потреблением, логика управления двигателями, ещё что-то. Применение можно найти.


  1. yus1960
    03.10.2015 13:31
    +3

    STM рулит!


  1. AMDmi3
    03.10.2015 15:18
    +1

    А меня от изучения STM останавливает отсутствие свободного софта под *nix, в частности под FreeBSD, либо тот факт, что оный софт хорошо скрывается. Под AVR у меня из коробки есть avrdude (прошивальщик), avra (ассемблер), avr-{gcc,binutils,libc} (C тулчейн), под STM навскидку не нашёл ничего.


    1. eta4ever
      03.10.2015 19:40
      +4

      Эммм. Eclipse, к нему gnu arm toolchain, и софт для st-link тоже есть открытый. И GDB по-моему тоже цепляется. Это если про STM32. За 8 ничего не скажу.


      1. khabib
        03.10.2015 23:53
        +1

        Софт для st-link работает как gdb сервер (под линуксами). Для JTAG'ов разных есть OpenOCD (http://openocd.org/).


        1. eta4ever
          04.10.2015 01:37

          Спасибо. Просто я относительно полноценной работы с STM32 под Linux пока не развернул, ограничился изучением технической возможности. Ну и бинарники, в mbed сооруженные, прошивал.


      1. ploop
        04.10.2015 01:19

        За 8 ничего не скажу.

        Так а ничего и нет, на сколько знаю. Точнее не добавили его в GCC, а нет компилятора — можно забыть.


        1. eta4ever
          04.10.2015 01:42

          Беглое гугление показало, что есть какой-то вроде живой SDCC. Впрочем, я в это лезть как-то не очень хочу.


    1. KivApple
      04.10.2015 18:25
      +1

      Для ARM-микроконтроллеров есть порт GCC, так что как минимум компилятор свободный уже есть. Для прошивки через программатор StLink есть этот OpenSource-проект — github.com/texane/stlink. В отличии от avrdude умеет не только шить, но и запускать GDB-сервер для отладки через SWD. Для загрузки прошивки через USB bootloader есть свободная dfu-util. Для загрузки через UART bootloader тоже что-то есть. В качестве библиотек можно использовать официальные заголовочники от ST, но если не нравится есть libopencm3 и ChibiOS HAL. Или вообще открыть даташиты и писать чисто по ним.

      В общем, свободных инструментов достаточно для полного цикла разработки. Вот с STM8 есть беда — из компиляторов есть лишь SDCC, который значительно проигрывает GCC в качестве генерации кода, да и, кажется, там поддержка STM8 до сих пор экспериментальная.


    1. googol
      05.10.2015 05:22

      Все эти аналоги присутствуют и для ARM. В частности из Арчика надо установить arm-none-eabi toolchain www.archlinux.org/packages/?q=arm-none-eabi и stlink.

      В сети можно найти много hello world примеров для работы с тулчейнами без использования IDE.


  1. DanilinS
    03.10.2015 20:18
    +2

    Чипы STM32/STM8 вещь интересная, но:
    1) Мощная многорежимная периферия. Настройка часто бывает достаточно сложной и не всегда очевидной.
    2) Переход от AVR для новичков сложен. Особенно после очень долгого сидения на AVR.

    Для самопального осциллографа лучше взять из серии STM32F3:
    1) Ульта-быстрый 12-bit ADC с 5 MSPS на канал (до 18 MSPS в «Interleaved» режиме)
    2) USB 2.0 full speed interface. Несложно прикрутить USB 3.0.
    3) Несложно прикрутить быструю память.
    4) Более высокая тактовая позволяет быстро обработать данные. Меньше накладные расходы на реализацию USB.

    Быстро цифруем с быстрой заливкой в внешний чип памяти. Потом уже не торопясь сливаем через USB.


    1. DeXPeriX
      03.10.2015 20:54

      Возможно, у Вас уже есть на примете такие проекты осциллографов? Очень бы хотелось дёшево смотреть сигнал на 20 МГц.


      1. DanilinS
        04.10.2015 10:03

        Он есть, но в процессе разработки. Правда без внешней памяти. С использованием внутренней памяти.

        А дешево посмотреть сигнал на 20 МГц — задача очень сложная. Это тебе нужно около 60 MSPS ( не меньше). Чисто микроконтроллером это не взять. Необходима связка:
        1) (АЦП+ПЛИС+RAM) для захвата в память + логика триггеров.
        2) STM32 для внешнего обмена, индикации, кнопочек, экранчиков… При этом туда красиво можно вписать USB3300 USB HS PHY Board для реализации USB 2.0 Hi-Speed (25—480 Мбит/с)


        1. ploop
          04.10.2015 10:39

          Это тебе нужно около 60 MSPS

          Это чтобы увидеть наличие этих 20МГц. Чтобы рассмотреть — 200 msps


          1. DanilinS
            04.10.2015 12:09

            Все верно. 60 MSPS — это самый минимум.


      1. AlexeyStn
        04.10.2015 10:49
        +2

        Есть проект Neil Scope. У него полоса пропускания как раз 20 МГц и частота семплирования до 200 МГц. Там как раз связка из ADC+CPLD+RAM+MCU.


        1. googol
          05.10.2015 05:24
          +2

          Также имеется проект с открытой схематикой www.dreamsourcelab.com/dslogic.html


          1. eta4ever
            05.10.2015 14:22
            +1

            Интересный проект. Жаль, нельзя купить платы без корпуса, или еще как-то подешевле обойтись. И герберы они что-то зажали, или я плохо ищу.


            1. googol
              11.10.2015 08:55

              Герберы не выкладывали вроде. Но обещали еще давно что откроют. Не помешает спросить на их форуме на тот случай если забыли.


  1. jar_ohty
    04.10.2015 22:49
    +2

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


  1. paranoik
    07.10.2015 11:11

    Мало что в этом понимаю, т.к. пока играюсь только с ардуинкой, но удивлен отсутсвием упоминания проекта miniscope, вот тут http://tomeko.net/miniscope_v2c


    1. DanilinS
      11.10.2015 11:30
      +2

      Таких проектов море. Ничего интересного. Всего 500 kSps. Любой за 30 минут напишет.
      Ради интереса ( разминки пальцев ради )
      1) Открыл mikroPascal PRO for ARM. Создал простой проект. Добавил 2 стандартные библиотеки «ADC Library» и «USB Library»
      2) Написал 2 строчки. Инициализация ADC и USB.
      3) В основном цикле читаем ADC и кидаем в USB. 4 строки.
      4) Слегка дорабатываем напильником для получения законченного проекта.

      Уложился в 5 минут. А смысл? Рядовая тривиальная не интересная программа.

      Глубокое изучение железа автором статьи с целью выжать «максимум» — это похвальное желание. 9 MSPS от STM32F103C8T6 — за такое автору респект и уважение.