Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

STM32 - замена Arduino

Форум самогонщиков Автоматика
1 2 3 4 ... 6 1
Mnz Магистр Город 254 86
19 Марта 18, 01:19
Во многих проектах автоматизации наших задач мы часто используем платы Arduino (Uno, Nano, Mega, Mini и др.). Почти во всех них применен микроконтроллер ATmega328 семейства AVR.
Я также раньше собирал конструкции на этих платах, но потом решил попробовать arduino-подобную плату с микроконтроллером STM32F103C8T6
Фото платы
stm32f103c8t6_dev_board.jpg
Stm32f103c8t6_dev_board. STM32 - замена Arduino. Автоматика.
Основные возможности микроконтроллера STM32F103C8T6
  • 32-ух битное ядро ARM Cortex-M3
  • Номинальная тактовая частота - 72 МГц (зависит от настроек тактирования и может быть как меньше, так и больше)
  • Производительность - 1.25 DMIPS/MHz (1.25 операции за такт)
  • Объем памяти программ - 64КБ (в действительности 128КБ)
  • Объем оперативной памяти - 20 КБ
  • Количество линий ввода/вывода - 37
  • Напряжение питания - 2.0 - 3.6В (номинальное 3.3В)
  • Возможность аппаратной отладки через интерфейсы JTAG и SWD
  • Встроенный загрузчик программ через USART1
  • 4 16-ти разрядных таймера (с 16-ти разрядным предделителем) по 4 канала сравнения в каждом, что позволяет в итоге получить до 16 каналов 16-ти битного ШИМ
  • 2 сторожевых таймера
  • 24-ех битный системный тймер
  • 3 модуля USART
  • 2 модуля SPI
  • 2 модуля I2C
  • 2 модуля 12-ти битного ADC (АЦП) с производительностью 1 миллион выборок в секунду
  • Модуль CAN
  • Модуль USB
  • Модуль расчета CRC
  • Модуль RTC (часы реального времени)
  • 7-ми канальный модуль DMA (ПДП - прямой доступ к памяти)
  • Контроллер вложенных прерываний
После сборки нескольких конструкций, пришло понимание что Arduino с AVR микроконтроллером имеют очень ограниченные возможности и то что было сложно вместить в одну Arduino и приходилось разбивать проект на несколько arduino nano, относительно просто поместилось в МК STM32F103C8T6 у которого к тому же остались свободные ресурсы.
В интернете есть статьи на эту тему. https://geektimes.ru/post/277928/
https://geektimes.ru/post/255796/
https://geektimes.ru/post/263210/

Сперва я программировал STM32 в Arduino IDE как написано в статье, но быстро пришло понимание того что не используется вся мощь микроконтроллера, а она немалая по сравнению с AVR. Это более гибкая настройка портов и периферийных модулей, аппаратная отладка и др. Если сравнивать периферию, то разница очевидна. Например возможности таймеров http://robocraft.ru/blog/ARM/722.html
http://robocraft.ru/blog/ARM/739.html

Основные возможности таймеров
  • 16-битный счётчик с автоперезагрузкой.
  • 16-битный программируемый делитель частоты: с 1 по 65535.
  • Схема синхронизации для запуска ЦАП.
  • Генерация прерывания и/или запроса DMA по переполнению счётчика.

  • До 4-х каналов для:
  • Захвата сигнала (input capture).
  • Сравнения вывода (output compare).
  • Генерации сигнала ШИМ (выровненного по границе или по центру).
  • Генерации одиночных импульсов.

  • Схемы синхронизации для управления таймерами при помощи внешних сигналов и для соединения нескольких таймеров друг с другом.
  • Комплементарные выходы с программируемым dead-time.
  • Счётчик повторений.
  • Вход BRK для сброса выходов таймера или выставления их в известное состояние.
  • Поддерживают инкрементальные (квадратурные) энкодеры и датчики Холла.

  • Генерация прерывания или запроса DMA по следующим событиям:
  • Обновление: переполнение счётчика.
  • Событие-триггер: старт, остановка, инициализация счётчика или его обновление внутренним или внешним триггером.
  • Захват сигнала.
  • Сравнение (output compare).
  • Включение BRK.
Кто в теме и знает возможности таймеров в AVR думаю поймут какие преимущества дает STM32. И они не ограничиваются таймерами. Контроллер прерываний поддерживает так называемые вложенные прерывания и позволяет более приоритетному прерыванию, прервать выполнение менее приоритетного, что позволяет не пропустить и обработать важные прерывания. Во многих случаях вместо прерываний от периферии возможно использование DMA (по русски ПДП - прямой доступ к памяти) который копирует данные из периферии в память или наоборот. Таким образом можно принимать и передавать данные по интерфейсам USART, SPI, I2C и др. максимально быстро и без "лишних" прерываний.
Система тактирования намного гибче чем у ATmega328.
Тактирование STM32F103C8T6
clock.png
Clock. STM32 - замена Arduino. Автоматика.
Программно можно выбрать источник тактирования - внутренний RC генератор HSI или внешний кварцевый. Присутствует умножитель частоты и несколько делителей, которые позволяют индивидуально задать частоты тактирования различных блоков МК, таких как ядро, периферийные шины APB1 и APB2, блоки USB и ADC (АЦП). Этим можно программно управлять во время работы МК, а не как у AVR где конфигурация задается фьюзами при прошивке...
Предусмотрена защита от сбоев работы внешнего кварцевого генератора и в случае нестабильной работы или вовсе прекращения, тактирование автоматически переключается на встроенный RC генератор HSI.
В микроконтроллер встроены часы реального времени (RTC) с возможностью тактирования от внешнего кварца с частотой 32768 Гц или внутреннего RC генератора LSI. У МК имеется специальный вывод для подключения батарейки питающей часы при отсутствии основного напряжения.

Разрабатывать программу можно в Arduino IDE, но как я написал выше, при этом не совсем рационально используются ресурсы микроконтроллера. Гораздо лучше разрабатывать программу в одной из IDE для STM32, позволяющей использовать библиотеки функций от STMicroelectronics.
Сперва я выбрал mikroBasic который показался мне простым и понятным (просто знаю бейсик), но как выяснилось, это не намного лучше Arduino IDE. Затем пробовал Keil, TrueSTUDIO, CooCox, EmBitz и др.
Наиболее простая и понятная IDE для начала на мой взгляд это EmBitz. Это простая и логичная среда, которая добавляет в проект все необходимые файлы включая библиотеки CMSIS и SPL. Остается только открыть файл main.с и написать код программы. В других перечисленных IDE с этим сложнее.

Дистрибутив EmBitz можно скачать с официального сайта. Устанавливается как любая другая программа и особенностей нет.

Ряд окон, появляющихся при первом запускеНеобходимо выбрать первую строку с компилятором EmBitz.
embitz_compiler.png
Embitz_compiler. STM32 - замена Arduino. Автоматика.


Выбор файловых ассоциаций. Можно оставить вариант по умолчанию и файлы с EmBitz ассоциироваться не будут.
embitz_fileassociate.1.png
Embitz_fileassociate. STM32 - замена Arduino. Автоматика.

Чтобы начать разработку программы, следует создать проект.
Основные этапы создания проектаСначала нужно приступить к созданию проекта.
embitz_project_1.png
Embitz_project_1. STM32 - замена Arduino. Автоматика.


Следует выбрать тип микроконтроллеров STMmicro-ARM и нажать GO.
embitz_project_2.png
Embitz_project_2. STM32 - замена Arduino. Автоматика.


В следующем окне нужно задать имя проекта и место размещения на диске.
embitz_project_3.png
Embitz_project_3. STM32 - замена Arduino. Автоматика.


Далее выбирается компилятор и настраиваются конфигурации. Нужно оставить то что по умолчанию и перейти к следующему шагу.
embitz_project_4.png
Embitz_project_4. STM32 - замена Arduino. Автоматика.


После нужно выбрать семейство МК. В данном случае это Cortex_M3 поскольку такое ядро у STM32F103C8T6.
embitz_project_5.png
Embitz_project_5. STM32 - замена Arduino. Автоматика.


После выбираем серию STM32F10x.
embitz_project_6.png
Embitz_project_6. STM32 - замена Arduino. Автоматика.


Далее в списке нужно выбрать STM32F103C8 или STM32F103CB. Они отличаются только размером памяти программ (64 и 128 КБ), но поскольку реально в C8 содержится 128 КБ, то разницы нет что выбрать.
embitz_project_7.png
Embitz_project_7. STM32 - замена Arduino. Автоматика.


В завершении создания проекта появятся несколько окон настройки отладки. Нужно оставить по умолчанию и закрыть окна кнопкой OK.
embitz_project_8.png
Embitz_project_8. STM32 - замена Arduino. Автоматика.

После создания проекта можно начать работу, открыв файл main.с где есть минимально необходимая часть кода.
embitz_main.png
Embitz_main. STM32 - замена Arduino. Автоматика.


Проект можно скомпилировать и принеобходимости запустить отладку (на скриншоте показаны кнопки панели инструментов производящие эти действия). Выполнение программы начинается с функции main, точнее перед этим выполняется очистка оперативной памяти и настройка тактирования так чтобы при частоте внешнего кварцевого генератора 8 МГц, частота ядра была номинальной и составляла 72 МГц.
Подробнее о том как это происходитПроще всего отследить последовательность выполнения программы аппаратным отладчиком ST-Link или подобным. Следует соединить плату с отладчиком через интерфейс SWD, подключить отладчик к USB порту компьютера и запустить отладку в IDE (кнопка с перечеркнутым жучком в красном кружке справа на панели инструментов).
Если все сделано правильно, появится окно с таким содержимым.
embitz_init_1.png
Embitz_init_1. STM32 - замена Arduino. Автоматика.


А после в IDE откроется файл startup_stm32f10x_md.S в котором отобразится текущая выполняемая строка с ассемблерным кодом, выполняемым при старте или сбросе микроконтроллера.
embitz_init_2.png
Embitz_init_2. STM32 - замена Arduino. Автоматика.


Чуть ниже расположен вызов функции SystemInit.
embitz_init_3.png
Embitz_init_3. STM32 - замена Arduino. Автоматика.


Нажав на F11 на клавиатуре можно выполнить ассемблерную инструкцию и перейти в функцию (откроется файл system_stm32f10x.c).
embitz_init_4.png
Embitz_init_4. STM32 - замена Arduino. Автоматика.


В функции производится инициализация и конфигурация системы тактирования микроконтроллера. В этой же функции вызывается функция SetSysClock.
embitz_init_5.png
Embitz_init_5. STM32 - замена Arduino. Автоматика.


В ней вызывается одна из функций настраивающая умножитель на требуемую частоту, в данном случае SetSysClockTo72 для настроки на 72 МГц.
embitz_init_6.png
Embitz_init_6. STM32 - замена Arduino. Автоматика.


В функции активируется внешний кварцевый генератор HSE и если это произведено успешно, умножитель настраивается на коэффициент 9 что в итоге дает (при частоте резонатора 8 МГц) 8*9 = 72МГц. Кроме этого в функции включается буфер предварительной выборки из flash памяти для кеширования инструкций и настраивается латентность flash.
После окончания выполнения кода функции SetSysClockTo72 управление снова возвращается в файл startup_stm32f10x_md.S где после выполнения еще ряда действий (очистка оперативной памяти и др.) выполнение переходит в функцию main файла main.c.
embitz_init_7.png
Embitz_init_7. STM32 - замена Arduino. Автоматика.


По традиции, первая программа будет мигать светодиодом. На плате для этой цели предусмотрен светодиод подключенный к выводу PC13.
Код
#include "stm32f10x_conf.h"

void DWT_Init(void)
{   // Активация модуля TRACE
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    // Разрешение работы счетчика CYCCNT модуля DWT.
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}

// Задержка в циклах ядра.
void DWT_DelayCycles(uint32_t Cycles)
{
    uint32_t Counter = DWT->CYCCNT;
    while((DWT->CYCCNT - Counter) < Cycles);
}

int main(void)
{
    // Включение тактирования порта GPIOC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    // Настройка вывода PC13 выходом.
    GPIO_InitTypeDef Init;
    Init.GPIO_Pin = GPIO_Pin_13;        // Вывод 13.
    Init.GPIO_Mode = GPIO_Mode_Out_PP;
    Init.GPIO_Speed = GPIO_Speed_50MHz; // Предельная частота выхода.

    GPIO_Init(GPIOC, &Init); // Конфигурация GPIOC (PC13)

    DWT_Init();
    while(1)
    {
        GPIO_SetBits(GPIOC, GPIO_Pin_13);   // Логическая 1 на PC13.
        DWT_DelayCycles(72000000);          // Пауза 72 миллиона машинных циклов.
        GPIO_ResetBits(GPIOC, GPIO_Pin_13); // Логический 0 на PC13.
        DWT_DelayCycles(72000000);          // Пауза 72 миллиона машинных циклов.
    }
}
В функции main в первую очередь разрешается тактирование порта GPIOC. По умолчанию большинство периферии отключено и перед работой с ней, ее нужно включить.
Далее создается и заполняется структура Init, а затем вызывается функция GPIO_Init для того чтобы настроить вывод PC13 в режим выхода. В цикле while изменяется состояние выхода PC13 что приводит к периодическому включению и выключению светодиода.
Задержка выполняется используя 32-ух битный счетчик CYCCNT блока DWT являющегося частью модуля аппаратной отладки ядра ARM Cortex-M3. Счетчик хорош тем что 32-ух битный что позволяет простыми средствами организовывать довольно большие и точные паузы.
Прошив эту программу в микроконтроллер, можно наблюдать за тем как будет периодически мигать светодиод. Прошить можно через отладчик ST-Link или встроенный Bootloader. Как это сделать написано в статье http://www.avislab.com/blog/stm32_st_link_ru/

Теперь произведем отладку этой программы. К боковому разъему SWD платы следует подключить аппаратный отладчик ST-Link.
Это выглядит так
stm32_st_link.jpg
Stm32_st_link. STM32 - замена Arduino. Автоматика.
Далее подключаем отладчик к USB порту компьютера и запускаем отладку в IDE (кнопка с перечеркнутым жучком в красном кружке справа на панели инструментов). Перед этим обязательно в выпадающем списке на панели инструментов должна быть выбрана конфигурация Debug и скомпилирован проект, потому что при выборе конфигурации Release из-за оптимизации кода будет нарушено соответствие номеров строк кода и скомпилированной прошивки.
По умолчанию выполнение программы начнется с ассемблерного файла startup_stm32f10x_md.S поскольку в нем располагается код выполняющийся сразу после сброса. Это не всегда удобно и чтобы отладчик останавливал программу (устанавливал скрытую точку останова) в начале функции main, следует открыть окно Debug interfase options (меню Debug -> Interfases) и для конфигурации Debug отметить Run to main().
debug_interfase_options.png
Debug_interfase_options. STM32 - замена Arduino. Автоматика.


Отладка программыПосле запуска отладки программа в микроконтроллере начнет выполнятся под управлением отладчика и автоматически будет остановлена на первой строке кода в функции main. Желтая стрелка между номерами строк и кодом, показывает текущую выполняемую строку.
embitz_debug_1.png
Embitz_debug_1. STM32 - замена Arduino. Автоматика.


Если несколько раз нажать на кнопку F10 дойдя до функции GPIO_Init и навести курсор мышки на структуру Init, то можно увидеть ее тип, адрес в памяти и содержимое полей.
embitz_debug_2.png
Embitz_debug_2. STM32 - замена Arduino. Автоматика.


Более подробно о назначении кнопок клавиатуры, используемых при отладке можно увидеть в меню Debug.
embitz_debug_3.png
Embitz_debug_3. STM32 - замена Arduino. Автоматика.


Далее нажимая кнопку F10 можно дойти до цикла while и при выполнении функции GPIO_SetBits светодиод будет гаснуть, а при выполнении GPIO_ResetBits начинать светится.

Сборка проекта и заливка прошивки в микроконтроллерВ списке конфигураций на панели инструментов нужно выбрать Release и пересобрать проект.

compile.png STM32 - замена Arduino
compile.png STM32 - замена Arduino. Автоматика.


При отсутствии ошибок внизу окна будет показана информация о сборке.

compile_log_2.png STM32 - замена Arduino
compile_log_2.png STM32 - замена Arduino. Автоматика.


Размер прошивки составил 824 байта и не используется оперативная память, точнее используется только под стек (по умолчанию 256 байт).
Прошивка находится в папке проекта в \bin\Release\ и имеет расширение hex. Ее можно залить в микроконтроллер программой FlashLoader (через встроенный загрузчик) или программой STM32 ST-LINK Utility через отладчик ST-Link. Про оба способа достаточно подробно написано на сайте http://www.avislab.com/blog/stm32_st_link_ru/


Литература.
Обучающие статьи по теме STM32.
http://www.avislab.com/blog/stm32-list_ru/
http://narodstream.ru/programmirovanie-mk-stm32/
http://www.pvsm.ru/cat/stm32
http://microtechnics.ru/.../stm32-s-nulya/

Программы EmBitz, STM32 ST-LINK Utility, flash loader, драйверы и прошивка для ST-Link, документация на микроконтроллер STM32F103C8T6 и т. д. https://yadi.sk/d/UXQjAEMK3TYSUJ
STM32F103C8T6_DevBoard.jpg
STM32F103C8T6_DevBoard.jpg STM32 - замена Arduino. Автоматика.

STM32F103C8T6.pdf 1.9 Мб
Мартин М. Инсайдерское руководство по STM32.pdf 3.7 Мб
STM32F103C8T6.zip 304.1 Кб
Mnz Магистр Город 254 86
Отв.1  28 Марта 18, 00:25
В предыдущем сообщении упоминал что для STM32 можно писать прошивки в ArduinoIDE. Расскажу подробнее об этом, а выводы насколько это целесообразно делайте сами.
О том как подготовить ArduinoIDE для работы с STM32 написано здесь https://geektimes.ru/post/277928/
Если кратко, то нужно скачать архив отсюда Вверху страницы над списком файлов и папок находится зеленая кнопка Clone or download ее нужно нажать, а затем скачать файлы кликом по Download ZIP. Скачается архив и необходимо из него скопировать папку Arduino_STM32-master в папку hardware (у меня она находится в C:\Program Files (x86)\Arduino\).
Нужно еще скачать компилятор для ARM, для чего следует открыть менеджер плат и установить пакет для Arduino SAM Boards (32-bit Cortex-M3).
После этого нужно выбрать плату Generic STM32F103C.

generic_stm32f103c.png
Generic_stm32f103c. STM32 - замена Arduino. Автоматика.


В меню ниже нужно выбрать такие же параметры как на скриншоте, то есть частоту 72 МГц, загрузку прошивки через ST-Link (но если хотите можно загружать через arduino-загрузчик) и уровень оптимизации -O2 LTO, при котором получаются прошивки с оптимальным соотношением размер/скорость выполнения.

Напишем простой скетч мигающий светодиодом на плате.
void setup() {
 pinMode(PC13, OUTPUT);      // initialize digital pin PC13 as an output.
}

void loop() {                 // the loop function runs over and over again forever
 digitalWrite(PC13, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);                // wait for a second
 digitalWrite(PC13, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);                // wait for a second
}
Он не отличается от тех что для Arduino Nano или Mega с AVR процессором, что несомненно плюс и упрощает перенос существующих проектов на STM32.
Для прошивки скетча в плату, подключаем ее к ST-Link, а его к компу и поступаем как обычно при заливке скетчей, то есть в меню Скетч нажимаем Загрузка и ждем ее окончания.

Если не будет ошибок, тогда получим такой лог
Скетч использует 11772 байт (8%) памяти устройства. Всего доступно 131072 байт.
Глобальные переменные используют 2800 байт (13%) динамической памяти, оставляя 17680 байт для локальных переменных. Максимум: 20480 байт.

STM32 ST-LINK CLI v2.1.0
STM32 ST-LINK Command Line Interface
ST-LINK Firmware version : V2J28S7
Connected via SWD.
SWD Frequency = 1800K.
Connection mode : Normal.
Device ID:0x410
Device flash Size : 64 Kbytes
Device family :STM32F10xx Medium-density

Loading file...
Flash Programming:
 File : sketch_mar24a.ino.bin
 Address : 0x08000000
Flash memory programming...
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± 0%
0%ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ 65%ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ 100%
Flash memory programmed in 1s and 919ms.
Programming Complete.

MCU Reset.

Application started.
Из него следует что прошивка имеет размер 11772 и для работы требует 2800 байт ОЗУ.
Строки ниже в логе информируют о процессе заливки прошивки и о ее успешном запуске. И правда, по окончанию прошивки светодиод замигал. Но размер прошивки на мой взгляд слишком велик. 11.5 КБ для простейшего скетча это слишком много, особенно сравнивая 824 байт в предыдущем сообщении, где программа скомпилирована в IDE EmBitz, что примерно в 10 раз больше. Как потом выяснилось, в прошивку добавляется USB загрузчик. Поскольку я загружаю прошивку через ST-Link, он мне не нужен и я его отключил в файле boards.txt находящемся в hardware\Arduino_STM32-master\STM32F1\.
В файле нужно строку
genericSTM32F103C.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER
заменить на
genericSTM32F103C.menu.upload_method.STLinkMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG
Это исключит загрузчик из прошивки и уменьшит ее размер примерно в два раза, до 5952 байт. Но все равно это много по сравнению с 824 байтами.


Теперь немного усложним задачу и сделаем термометр (пригодится для наших задач).
Дисплей 1602 по I2C (микросхема PCF8574A) подключается к B6 - SCL и B7 - SDA.
Датчик DS18B20 подключается к B10. Также между B10 и 3.3v нужно поставить резистор на 2 килоома.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWireSTM.h>

// Set the LCD address to 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);

OneWire ds(PB10); // Датчик подключен к PB10.

void setup()
{
 // initialize the LCD
 lcd.begin();
 // Turn on the blacklight and print a message.
 lcd.backlight();
 lcd.clear();
}

void loop()
{
 byte i;
 byte data[10];
 int16_t celsius;
 
 ds.reset();
 ds.write(0xCC, 1);
 ds.write(0x44, 1);
 delay(1000);
 ds.reset();
 ds.write(0xCC, 1);
 ds.write(0xBE, 1);

 for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();
 }
 int16_t raw = (data[1] << 8) | data[0];
 celsius = raw / 16;
 
 lcd.clear();
 lcd.print("Temp = ");
 lcd.print(celsius);
 
}
Результат компиляции.
Скетч использует 11232 байт (8%) памяти устройства. Всего доступно 131072 байт.
Глобальные переменные используют 2176 байт (10%) динамической памяти, оставляя 18304 байт для локальных переменных. Максимум: 20480 байт.
Для сравнения написал аналогичную программу в EmBitz.
#include "stm32f10x_conf.h"
#include "HD44780_I2C.h"
#include "DWT_Delay.h"
#include "USART_OWire.h"

int main(void)
{
   uint8_t i;
   uint8_t data[10];
   char str[4]={0, 0, 0, 0};
   int16_t celsius;

   SystemCoreClockUpdate(); // Определение текущей частоты ядра.

   LCDI2C_init(0x3F,16,2); // Инициализация дисплея.
   LCDI2C_backlight();
   OW_Init();              // Инициализация библиотеки OWire.


   while(1)
   {
      OW_Reset();
      OW_WriteByte(0xCC);
      OW_WriteByte(0x44);
      DWT_Delay_ms(1000);
      OW_Reset();
      OW_WriteByte(0xCC);
      OW_WriteByte(0xBE);

       for ( i = 0; i < 9; i++)
       {
           OW_ReadByte(&data[i]);
       }

       int16_t raw = (data[1] << 8) | data[0];
       celsius = raw / 16.0;

       str[2] = (celsius % 10) + 0x30; celsius /= 10;
       str[1] = (celsius % 10) + 0x30; celsius /= 10;
       str[0] = (celsius % 10) + 0x30;

       LCDI2C_clear();
       LCDI2C_write_String("Temp = ");
       LCDI2C_write_String(str);
   }
}
Результат компиляции.

compile_log_3.png STM32 - замена Arduino
compile_log_3.png STM32 - замена Arduino. Автоматика.


Размер прошивки 4628 байт и используется 184 байта ОЗУ, что в несколько раз меньше чем в ArduinoIDE.

Что использовать каждый решает сам, но думаю понятно что ArduinoIDE создает не очень оптимальный код и в ней отсутствует возможность отладки, что бывает полезным. Это относится не только к STM32, но и AVR.
-NMi- Студент Саранск 33 3
Отв.2  28 Марта 18, 06:39
К ардуино ещё можно прибавить невозможность сделать что-то "маштабное" т.к. сама платформа предназначена только для "одного" действия.
Например, первый таймер уже "занят" изначально.
STM32 - да, это очень круто, AVR конечно отдыхает... но и код для STM под силу не каждому.
CubeMX попробуйте, и компилятор любой от С или С+
Mnz Магистр Город 254 86
Отв.3  28 Марта 18, 12:15
У CubeMX нет совместимости между версиями. Обновился и проект может перестать собираться. Обратная совместимость вообще отсутствует. Проекты в предыдущих версиях не открываются.

Добавлено через 12мин.:

код для STM под силу не каждому.-NMi-, 28 Марта 18, 06:39
Скетч для Arduino мало чем отличается между AVR и STM32.
Z_h_e Доцент г. Чайковский 1.1K 310
Отв.4  28 Марта 18, 14:54
код для STM под силу не каждому.-NMi-, 28 Марта 18, 06:39
Это утверждение неверное, но многие так думают. В основном благодаря арудинам и калокубам(это прозвище не я придумал). Вообще, автокод ужаснейшая штука, пример как нельзя программировать.
Я когда впервые взялся за STM32, наверное два года назад, изначально тоже показалось прикоснулся к чему то божественному, недоступное смердам. Хотя перед этим уже почитал про ядро ARM, не помню какой cortex. Пробовал какие-то примеры из инета, в основном на библиотеках SPL. Хрень это все господа. Берете ДШ на МК, reference  manual , progamm manual (у STM документация разбита на несколько документов), читаете и STM32 превращается в обычный контроллер, у которого ядро ARM и богатейшая периферия.
Пример. Есть "страшный" DMA. Не знаю как на SPL или HAL его настраивать, не пробовал, но что-то подсказывает нужно опять проинициализировать специальную структуру константами определенными в той же библиотеке с длиннющими именами, про которые где-то еще надо почитать. А если открыть reference  manual, то окажается что регистров то для настройки с гулькин. Если утрировать, регистр адреса источника, регистр адреса приемник, регистр количества пересылаемых данных. Настроил, пнул и все само переслалось.

Какую мысль я хотел донести. Если ты прогаешь AVR или PIC или еще какой МК, не важно как хорошо или плохо, главное сам, то и STM32 тебе по зубам. Подумашь, что используешь 1% возможностей, какая разница, не вижу смысла брать МК впритык под задачу, ну кроме спортивного интереса. Вон STM32F030 вообще одни бакс стоит, а сколько стоит AVR с похожими возможностями?

Мне еще 8битный STM8 понравился. Стоит рублей 25. Периферия очень похожая на STM32, попроще конечно. Система команд заточена под Си. Где-то пример видел, как условный оператор if с парочкой операндов компиллится в пару команд. В общем прикольный МК, только порты на малый ток рассчитаны 12мА вроде или 11.
Mnz Магистр Город 254 86
Отв.5  28 Марта 18, 15:07, через 14 мин
калокубам(это прозвище не я придумал).Z_h_e, 28 Марта 18, 14:54
dosikus?

Вон STM32F030 вообще одни бакс стоитZ_h_e, 28 Марта 18, 14:54
STM32F030F4P6 по $0.40 покупал (партия от 10 штук).
-NMi- Студент Саранск 33 3
Отв.6  28 Марта 18, 15:25, через 18 мин
Мне еще 8битный STM8 понравился.Z_h_e, 28 Марта 18, 14:54
Хотел давно STM8 прогать, но нет компиляторов халявных.
Z_h_e Доцент г. Чайковский 1.1K 310
Отв.7  28 Марта 18, 15:35, через 11 мин
dosikus?Mnz, 28 Марта 18, 15:07
Ну если не он придумал, то актвино пользуется Улыбающийся
Хотел давно STM8 прогать, но нет компиляторов халявных.-NMi-, 28 Марта 18, 15:25
Как это нет. От производителя ST Visual Develop. Но я в нем на асме только пробывал. IAR отличный компилятор, до 8КБ кода бесплатен, а у STM8S103F3 больше и нет.
Если религия позволяет, можно и ломанное что-то поискать.
-NMi- Студент Саранск 33 3
Отв.8  28 Марта 18, 15:46, через 11 мин
IAR требует лицензию, бесплатно. Отправил запрос уже давно - тишина.
Z_h_e Доцент г. Чайковский 1.1K 310
Отв.9  28 Марта 18, 15:47, через 1 мин
Я не помню как устанавливал, но как то просто.

Добавлено через 1мин.:

Что-то тоже с бесплатной лицензией.
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.10  28 Марта 18, 16:17, через 30 мин
Хотел давно STM8 прогать, но нет компиляторов халявных.-NMi-, 28 Марта 18, 15:25
sdcc есть.
Z_h_e Доцент г. Чайковский 1.1K 310
Отв.11  28 Марта 18, 16:33, через 16 мин
А в нем есть отладчик?
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.12  28 Марта 18, 16:35, через 2 мин
отладчик в компиляторе?)
Z_h_e Доцент г. Чайковский 1.1K 310
Отв.13  28 Марта 18, 16:45, через 11 мин
Ааа, это только компилятор. Думал может IDE какая.
Mnz Магистр Город 254 86
Отв.14  28 Марта 18, 23:04
Думал может IDE какая.Z_h_e, 28 Марта 18, 16:45
В качестве IDE может быть Code::Blocks http://expgu.ru/codeblocks-stm8/
Проделал все что написано на странице. Проект собрался, залился через ST-Link и светодиод замигал на плате.
STM8_Blink.zip 195.3 Кб
Sknar Новичок Хабаровск 3
Отв.15  29 Марта 18, 03:38
Здравствуйте, уважаемые форумчане!
Не смог пройти мимо своей любимой темы. Улыбающийся Позвольте, вставить свои 20 копеек.
Уже давно перешёл на СТМ32... ну, как перешёл... использую их по мере надобности.
Поскольку надобности обычно не велики, то и использую этого "монстра" не часто, и в основном по причине либо достаточного количества портов за небольшие деньги, либо за какие-нибудь "вкусные" особенности типа "часы реального времени". Вообще, для своих поделок использую 5 чипов:
аттини13 - при цене 13руб. (здесь и далее все цены с "али" при партии в 10 шт) и убогом количестве портов и памяти - для совсем простых автоматов: включить/выключить/отрегулировать.
STM8S103F3 - 26 руб., зато уже 20 лап, из них 16 - порты, и 8к памяти. Это мой любимый чип: при смешной цене его ресурсов хватает на 90% задач.
атмега8 - 36руб - использую когда чуть-чуть не хватает стм8. Купил их при случае много, сейчас, пожалуй не стал бы брать, т.к. редко бывает надо.
атмега328 - 80руб. - купить их была глупость, навеянная первыми ардуино-уно. Ну, раз уж есть - иногда ставлю, если атмега8 не справляется.
stm32f100c8- это сказка! При его цене на "али" в 60руб. 48 лап, из которых можно использовать как порты ввода-вывода 37шт и 64К памяти!
Ещё один раз использовал stm32f103c8t6 - за 70 руб. 100 лап, уйма памяти, от разнообразия переферии дух захватывает, и скорость 72МГц. Нужен он был исключительно, чтобы подключить СД-карту на её "родном" интерфейсе. Проект так и не закончил. Грустный

Теперь по теме форума: за последние лет 5-6 я сделал уже 3 версии автомата для перегонки спирта. Последнюю делал другу как раз на stm32f100c8. Этот автомат делает 3 вещи: отображает на цветном 2,2" дисплее 240х320 текущее состояние: температуры, давление, режим, статистку, время; управляет мощностью тэна (до 3 КВт, больше не проверялось), регулируя ее от 0 до 100% либо вручную, либо автоматом по удержанию рабочего давления в баке; и контролирует температуры бака, дефлегматора и колонны, в зависимости от двух последних открывает/закрывает клапан отбора. Ну, и писком призывает "оператора" в моменты когда пора начинать отбор голов после стабилизации и хвостов по окончанию процесса. В эти моменты клапан закрыт, и ни капли ценной жидкости не будет потеряно/испорчено. Улыбающийся Аппарат этот работает у друга уже год. Сам же я использую 2ю версию на атмега328, делает он примерно то же самое, но другие экраны ( у меня из 2: на одном 64х128 -графики изменений температур , на другом LCD2004 - текущие параметры), ну и работает он с 2-мя тэнами: на разгон включает оба, а потом мощность держит одним. Первая версия не сохранилась: была она на ардуино-мини, паял на макетной плате, тэны включались/выключались пускателями Улыбающийся)) Все 3 версии управлялись ИК пультами от старой аппаратуры.

Про все ужастики СТМ-ов скажу следующее: 1) да, мозг по началу вскипает, но это не на долго. Главное сделать небольшое усилие и начать, а потом всё становится понятным и логичным; 2) в качестве среды для СТМ32 я выбрал Кококс т.к. он бесплатен, (почти) самодостаточен, и имеет кучу библиотек. Для СТМ8 - Кейл, фриварной версии для моих 8к как раз хватает. Кстати, однажды наткнулся на статью, где автор описал как можно обойти это ограничение, записывая куски кода в память МК не единовременно, а частями: загнал, например в верхнюю часть памяти текстовые константы и подпрограммы, которые давно отлажены и не подлежат изменению (найти точки входа в них не составит большого труда), и работай далее только с нижними 8К. Если писать на АСМе, то можно и фирменным ИДЕ воспользоваться. 3) вот что действительно не для всех просто - это шаг ножек, у СТМ32в корпусе LQFP он 0,5мм. Мне из-за этого пришлось осваивать изготовление плат на плёночном фоторезисте: повозиться пришлось, но зато теперь по мере надобности любую (небольшую, одностороннюю) плату за час запросто сделаю, и в общем то, не дорого. Для желающих перейти на СТМ без освоения печати плат можно воспользоваться либо платами-адаптерами с LQPF в DIP (10 руб), либо готовыми демо-платами, но в этом случае, устройство получится дороже и крупнее.

Если интересуют вопросы по реализации моих проектов - пишите, отвечу/поделюсь.
-NMi- Студент Саранск 33 3
Отв.16  29 Марта 18, 07:01
Ещё один раз использовал stm32f103c8t6 - за 70 руб. 100 лап, уйма памяти, от разнообразия переферии дух захватываетSknar, 29 Марта 18, 03:38
Вот это ДА!!!
Блин...))) Чото я софсем заочковал... )))))))
Sknar Новичок Хабаровск 3
Отв.17  29 Марта 18, 12:08
Чото я софсем заочковал... )))))))-NMi-, 29 Марта 18, 07:01
Здря. Эт только по началу страшно. Улыбающийся Потому как чем дальше тем страшнее, как в сказке Улыбающийся))
Сделайте как я: начните с малого. Согласитесь- риск не большой: чип не дорогой, программатор - тоже, рубле

Добавлено через 19мин.:

й 110-120 обойдётся. Самая простая плата с чипом STM32F103C8T6 и минимальной обвязкой <100руб стоит, т.е. для того чтобы начать не нужен даже паяльник. А там уже решите для себя: стоит/нет с этим связываться. 
Будут вопросы - пишите в личку. Чем смогу - помогу.

Чёт не то нажал, отправилось пол сообщения, сорри! Улыбающийся
-NMi- Студент Саранск 33 3
Отв.18  29 Марта 18, 14:56
Программатор есть.
НЕТ платформы, на чЁм гамить....
CooCox пробовал, нмФпичатлило!
Z_h_e Доцент г. Чайковский 1.1K 310
Отв.19  29 Марта 18, 14:59, через 4 мин
Чем кокос не понравился? Долго запускается, это да. Проект перестали продвигать, это тоже минус. Редактор отличный, дебаггер дебажит. Официально бесплатный.