Stm32 с чего начать изучение...

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: Stm32 с чего начать изучение...

Сообщение Карбофос »

В прерывании по окончании измерений вычисляются средние значения с двух каналов АЦП.
Для доступа к ним из процедур расчета и захотелось добавить ATOMIC_BLOCK.
Был огорчён, что такой простой вещи после AVR не нашёл.
До сих пор с STM32 дел никаких не имел.
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Stm32 с чего начать изучение...

Сообщение VladislavS »

Измерения закончены, лежат себе на месте. Берите да вычисляйте. Пока новые измерения не запустите старые не изменятся. Зачем там атомики?
Реклама
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

Re: Stm32 с чего начать изучение...

Сообщение НовыйДень »

Мм... Пока вы находитесь в прерывании DMA1_Channel2_3_IRQHandler, это же самое прервыание само себя не прервет, поэтому всё получается само собой, никаких специальных средств не нужно. И DMA тоже отключен, запуска его не произойдет.

Изучайте мануалы, там всё написано. Подробно про прерывания - Programming Manual. Все доки есть на сайте st.com - находите ваш микроконтроллер, на вкладке Documents всё лежит.
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: Stm32 с чего начать изучение...

Сообщение Карбофос »

Спасибо, пнули в нужном направлении. Образно выражаясь.
Оказывается, в Programming manual Cortex-M0 ядро расписано, а в Reference manual - про всё остальное. :))
Просто, хотел сказать спасибо.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

Re: Stm32 с чего начать изучение...

Сообщение DataLife »

Доброго дня, друзья!
Продолжая изучать STM32. Решил поковырять таймеры. И, к моему удивлению, обнаружил, что не все таймеры имеют прерывания по переполнению/совпадению. Вернее 1-2 на МК. Причём настройки на совпадение по фронтам есть, а вызова прерывания нет (если верить cubeMX).
Задачу поставил достаточно простую: вычисление времени сигнала (около 5-10 милиСек) и его корректировка (увеличиваем длину на коэффициент). Всё бы ничего, но нужно мерять 4 канала, которые +/- в одно время шлют сигналы. То есть, нужно 4 таймера.

Пока всё пробую на STM32F407VET6, готовое устройство будет на F401CCU6 (Black Pill).

Подскажите, как быть? Доступно только глобальное прерывание, его можно "настроить" на переполнение/совпадение?

Конечно, можно на внешних прерываниях сделать... В них запускать таймер, но хотело бы красиво на таймере всё запустить. Подскажите, как сделать?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение Eddy_Em »

[uquote="DataLife",url="/forum/viewtopic.php?p=4230476#p4230476"]не все таймеры имеют прерывания по переполнению/совпадению[/uquote]
Все имеют. Просто у некоторых это вынесено в отдельное прерывание, а у остальных - в общее. Нужно соответствующий флаг проверять и сбрасывать (или только сбрасывать, если кроме CC никаких прерываний у таймера нет).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Stm32 с чего начать изучение...

Сообщение azhel12 »

Добрый день любителям Stm32.

По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина, но стараюсь подробно дкоументировать и покрывать примерами (+ реализация модуля USB, на habr-е можно посмотреть более подробно).

В репозитории есть примеры, также попытался составить уроки, забросил, но идея продолжить их пока сидит в голове.

Буду рад, если кто-то посмотрит, попробует посмотреть на программирование на Stm32 с этой, не совсем классической, стороны, оставит отзывы, готов в меру сил консультировать и отвечать на вопросы.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Stm32 с чего начать изучение...

Сообщение Reflector »

[uquote="azhel12",url="/forum/viewtopic.php?p=4265583#p4265583"]По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина[/uquote]
Постоянно об этом пишу, Toggle() не стоит реализовывать подобным образом, даже в HAL со временем переделали через BSRR:

Код: Выделить всё

_Regs()->ODR ^= value;
Потокобезопасный вариант выглядит как-то так:

Код: Выделить всё

void toggle() { _Regs()->BSRR = pinsMask << 16 | ~_Regs()->ODR & pinsMask; }
А тут непонятно почему в BSRR пишется два раза:

Код: Выделить всё

void ClearAndSet()
{
    Clear<clearMask>();  // _Regs()->BSRR = clearMask << 16;
    Set<setMask>();      // _Regs()->BSRR = setMask;
}
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Stm32 с чего начать изучение...

Сообщение azhel12 »

Reflector, спасибо за обратную связь! Началось всё это еще в 2020, я тогда только начал микроконтроллерами увлекаться, и базовую часть библиотеки (в первую очередь GPIO) перенял практически без изменений (так как не особо разбирался на тот момент). В связи с этим подобных мест, я уверен, немало, и потихоньку буду их исправлять, в том числе хотелось бы это делать благодаря сообществу (если такое все-таки сформируется). Поэтому благодарю за найденное некорректное место, я буквально сегодня исправлю :)
UPD: исправлено
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Stm32 с чего начать изучение...

Сообщение Reflector »

[uquote="azhel12",url="/forum/viewtopic.php?p=4265790#p4265790"]UPD: исправлено[/uquote]
Там Toggle() и ClearAndSet() по паре функций, шаблонные версии старые остались :)
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Stm32 с чего начать изучение...

Сообщение azhel12 »

[uquote="Reflector",url="/forum/viewtopic.php?p=4266006#p4266006"]шаблонные версии старые остались :)[/uquote]
Точно, забыл уже, что делал обычный метод + шаблонный. Хотя все никак руки не доходят выяснить, имеет ли это смысл при включенной оптимизации.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Stm32 с чего начать изучение...

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=4265761#p4265761"]Потокобезопасный вариант выглядит как-то так:

Код: Выделить всё

void toggle() { _Regs()->BSRR = pinsMask << 16 | ~_Regs()->ODR & pinsMask; }
[/uquote]Так себе тут с потокобезопасностью...
В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle.
Непонятно - почему инженеры STM не смогли додуматься до такой простой и логичной вещи?
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Stm32 с чего начать изучение...

Сообщение azhel12 »

[uquote="jcxz",url="/forum/viewtopic.php?p=4266019#p4266019"]Так себе тут с потокобезопасностью...[/uquote] В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Stm32 с чего начать изучение...

Сообщение tonyk »

azhel12 писал(а):В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Stm32 с чего начать изучение...

Сообщение azhel12 »

ОС там нет, насколько я понял, std::atomic примерно про это, но пока не нашел времени разобраться в вопросе применимости его для этих МК.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Stm32 с чего начать изучение...

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=4266019#p4266019"]В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle.[/uquote]
Одновременная запись в младшее и старшее полуслово с приоритетов установки битов полезна сама по себе и используется чаще чем toggle, например:

Код: Выделить всё

void write(uint16_t data)
{
    base()->BSRR = pinsMask << 16 | (data & pinsMask);
}
Добавлено after 3 minutes 2 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4266024#p4266024"]Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.[/uquote]
Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.

ps. Кстати, в Pico наоборот запись реализуется через toggle, стандартный подход в официальном SDK:

Код: Выделить всё

void write(uint32_t value) { sio_hw->gpio_togl = (sio_hw->gpio_out ^ value) & pinsMask; }
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Stm32 с чего начать изучение...

Сообщение tonyk »

Reflector писал(а):Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.
Для пинов- возможно, да. Но GPIO такая же периферия, как и любая другая, к которой могут быть обращения и разных потоков. И и подход к разделению доступа должен быть, и быть единым в рамках ОС или используемой среды программирования.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Stm32 с чего начать изучение...

Сообщение jcxz »

[uquote="azhel12",url="/forum/viewtopic.php?p=4266022#p4266022"]В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?[/uquote]Либо через критическую секцию либо через механизм эксклюзивного доступа ARM.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Stm32 с чего начать изучение...

Сообщение azhel12 »

Вроде в общем проблему понял, пойду потихоньку разбираться
Аватара пользователя
Андрей Осипов
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Сб авг 20, 2022 17:54:06

Re: Stm32 с чего начать изучение...

Сообщение Андрей Осипов »

Вот так STM32 в Аrduino. пользую для самого начала знакомства с STM3/

Чтобы был UART и COM порт для отладки,в Аrduino.
Использую для работы с STM32F103C8T6 в плате NUCLEO F103RB.
Ее можно на Али купить..


NUCLEO F103RB подключается напрямую к Ардуино.. там уже есть и загрузка и СОМ порт..





Вот программа для Arduino, работающая с NUCLEO F103RB.

void setup()
{
pinMode(PC13, OUTPUT);
pinMode(PC14, OUTPUT);
/*
*******************************
Nucleo выводит в Serial2.print

*******************************
*/
Serial.begin(9600);
Serial1.begin(9600); /* Serial1 PA10-RX PA9-TX */
Serial2.begin(9600); /* Serial2 PA3-RX PA2-TX */
Serial3.begin(9600); /* Serial3 PB11-RX PB10-TX */
}

void loop()
{

/* Serial нулевой порт */
Serial.println(" STM32 заработал с кирилицей");
Serial.println(" STM32 Serial нулевой порт где не знаю ");
Serial.println(" ");


/* Serial1 первый порт PA10-RX PA9-TX */
Serial1.println(" ");
Serial1.println(" STM32 - заработал с кирилицей через СОМ внешний на штырьках и PA10-RX PA9-TX ");
Serial1.println(" через порт Serial1.println в Ардуино хех ");
Serial1.println(" Этот порт выведен на 4 желтых штырька ");
Serial1.println(" GND 5V Rx Tx ");
Serial1.println(" около 20 контактного разъема ST-LINK");
Serial1.println(" первый порт PA10-RX PA9-TX + штырьки желтые ");
Serial1.println(" ");
Serial1.print(" ");
/* Это виртуальный порт на Nucleo-64 */
/* Serial2 второй порт PA3-RX PA2-TX */
Serial2.println(" скетч STM32__UART___Serial_1__2_3.ino ");
Serial2.println(" ");
Serial2.println(" STM32 на Nucleo-64 заработал с кирилицей ");
Serial2.println(" Serial2.print это Nucleo-64 ");
Serial2.println(" второй порт PA3-RX PA2-TX ");
Serial2.println(" ");

/* Serial3 третий порт PB11-RX PB10-TX */
Serial3.println(" ");
Serial3.println(" ");
Serial3.println(" ");
Serial3.println(" STM32 заработал с кирилицей через СОМ ");
Serial3.println(" через порт Serial1.println в Ардуино ");
Serial3.println(" Serial3.print третий порт PB11-RX PB10-TX ");

/* поморгаем диодиком PC13(на плате Blue pill ) PC14 */

digitalWrite(PC13, HIGH);
digitalWrite(PC14, HIGH);
delay(200);
digitalWrite(PC13, LOW);
digitalWrite(PC14, LOW);
delay(200);


}


Можно и дешевле чем NUCLEO F103RB (2500р). обойтись..
вот такой платой с Али ..
Только придется собирать из трех устройств и проводки соединять
..
1 -- Минимальная плата для разработки системы STM32F103C8T6 ARM STM32, STM модуль для arduino (300р)
2 - STlink-V2 (свисток) (200р)
3 - USB UART TTL на CH340G (60р)
4 - проводки DUPONT female-female
цены ориентровочно..

скетч тот же ...
Ответить

Вернуться в «ARM»