27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

STM32 - замена Arduino

Форум самогонщиков Автоматика
1 2 3 4 5 6 2
Mnz Магистр Город 254 86
Отв.20  29 Марта 18, 15:58
НЕТ платформы, на чЁм гамить-NMi-, 29 Марта 18, 14:56
Нет IDE? Их неверное около десятка (для STM32). Выбирай какая нравится.
Sknar Новичок Хабаровск 3
Отв.21  30 Марта 18, 01:23
CooCox пробовал, нмФпичатлило!-NMi-, 29 Марта 18, 14:56
Это уже дело вкуса. Мне вот у того же "кукокса" старая версия очень нравится, а вот с новой - как-то не сложилось, уже не помню почему: то ли библиотеки убогие были, то ли ещё что-то. Поэтому до сих пор так и пользуюсь старой версией ИДЕ 1.7.8 Рекомендую посмотреть именно на неё. С официальным источником, я так понял проблема, но поищите, на просторах интернета - она есть! Не забудьте установить "тулчейн" ( GNU Embedded Toolchain for Arm - в поиске найдёте) и указать "кукоксу" путь к нему.
Программатор есть.-NMi-, 29 Марта 18, 14:56
Уже пол дела.
Удачи!
Mnz Магистр Город 254 86
Отв.22  30 Марта 18, 12:59
Не забудьте установить "тулчейн" ( GNU Embedded Toolchain for Arm - в поиске найдёте) и указать "кукоксу" путь к нему.Sknar, 30 Марта 18, 01:23
Его отдельно скачивать не обязательно. Можно указать путь к тому что в EmBitz (папка share\em_armgcc\). С кокосом работает, проверено.
У вообще удивляюсь тому что дистрибутив EmBitz имеет размер во много раз меньше чем у кокоса и при этом в нем есть все необходимое.

С официальным источником, я так понял проблемаSknar, 30 Марта 18, 01:23
И из-за этого не грузятся библиотеки из репозитория.
mak Модератор Екатеринбург 6.3K 1.8K
Отв.23  30 Марта 18, 13:12, через 14 мин
Keil наше все
До 32К бесплатный если правильно помню
Tomat7 Магистр Черноморская губинния 236 138
Отв.24  19 Апр. 18, 13:37
Коллеги, DMA, много прерываний и памяти это хорошо. А можно по-быстрее от рекламы перейти к чему-нибудь конкретному, что-нибудь полезное выложить? Ну хотя бы законченнй регулятор мощности про который в теме OldBean'a сказано [сообщение #13292968] . Хочется уже наконец оценить клёвый таймер и вложенные прерывания с приоритетом без которых, оказывается, регулятор напряжения не особо точен.
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.25  19 Апр. 18, 13:47, через 11 мин
Хочется уже наконец оценить клёвый таймер и вложенные прерыванияTomat7, 19 Апр. 18, 13:37
Настраиваете таймер на ШИМ, однократный счет и запуск от внешнего импульса. Внешний импульс - это детектор нуля, выход ШИМ - управление симистором. И всё, программа не принимает участие в формирование управляющего импульса, ну кроме когда надо фазу изменить. Прерывания тут не нужны совсем.
Tomat7 Магистр Черноморская губинния 236 138
Отв.26  19 Апр. 18, 15:37
Прерывания тут не нужны совсем.Z_h_e, 19 Апр. 18, 13:47
Не, блин, ну это реально круто  :-\  Спасибо, Z_h_e!
А теперь можно такой же конкретный и законченный пример с Ethernet'ом (желательно без лишних дискуссий про MAC, PHY, RMII) чтобы я его быстренько залил/спаял/подключил и окончательно "оценил".

Да, а конкретный и законченный пример пример под какую IDE будет?
А то может пора бежать очередную среду разработки осваивать.  >:(
Фуух, выговорился.  
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.


Теперь серьёзно.

STM32 это действительно хорошо и многообещающе. У меня глаза горели когда заказывал несколько разных STM32 с программатором. К моменту получения на почте я уже был знаком с бардаком плюрализмом в части IDE. Особенно раздражает когда пример из одной IDE совершенно не обязан заработать в другой.  :o

Кроме того, заметил что сообщество STM'щиков, как бы так сказать...  прижимистое в плане деления информацией, то есть открыто не пошлют, но и код свой полностью не покажут. Зато порассуждать любят.  >:( Причины этого, насколько я понял (точнее на форуме кто-то проболтался) это банально деньги. Часто STM'щики это реальные профессионалы для которых программирование микроконтроллеров это хлеб с маслом, и делится маслом мало кто хочет. Для них любительская Ардуино как кость в горле с помощью которой всякие студенты отжимают у них хлеб - «ардуино управляет промышленным грузовым лифтом» (простите, ЧЕМ??!! Кто его туда пустил?)" http://catethysis.ru/arduino-vs-stm32/  И я их понимаю.

Для себя пока эксперименты с STM32 заморозил и пока не столкнусь (хотя уже рядом) с недостатком производительности/памяти Ардуино врядли к ним вернусь. Хотя уверен, конкретный и законченный пример полезного устройства может легко изменить отношение к STM32 любого скептика.  ;)

PS Полноценный отладчик в STM32 - это та самая вишенка ради которой иногда хочется забросить Ардуино.   Смеющийся
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.27  19 Апр. 18, 17:48
Да, а конкретный и законченный пример пример под какую IDE будет?Tomat7, 19 Апр. 18, 15:37
меня всегда удивляет такая вот частая позиция эмбеддеров - дескать, для контроллера должна быть своя IDE. Да фиг там, нормальная среда - она для языка, а не устройства. Мне как-то не составляет проблемы Eclipse CDT ткнуть носом в исходники/бибилиотеки/компилятор для x86, avr, stm8, stm32 и esp8266. Ну и привычка - сборкой по-хорошему должна заниматься система сборки (make/cmake/qmake), а не среда сама по себе.
К моменту получения на почте я уже был знаком с бардаком плюрализмом в части IDE. Особенно раздражает когда пример из одной IDE совершенно не обязан заработать в другой.Tomat7, 19 Апр. 18, 15:37
другая ситуация только у ардуины, где распространенная IDE одна. И она ужасна и примитивна.
конкретный и законченный пример полезного устройстваTomat7, 19 Апр. 18, 15:37
ну вот, например - https://github.com/rene-dev/stmbl
или такое - http://radiokot.ru/forum/viewtopic.php?f=8&t=119089

ЗЫ для ардуинщиков есть https://github.com/stm32duino
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.28  19 Апр. 18, 18:15, через 28 мин
Не, блин, ну это реально круто    Спасибо, Z_h_e!Tomat7, 19 Апр. 18, 15:37
Сарказм намного круче? Вы спросили- я ответил, о варианте реализации. Это действительно рабочий вариант и, если бы Вам было это действительно нужно, Вам помогли бы с его реализацией, если что-то было бы не совсем понятно. А если Вы хотели получить готовый проект, то зачем вопрос про вложенность прерываний?  Готовые выложенные проекты постепенно появятся в сети, когда-то и AVR так же были далеки от народа.
Mnz Магистр Город 254 86
Отв.29  19 Апр. 18, 23:24
регулятор мощности про который в теме OldBean'a сказаноTomat7, 19 Апр. 18, 13:37
Полностью регулятор разрабатывать долго. Набросал небольшой пример, который позволяет управлять углом открытия симистора в диапазоне 0 - 99.8% с шагом 0.01%. Это разрешающая способность, но будет ли такой точность, не скажу, не проверял (нет измерительных приборов для подобных измерений). В протеусе работает, но медленно. Видимо моделирование STM32 довольно ресурсоемкая задача.

Исходник
#include "stm32f10x_conf.h"
#include "SysTimer.h"
#include "hd44780_driver.h"

extern uint32_t SystemCoreClock;  // Частота ядра в герцах.

static void Init(void) // Инициализация и конфигурация периферии.
{
    // Включение тактирования таймера 1, порта A и модуля альтернативных функций.
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    // Настройка портов ввода/вывода.
    GPIO_InitTypeDef GPIO;
    GPIO.GPIO_Pin = GPIO_Pin_8;       // Выход на симистор.
    GPIO.GPIO_Mode = GPIO_Mode_AF_PP; // Это альтернативная функция порта (выход ШИМ таймера 1).
    GPIO.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO);          // Настройка выводов порта A.

    GPIO.GPIO_Pin = GPIO_Pin_9;       // Вход детектора нуля.
    GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING; // Обычный вход.
    GPIO_Init(GPIOA, &GPIO);          // Настройка выводов порта A.



    // Настройка таймера 1.
    TIM_TimeBaseInitTypeDef Tim;
    TIM_TimeBaseStructInit(&Tim); // Настройки таймера по умолчанию.

    Tim.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // Настройка предделителя на 1000 КГц.
    Tim.TIM_Period = 9999-10; // Счет от 0 до 9999 и переполнение 100 раз в секунду.

    TIM_TimeBaseInit(TIM1, &Tim);

    // Настрока канала ШИМ таймера.
    TIM_OCInitTypeDef PWM; // Настройка каналов таймеров.
    TIM_OCStructInit(&PWM); // Настройки канала таймера по умолчанию.

    PWM.TIM_Pulse = 0;
    PWM.TIM_OCMode = TIM_OCMode_PWM2;
    PWM.TIM_OutputState = TIM_OutputState_Enable;
    PWM.TIM_OCPolarity = TIM_OCPolarity_Low;

    TIM_OC1Init(TIM1, &PWM); // Настройка 1 канала таймера 1.

    TIM_BDTRInitTypeDef bdtr;
    TIM_BDTRStructInit(&bdtr);
    bdtr.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
    TIM_BDTRConfig(TIM1, &bdtr);

    TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single); // Режим работы OnePulse.

    // TIM_ARRPreloadConfig(TIM1, DISABLE);
    TIM_OC1PreloadConfig(TIM1, DISABLE); // Отключение буферизации данных 1 канала.



    // Настройка прерываний от внешних источников.
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource9); // Прерывания от вывода 9 порта А.

    EXTI_InitTypeDef Exti;

    Exti.EXTI_Line = EXTI_Line9;
    Exti.EXTI_LineCmd = ENABLE;
    Exti.EXTI_Mode = EXTI_Mode_Interrupt;
    Exti.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&Exti);

    // Включение прерывания.
    NVIC_InitTypeDef Int;
    Int.NVIC_IRQChannel = EXTI9_5_IRQn;
    Int.NVIC_IRQChannelPreemptionPriority = 0; // Максимальный приоритет прерывания.
    Int.NVIC_IRQChannelSubPriority = 0;
    Int.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&Int);

}

static void InitButton(void)
{
    GPIO_InitTypeDef GPIO;

    GPIO.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;  // Вход для кнопок.
    GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;     // Обычный вход.
    GPIO_Init(GPIOA, &GPIO);
}

static void SetPowerPercent(uint16_t Percent)
{
    TIM1->CCR1 = TIM1->ARR - Percent;
}

static void LCD_Update(uint16_t Percent)
{
   static char Str[8]={'0', '0', '.', '0', '0', ' ', '%', 0};
   uint8_t i;

   lcd_set_xy(0,0);

   for (i=0; i<=4; i++)
   {
       if (i==2) i++;
       Str[4-i] = (Percent % 10) + 0x30;
       Percent /= 10;
   }

   lcd_out(Str);
}

int main(void)
{
    static uint16_t Percent=2000, OldPercent=0;
    static uint32_t Tick;
    static volatile uint32_t i;

    SystemCoreClockUpdate(); // Определение частоты ядра.
    SysTim_Init(1000);
    Init();                  // Инициализация и конфигурация периферии.
    InitButton();

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    lcd_init();
    lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK);

    Tick = SysTim_GetTick();

    while(1)
    {
        SysTim_DelayMS(2);

        if ((GPIOA->IDR & GPIO_Pin_10) == 0) // Кнопка Up.
        {
            if (Percent < TIM1->ARR) Percent++;
        }

        if ((GPIOA->IDR & GPIO_Pin_11) == 0) // Кнопка Down.
        {
            if (Percent>0) Percent--;
        }


        if ((SysTim_GetTick()-Tick)>=100) // Прошло 100 мс.
        {
            Tick = SysTim_GetTick();

            if (Percent != OldPercent)
            {
                OldPercent = Percent;
                SetPowerPercent(Percent);
                LCD_Update(Percent);
            }
        }

    }
}


void EXTI9_5_IRQHandler(void) // Обработчик внешнего прерывания от линий 5 - 9.
{
    if (EXTI_GetITStatus(EXTI_Line9) != RESET) // Прерывание от линии 9.
    {
        EXTI_ClearITPendingBit(EXTI_Line9); // Сброс признака прерывания от линии 9.
        TIM_Cmd(TIM1, ENABLE); // Запуск таймера.
    }
}

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


Да, а конкретный и законченный пример пример под какую IDE будет?Tomat7, 19 Апр. 18, 15:37
Есть разница?

Особенно раздражает когда пример из одной IDE совершенно не обязан заработать в другой.Tomat7, 19 Апр. 18, 15:37
Дело не в IDE, а в компиляторах. Компиляторы Си полностью совместимы только в теории. А в реальности у каждого свои особенности синтаксиса. Это относится не только в ARM, но и AVR (попробуйте код для WinAVR скомпилировать в CodeVision), компиляторам для компа и т. д.

Хотя уверен, конкретный и законченный пример полезного устройства может легко изменить отношение к STM32 любого скептика.Tomat7, 19 Апр. 18, 15:37
[БАРС. Блок автоматической ректификации и стабилизации.]
[Автоматика дистилляции, HD Auto]
STM32_Proteus_Simistor.png
STM32_Proteus_Simistor.png STM32 - замена Arduino. Автоматика.

Simistor.zip 291.3 Кб
Mnz Магистр Город 254 86
Отв.30  20 Апр. 18, 07:55
Немного оптимизировал код под протеус. Теперь работает быстрее.
Simistor.zip 291.9 Кб
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.31  20 Апр. 18, 09:28
А я в Шпротеусе 8.6 не смог запустить stm32F103, там на уже на пустой прошивке порты странно проинициализированны. Значит надо 8.7 поискать....
Mnz Магистр Город 254 86
Отв.32  20 Апр. 18, 10:11, через 44 мин
Значит надо 8.7 поискать....Z_h_e, 20 Апр. 18, 09:28
Моделирование производилось в версии 8.7 SP3.
Tomat7 Магистр Черноморская губинния 236 138
Отв.33  20 Апр. 18, 17:45
Сарказм намного круче?Z_h_e, 19 Апр. 18, 18:15
Ну а как без сарказма обойтись если спрашиваешь про конкретное, полезное и законченное, а тебе отвечают фразами из рекламных буклетов. (да, опять сарказм  Смеющийся)

Коллеги, я прекрасно понимаю что здесь никто никому ничего не должен. И всё-таки...
Z_h_e, у тебя есть замечательная тема [БАРС. Блок автоматической ректификации и стабилизации.] , а там только прошивки.
Вот Sknar рассказывает [сообщение #13276122] сколько чудесных автоматик он сделал за 5 лет, и снова ни строчки кода.
Может хоть кусочки от регулятора напряжения выложите?  Непонимающий

Тема Hold`a [Автоматика дистилляции, HD Auto] реально произвела впечатление, но следил я за ней до сообщения [сообщение #13159803] , после интерес приугас. По счастью Hold всё-таки выложил исходники, но в регуляторе там банальный Брезенхем - и о какой точности можно говорить?

Mnz Спасибо большое за пример, теперь есть с чего начать! Да и за всю тему отдельное спасибо. 
STM32 - замена Arduino
STM32 - замена Arduino. Автоматика.
msg31 Научный сотрудник Барнаул 4.6K 2.5K
Отв.34  20 Апр. 18, 17:57, через 12 мин
Ну а как без сарказма обойтись если спрашиваешь про конкретное, полезное и законченное,Tomat7, 20 Апр. 18, 17:45
Понятно хочется на блюдечке готовенькое Улыбающийся. Кому-то для дистилляции, кому-то для курсовой или диплома покатит.
Z_h_e Доцент г. Чайковский 1.1K 313
Отв.35  20 Апр. 18, 18:17, через 20 мин
Ну а как без сарказма обойтись если спрашиваешь про конкретное, полезное и законченное, а тебе отвечают фразами из рекламных буклетов. (да, опять сарказм  Смеющийся)Tomat7, 20 Апр. 18, 17:45
Без сарказма можно очень легко обходиться. Я как раз конкретно и точно ответил про реализацию диммера с помощью таймера. Mnz вроде так и реализовал, с помощью SPL только.  Про какие рекламные буклеты речь идет, я не знаю.
Z_h_e, у тебя есть замечательная тема [БАРС. Блок автоматической ректификации и стабилизации.] , а там только прошивки.Tomat7, 20 Апр. 18, 17:45
Вы будете смеяться, но и выложенными прошивками не воспользуешься для чистого STM32. Если бы я все выложил, проект так и остался бы на начальной стадии, а скорее всего я бы обошелся другими своими девайсами, более простыми, а этот бы даже и не начал. А так у меня уже есть обязательства, которые заставляют сопровождать устройство. Иначе бы я уперся в "а на хера оно мне надо?".
Mnz Магистр Город 254 86
Отв.36  20 Апр. 18, 20:34
Mnz вроде так и реализовал, с помощью SPL только.Z_h_e, 20 Апр. 18, 18:17
У меня с прерыванием от детектора нуля.
void EXTI9_5_IRQHandler(void) // Обработчик внешнего прерывания от линий 5 - 9.
{
    if (EXTI_GetITStatus(EXTI_Line9) != RESET) // Прерывание от линии 9.
    {
        EXTI_ClearITPendingBit(EXTI_Line9); // Сброс признака прерывания от линии 9.
        TIM_Cmd(TIM1, ENABLE); // Запуск таймера.
    }
}
Но можно без прерываний. Необходимо исключить из кода строки его настройки и обработки и добавить код, конфигурирующий таймер на запуск по внешнему триггеру.
    TIM_ETRConfig(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); // Настройка входа внешнего триггера.
    TIM_SelectInputTrigger(TIM1, TIM_TS_ETRF);        // Выбор внешнего триггера.
    TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger); // Синхронизация таймера по триггеру.
    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable); // При срабатывании триггера нужно включить таймер.
Таймер будет включаться по фронту импульса на PA12 и выключаться по переполнению.
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.37  20 Апр. 18, 20:57, через 24 мин
ардуины это для школьников - светодиодиком помигать
ядру только и приходится что библиотеки дуин всяких шерстить. туда сколько не дай - все будет мало.

учить ядро, учить си ( при чем без всяких плюсов, решеток и прочей нечисти )
а проекты выкладывать, вот сижу кодю потихоньку, увлекательно, но не готово так чтобы без вопросов работало всегда.
m16 Модератор Тамбов 1.9K 1K
Отв.38  20 Апр. 18, 21:28, через 32 мин
ардуины это для школьников - светодиодиком помигатьSedoY, 20 Апр. 18, 20:57
SedoY, ардуина это есть платформа для начинающих. дуины  есть на AVR-ах, PIC-ах, кортексах . помимо того что  процики  разные  есть общие хреновые моменты:
- разводка печатных плат, особенно аналоговой части
- IDE  с индусскими либами
но в любом случае не зная адра , не зная работу периферии а полагаясь на готовые либы для работы с ней ничего путного не получится хоть на авр-е , хоть на стм-е.
учить ядро, учить си ( при чем без всяких плюсов, решеток и прочей нечисти )SedoY, 20 Апр. 18, 20:57
+1. и если уж выбор пал на стм  то пара советов.  IDE - Keil , отладчик St-link (купить в Китае , либо самому сделать(у меня самопальный)).  ни в коем случае не пользовать  Cube, либы писать самому (индусские либы попортят нервы)
Mnz Магистр Город 254 86
Отв.39  20 Апр. 18, 21:46, через 18 мин
IDE - Keilm16, 20 Апр. 18, 21:28
Больше 32 КБ платно. Для домашнего применения достаточно бесплатных альтернатив.

либы писать самомуm16, 20 Апр. 18, 21:28
Писать с нуля долго и не всегда эффективно. Проще и быстрее взять готовую библиотеку и привести ее в порядок.