Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пн май 02, 2022 11:14:52

В прерывании по окончании измерений вычисляются средние значения с двух каналов АЦП.
Для доступа к ним из процедур расчета и захотелось добавить ATOMIC_BLOCK.
Был огорчён, что такой простой вещи после AVR не нашёл.
До сих пор с STM32 дел никаких не имел.

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

Пн май 02, 2022 11:25:55

Измерения закончены, лежат себе на месте. Берите да вычисляйте. Пока новые измерения не запустите старые не изменятся. Зачем там атомики?

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

Пн май 02, 2022 11:27:24

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

Изучайте мануалы, там всё написано. Подробно про прерывания - Programming Manual. Все доки есть на сайте st.com - находите ваш микроконтроллер, на вкладке Documents всё лежит.

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

Пн май 02, 2022 19:26:06

Спасибо, пнули в нужном направлении. Образно выражаясь.
Оказывается, в Programming manual Cortex-M0 ядро расписано, а в Reference manual - про всё остальное. :))
Просто, хотел сказать спасибо.

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

Чт май 12, 2022 11:30:29

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

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

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

Конечно, можно на внешних прерываниях сделать... В них запускать таймер, но хотело бы красиво на таймере всё запустить. Подскажите, как сделать?

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

Чт май 12, 2022 12:01:45

не все таймеры имеют прерывания по переполнению/совпадению

Все имеют. Просто у некоторых это вынесено в отдельное прерывание, а у остальных - в общее. Нужно соответствующий флаг проверять и сбрасывать (или только сбрасывать, если кроме CC никаких прерываний у таймера нет).

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

Ср июл 27, 2022 13:57:06

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

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

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

Буду рад, если кто-то посмотрит, попробует посмотреть на программирование на Stm32 с этой, не совсем классической, стороны, оставит отзывы, готов в меру сил консультировать и отвечать на вопросы.

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

Ср июл 27, 2022 20:35:20

По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина

Постоянно об этом пишу, 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;
}

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

Ср июл 27, 2022 21:15:30

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

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

Чт июл 28, 2022 09:17:26

UPD: исправлено

Там Toggle() и ClearAndSet() по паре функций, шаблонные версии старые остались :)

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

Чт июл 28, 2022 09:20:20

шаблонные версии старые остались :)

Точно, забыл уже, что делал обычный метод + шаблонный. Хотя все никак руки не доходят выяснить, имеет ли это смысл при включенной оптимизации.

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

Чт июл 28, 2022 09:55:48

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

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

Чт июл 28, 2022 10:02:08

Так себе тут с потокобезопасностью...
В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?

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

Чт июл 28, 2022 10:06:22

azhel12 писал(а):В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?

Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.

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

Чт июл 28, 2022 10:10:37

ОС там нет, насколько я понял, std::atomic примерно про это, но пока не нашел времени разобраться в вопросе применимости его для этих МК.

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

Чт июл 28, 2022 10:14:28

В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle.

Одновременная запись в младшее и старшее полуслово с приоритетов установки битов полезна сама по себе и используется чаще чем toggle, например:
Код:
void write(uint16_t data)
{
    base()->BSRR = pinsMask << 16 | (data & pinsMask);
}


Добавлено after 3 minutes 2 seconds:
Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.

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

ps. Кстати, в Pico наоборот запись реализуется через toggle, стандартный подход в официальном SDK:
Код:
void write(uint32_t value) { sio_hw->gpio_togl = (sio_hw->gpio_out ^ value) & pinsMask; }

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

Чт июл 28, 2022 10:22:20

Reflector писал(а):Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.

Для пинов- возможно, да. Но GPIO такая же периферия, как и любая другая, к которой могут быть обращения и разных потоков. И и подход к разделению доступа должен быть, и быть единым в рамках ОС или используемой среды программирования.

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

Чт июл 28, 2022 10:35:51

В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
Либо через критическую секцию либо через механизм эксклюзивного доступа ARM.

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

Чт июл 28, 2022 10:41:48

Вроде в общем проблему понял, пойду потихоньку разбираться

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

Сб авг 20, 2022 22:06:32

Вот так 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
цены ориентровочно..

скетч тот же ...

Ответить