В прерывании по окончании измерений вычисляются средние значения с двух каналов АЦП. Для доступа к ним из процедур расчета и захотелось добавить ATOMIC_BLOCK. Был огорчён, что такой простой вещи после AVR не нашёл. До сих пор с STM32 дел никаких не имел.
Мм... Пока вы находитесь в прерывании DMA1_Channel2_3_IRQHandler, это же самое прервыание само себя не прервет, поэтому всё получается само собой, никаких специальных средств не нужно. И DMA тоже отключен, запуска его не произойдет.
Изучайте мануалы, там всё написано. Подробно про прерывания - Programming Manual. Все доки есть на сайте st.com - находите ваш микроконтроллер, на вкладке Documents всё лежит.
Спасибо, пнули в нужном направлении. Образно выражаясь. Оказывается, в Programming manual Cortex-M0 ядро расписано, а в Reference manual - про всё остальное. Просто, хотел сказать спасибо.
Доброго дня, друзья! Продолжая изучать STM32. Решил поковырять таймеры. И, к моему удивлению, обнаружил, что не все таймеры имеют прерывания по переполнению/совпадению. Вернее 1-2 на МК. Причём настройки на совпадение по фронтам есть, а вызова прерывания нет (если верить cubeMX). Задачу поставил достаточно простую: вычисление времени сигнала (около 5-10 милиСек) и его корректировка (увеличиваем длину на коэффициент). Всё бы ничего, но нужно мерять 4 канала, которые +/- в одно время шлют сигналы. То есть, нужно 4 таймера.
Пока всё пробую на STM32F407VET6, готовое устройство будет на F401CCU6 (Black Pill).
Подскажите, как быть? Доступно только глобальное прерывание, его можно "настроить" на переполнение/совпадение?
Конечно, можно на внешних прерываниях сделать... В них запускать таймер, но хотело бы красиво на таймере всё запустить. Подскажите, как сделать?
_________________ Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
не все таймеры имеют прерывания по переполнению/совпадению
Все имеют. Просто у некоторых это вынесено в отдельное прерывание, а у остальных - в общее. Нужно соответствующий флаг проверять и сбрасывать (или только сбрасывать, если кроме CC никаких прерываний у таймера нет).
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина, но стараюсь подробно дкоументировать и покрывать примерами (+ реализация модуля USB, на habr-е можно посмотреть более подробно).
В репозитории есть примеры, также попытался составить уроки, забросил, но идея продолжить их пока сидит в голове.
Буду рад, если кто-то посмотрит, попробует посмотреть на программирование на Stm32 с этой, не совсем классической, стороны, оставит отзывы, готов в меру сил консультировать и отвечать на вопросы.
По мотивам достаточно известной статьи Константина Чижова про применение C++ в программировании микроконтроллеров и на основании его же проекта mcucpp развиваю проект Zhele, в котором использую наработки Константина
Постоянно об этом пишу, Toggle() не стоит реализовывать подобным образом, даже в HAL со временем переделали через BSRR:
Reflector, спасибо за обратную связь! Началось всё это еще в 2020, я тогда только начал микроконтроллерами увлекаться, и базовую часть библиотеки (в первую очередь GPIO) перенял практически без изменений (так как не особо разбирался на тот момент). В связи с этим подобных мест, я уверен, немало, и потихоньку буду их исправлять, в том числе хотелось бы это делать благодаря сообществу (если такое все-таки сформируется). Поэтому благодарю за найденное некорректное место, я буквально сегодня исправлю UPD: исправлено
Так себе тут с потокобезопасностью... В грамотно спроектированных МК, одновременная запись в младшее и старшее полуслово (bitset & bitreset) приводит к toggle. Непонятно - почему инженеры STM не смогли додуматься до такой простой и логичной вещи?
В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.
Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.
Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.
ps. Кстати, в Pico наоборот запись реализуется через toggle, стандартный подход в официальном SDK:
Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.
Для пинов- возможно, да. Но GPIO такая же периферия, как и любая другая, к которой могут быть обращения и разных потоков. И и подход к разделению доступа должен быть, и быть единым в рамках ОС или используемой среды программирования.
/* 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 */
Можно и дешевле чем NUCLEO F103RB (2500р). обойтись.. вот такой платой с Али .. Только придется собирать из трех устройств и проводки соединять .. 1 -- Минимальная плата для разработки системы STM32F103C8T6 ARM STM32, STM модуль для arduino (300р) 2 - STlink-V2 (свисток) (200р) 3 - USB UART TTL на CH340G (60р) 4 - проводки DUPONT female-female цены ориентровочно..
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения