Stm32 с чего начать изучение...
Re: Stm32 с чего начать изучение...
В прерывании по окончании измерений вычисляются средние значения с двух каналов АЦП.
Для доступа к ним из процедур расчета и захотелось добавить ATOMIC_BLOCK.
Был огорчён, что такой простой вещи после AVR не нашёл.
До сих пор с STM32 дел никаких не имел.
Для доступа к ним из процедур расчета и захотелось добавить ATOMIC_BLOCK.
Был огорчён, что такой простой вещи после AVR не нашёл.
До сих пор с STM32 дел никаких не имел.
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Stm32 с чего начать изучение...
Измерения закончены, лежат себе на месте. Берите да вычисляйте. Пока новые измерения не запустите старые не изменятся. Зачем там атомики?
Re: Stm32 с чего начать изучение...
Мм... Пока вы находитесь в прерывании DMA1_Channel2_3_IRQHandler, это же самое прервыание само себя не прервет, поэтому всё получается само собой, никаких специальных средств не нужно. И DMA тоже отключен, запуска его не произойдет.
Изучайте мануалы, там всё написано. Подробно про прерывания - Programming Manual. Все доки есть на сайте st.com - находите ваш микроконтроллер, на вкладке Documents всё лежит.
Изучайте мануалы, там всё написано. Подробно про прерывания - Programming Manual. Все доки есть на сайте st.com - находите ваш микроконтроллер, на вкладке Documents всё лежит.
Re: Stm32 с чего начать изучение...
Спасибо, пнули в нужном направлении. Образно выражаясь.
Оказывается, в Programming manual Cortex-M0 ядро расписано, а в Reference manual - про всё остальное.
Просто, хотел сказать спасибо.
Оказывается, в Programming manual Cortex-M0 ядро расписано, а в Reference manual - про всё остальное.
Просто, хотел сказать спасибо.
Re: Stm32 с чего начать изучение...
Доброго дня, друзья!
Продолжая изучать STM32. Решил поковырять таймеры. И, к моему удивлению, обнаружил, что не все таймеры имеют прерывания по переполнению/совпадению. Вернее 1-2 на МК. Причём настройки на совпадение по фронтам есть, а вызова прерывания нет (если верить cubeMX).
Задачу поставил достаточно простую: вычисление времени сигнала (около 5-10 милиСек) и его корректировка (увеличиваем длину на коэффициент). Всё бы ничего, но нужно мерять 4 канала, которые +/- в одно время шлют сигналы. То есть, нужно 4 таймера.
Пока всё пробую на STM32F407VET6, готовое устройство будет на F401CCU6 (Black Pill).
Подскажите, как быть? Доступно только глобальное прерывание, его можно "настроить" на переполнение/совпадение?
Конечно, можно на внешних прерываниях сделать... В них запускать таймер, но хотело бы красиво на таймере всё запустить. Подскажите, как сделать?
Продолжая изучать STM32. Решил поковырять таймеры. И, к моему удивлению, обнаружил, что не все таймеры имеют прерывания по переполнению/совпадению. Вернее 1-2 на МК. Причём настройки на совпадение по фронтам есть, а вызова прерывания нет (если верить cubeMX).
Задачу поставил достаточно простую: вычисление времени сигнала (около 5-10 милиСек) и его корректировка (увеличиваем длину на коэффициент). Всё бы ничего, но нужно мерять 4 канала, которые +/- в одно время шлют сигналы. То есть, нужно 4 таймера.
Пока всё пробую на STM32F407VET6, готовое устройство будет на F401CCU6 (Black Pill).
Подскажите, как быть? Доступно только глобальное прерывание, его можно "настроить" на переполнение/совпадение?
Конечно, можно на внешних прерываниях сделать... В них запускать таймер, но хотело бы красиво на таймере всё запустить. Подскажите, как сделать?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Stm32 с чего начать изучение...
[uquote="DataLife",url="/forum/viewtopic.php?p=4230476#p4230476"]не все таймеры имеют прерывания по переполнению/совпадению[/uquote]
Все имеют. Просто у некоторых это вынесено в отдельное прерывание, а у остальных - в общее. Нужно соответствующий флаг проверять и сбрасывать (или только сбрасывать, если кроме CC никаких прерываний у таймера нет).
Все имеют. Просто у некоторых это вынесено в отдельное прерывание, а у остальных - в общее. Нужно соответствующий флаг проверять и сбрасывать (или только сбрасывать, если кроме CC никаких прерываний у таймера нет).
Re: Stm32 с чего начать изучение...
Добрый день любителям Stm32.
По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина, но стараюсь подробно дкоументировать и покрывать примерами (+ реализация модуля USB, на habr-е можно посмотреть более подробно).
В репозитории есть примеры, также попытался составить уроки, забросил, но идея продолжить их пока сидит в голове.
Буду рад, если кто-то посмотрит, попробует посмотреть на программирование на Stm32 с этой, не совсем классической, стороны, оставит отзывы, готов в меру сил консультировать и отвечать на вопросы.
По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина, но стараюсь подробно дкоументировать и покрывать примерами (+ реализация модуля USB, на habr-е можно посмотреть более подробно).
В репозитории есть примеры, также попытался составить уроки, забросил, но идея продолжить их пока сидит в голове.
Буду рад, если кто-то посмотрит, попробует посмотреть на программирование на Stm32 с этой, не совсем классической, стороны, оставит отзывы, готов в меру сил консультировать и отвечать на вопросы.
Re: Stm32 с чего начать изучение...
[uquote="azhel12",url="/forum/viewtopic.php?p=4265583#p4265583"]По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина[/uquote]
Постоянно об этом пишу, Toggle() не стоит реализовывать подобным образом, даже в HAL со временем переделали через BSRR:
Потокобезопасный вариант выглядит как-то так:
А тут непонятно почему в BSRR пишется два раза:
Постоянно об этом пишу, Toggle() не стоит реализовывать подобным образом, даже в HAL со временем переделали через BSRR:
Код: Выделить всё
_Regs()->ODR ^= value;Код: Выделить всё
void toggle() { _Regs()->BSRR = pinsMask << 16 | ~_Regs()->ODR & pinsMask; }Код: Выделить всё
void ClearAndSet()
{
Clear<clearMask>(); // _Regs()->BSRR = clearMask << 16;
Set<setMask>(); // _Regs()->BSRR = setMask;
}Re: Stm32 с чего начать изучение...
Reflector, спасибо за обратную связь! Началось всё это еще в 2020, я тогда только начал микроконтроллерами увлекаться, и базовую часть библиотеки (в первую очередь GPIO) перенял практически без изменений (так как не особо разбирался на тот момент). В связи с этим подобных мест, я уверен, немало, и потихоньку буду их исправлять, в том числе хотелось бы это делать благодаря сообществу (если такое все-таки сформируется). Поэтому благодарю за найденное некорректное место, я буквально сегодня исправлю 
UPD: исправлено
UPD: исправлено
Re: Stm32 с чего начать изучение...
[uquote="azhel12",url="/forum/viewtopic.php?p=4265790#p4265790"]UPD: исправлено[/uquote]
Там Toggle() и ClearAndSet() по паре функций, шаблонные версии старые остались
Там Toggle() и ClearAndSet() по паре функций, шаблонные версии старые остались
Re: Stm32 с чего начать изучение...
[uquote="Reflector",url="/forum/viewtopic.php?p=4266006#p4266006"]шаблонные версии старые остались
[/uquote]
Точно, забыл уже, что делал обычный метод + шаблонный. Хотя все никак руки не доходят выяснить, имеет ли это смысл при включенной оптимизации.
Точно, забыл уже, что делал обычный метод + шаблонный. Хотя все никак руки не доходят выяснить, имеет ли это смысл при включенной оптимизации.
Re: Stm32 с чего начать изучение...
[uquote="Reflector",url="/forum/viewtopic.php?p=4265761#p4265761"]Потокобезопасный вариант выглядит как-то так:
[/uquote]Так себе тут с потокобезопасностью...
В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle.
Непонятно - почему инженеры STM не смогли додуматься до такой простой и логичной вещи?
Код: Выделить всё
void toggle() { _Regs()->BSRR = pinsMask << 16 | ~_Regs()->ODR & pinsMask; }В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle.
Непонятно - почему инженеры STM не смогли додуматься до такой простой и логичной вещи?
Re: Stm32 с чего начать изучение...
[uquote="jcxz",url="/forum/viewtopic.php?p=4266019#p4266019"]Так себе тут с потокобезопасностью...[/uquote] В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
Re: Stm32 с чего начать изучение...
Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.azhel12 писал(а):В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
Re: Stm32 с чего начать изучение...
ОС там нет, насколько я понял, std::atomic примерно про это, но пока не нашел времени разобраться в вопросе применимости его для этих МК.
Re: Stm32 с чего начать изучение...
[uquote="jcxz",url="/forum/viewtopic.php?p=4266019#p4266019"]В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle.[/uquote]
Одновременная запись в младшее и старшее полуслово с приоритетов установки битов полезна сама по себе и используется чаще чем toggle, например:
Добавлено after 3 minutes 2 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4266024#p4266024"]Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.[/uquote]
Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.
ps. Кстати, в Pico наоборот запись реализуется через toggle, стандартный подход в официальном SDK:
Одновременная запись в младшее и старшее полуслово с приоритетов установки битов полезна сама по себе и используется чаще чем toggle, например:
Код: Выделить всё
void write(uint16_t data)
{
base()->BSRR = pinsMask << 16 | (data & pinsMask);
}[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; }Re: Stm32 с чего начать изучение...
Для пинов- возможно, да. Но GPIO такая же периферия, как и любая другая, к которой могут быть обращения и разных потоков. И и подход к разделению доступа должен быть, и быть единым в рамках ОС или используемой среды программирования.Reflector писал(а):Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.
Re: Stm32 с чего начать изучение...
[uquote="azhel12",url="/forum/viewtopic.php?p=4266022#p4266022"]В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?[/uquote]Либо через критическую секцию либо через механизм эксклюзивного доступа ARM.
Re: Stm32 с чего начать изучение...
Вроде в общем проблему понял, пойду потихоньку разбираться
- Андрей Осипов
- Первый раз сказал Мяу!
- Сообщения: 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
цены ориентровочно..
скетч тот же ...
Чтобы был 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
цены ориентровочно..
скетч тот же ...


