В прерывании по окончании измерений вычисляются средние значения с двух каналов АЦП. Для доступа к ним из процедур расчета и захотелось добавить 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 цены ориентровочно..
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения