Size: a a a

2021 January 23

ДК

Денис Косяков... in STM32
stD
Если это всё критично, тогда нужно изначально проектировать плату так, чтобы ипользовать ножки с индивидуальными прерываниями.
Мне надо на плату кинуть 9 кнопок и на каждой должно быть прерывание. Первые 7 спокойно влезают, а оставшиеся 2 попадут или в 15_10 или в 9_5
источник

ДК

Денис Косяков... in STM32
Которые как бы уже заняты
источник

ND

Nikita D in STM32
только что сегодня писал
источник

s

stD in STM32
Денис Косяков
Которые как бы уже заняты
Попробуйте таймерами воспользоваться.
источник

ND

Nikita D in STM32
Nikita D
void EXTI15_10_IRQHandler()
{
 if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != 0x00u)
 {
   __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_12);
   ...
 }
 
 if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_15) != 0x00u)  
 {
   __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_15);
   ...
 }
}
вот
источник

ДК

Денис Косяков... in STM32
Nikita D
вот
А, сори не увидел.
источник

ДК

Денис Косяков... in STM32
Спасибо, друзья
источник

DD

Dmitriy Developer in STM32
Денис Косяков
Мне надо на плату кинуть 9 кнопок и на каждой должно быть прерывание. Первые 7 спокойно влезают, а оставшиеся 2 попадут или в 15_10 или в 9_5
В таких случаях лучше матрицу динамическую сделать, 3х3. Всего три линии прерывания понадобятся.
Или вам надо, чтобы устройство ещё и просыпаться могло от любой кнопки?
источник

DD

Dmitriy Developer in STM32
Ну или как в Ардуиновских шилдах на ацп повесить резисторную цепочку, тогда вообще одной ногой обойдетесь.
источник

А

Анатолий in STM32
Здравствуйте, уважаемые. Спасибо автору за подробные статьи. Правда некоторые вопросы после прочтения все-таки остались, но тут видимо дело не в статьях) Некоторое время назад возникла необходимость в быстром ацп и записи относительно большого массива данных, долго решать не пришлось - выбор пал на блюпилл,  написал в ардуино иде под него скетч и , очудо, всё заработало. Теперь сидя на локдауне начал потихоньку разбираться с стм32, осваивать кубиде и решил в качестве одного из первых проектов после  блинка и хеловорлда переписать имеющийся код с помошью HAL. Возможностей открылось море: ДМА, установка времени преобразования, калибровка и т.д.  Суть старого кода такова: в предварительный массив  записываются данные из ацп, там от них отбрасываются по 2 больших и 2 меньших значения, после чего результат усредняется и записывается в первую ячейку второго массива. во втором массиве значения пишутся в первые несколько ячеек сдвигаясь назад при добавлении нового значения, при каждом измерении новое значение сравнивается с заранее установленным пороговым значением и как только оно его превысит запись продолжается уже без сдвига в остальные ячейки массива до полного его заполнения (без этих танцев начало графика получаемого из второго массива выходит обрезанным), по заполнению второго массива измерения останавливаются и его данные передаются на пк через сериал. Теперь собственно вопросы: можно ли как-то уменьшить кол-во манипуляций с массивами средствами HAL? как лучше организовать сбор и отправку данных: через прерывания , ДМА, еще как-то? если попытаться увеличить кол-во каналов измерений до трех чтобы они синхронно писали 3 графика, как это лучше сделать? на ардуино почти все работало через цикл "for", но что-то мне кажется, что есть решения покрасивше.
источник

ДК

Денис Косяков... in STM32
Dmitriy Developer
В таких случаях лучше матрицу динамическую сделать, 3х3. Всего три линии прерывания понадобятся.
Или вам надо, чтобы устройство ещё и просыпаться могло от любой кнопки?
Что понимать под динамической матрицей? Схемку можно?
источник

ДК

Денис Косяков... in STM32
Анатолий
Здравствуйте, уважаемые. Спасибо автору за подробные статьи. Правда некоторые вопросы после прочтения все-таки остались, но тут видимо дело не в статьях) Некоторое время назад возникла необходимость в быстром ацп и записи относительно большого массива данных, долго решать не пришлось - выбор пал на блюпилл,  написал в ардуино иде под него скетч и , очудо, всё заработало. Теперь сидя на локдауне начал потихоньку разбираться с стм32, осваивать кубиде и решил в качестве одного из первых проектов после  блинка и хеловорлда переписать имеющийся код с помошью HAL. Возможностей открылось море: ДМА, установка времени преобразования, калибровка и т.д.  Суть старого кода такова: в предварительный массив  записываются данные из ацп, там от них отбрасываются по 2 больших и 2 меньших значения, после чего результат усредняется и записывается в первую ячейку второго массива. во втором массиве значения пишутся в первые несколько ячеек сдвигаясь назад при добавлении нового значения, при каждом измерении новое значение сравнивается с заранее установленным пороговым значением и как только оно его превысит запись продолжается уже без сдвига в остальные ячейки массива до полного его заполнения (без этих танцев начало графика получаемого из второго массива выходит обрезанным), по заполнению второго массива измерения останавливаются и его данные передаются на пк через сериал. Теперь собственно вопросы: можно ли как-то уменьшить кол-во манипуляций с массивами средствами HAL? как лучше организовать сбор и отправку данных: через прерывания , ДМА, еще как-то? если попытаться увеличить кол-во каналов измерений до трех чтобы они синхронно писали 3 графика, как это лучше сделать? на ардуино почти все работало через цикл "for", но что-то мне кажется, что есть решения покрасивше.
Насчет массивов вряд ли скажу что-то кроме того, что ацп может с помощью дма писать в массив и в коллбеке dma можно поднять какой то флаг что запись закончилась или типа того. Насчет синхронного рисования графиков. По идее есть инжектированные каналы и в коллбеках каждого из них можно слать сигнал в комп. Насколько синхронно это получится сказать не могу. Вроде про инжектированные каналы статьи есть
источник

DD

Dmitriy Developer in STM32
Денис Косяков
Что понимать под динамической матрицей? Схемку можно?
По столбцам (вертикальным соединениям) пробегает единичка (или ноль), организованная таймером, а строки (горизонтальные соединения) настраиваете на прерывания.
В момент прерывания нужно проверить, какой столбец в данный момент активен.
Логику можно перевернуть - роль столбцов и строк поменять местами.
источник

ДК

Денис Косяков... in STM32
Ну если rc цепочки поставить на кнопки, тем самым избавишись от дребезга, то решение классное. Но мне это не очень подходит. Решаю дребезг отключая прерывания после фронта на 50 мс. Но дребезг это ладно. А если я одновременно нажму 2 кнопки и они на разных столбцах? Одна из них тупо не считается
источник

ДК

Денис Косяков... in STM32
Имхо
источник

А

Анатолий in STM32
Анатолий
Здравствуйте, уважаемые. Спасибо автору за подробные статьи. Правда некоторые вопросы после прочтения все-таки остались, но тут видимо дело не в статьях) Некоторое время назад возникла необходимость в быстром ацп и записи относительно большого массива данных, долго решать не пришлось - выбор пал на блюпилл,  написал в ардуино иде под него скетч и , очудо, всё заработало. Теперь сидя на локдауне начал потихоньку разбираться с стм32, осваивать кубиде и решил в качестве одного из первых проектов после  блинка и хеловорлда переписать имеющийся код с помошью HAL. Возможностей открылось море: ДМА, установка времени преобразования, калибровка и т.д.  Суть старого кода такова: в предварительный массив  записываются данные из ацп, там от них отбрасываются по 2 больших и 2 меньших значения, после чего результат усредняется и записывается в первую ячейку второго массива. во втором массиве значения пишутся в первые несколько ячеек сдвигаясь назад при добавлении нового значения, при каждом измерении новое значение сравнивается с заранее установленным пороговым значением и как только оно его превысит запись продолжается уже без сдвига в остальные ячейки массива до полного его заполнения (без этих танцев начало графика получаемого из второго массива выходит обрезанным), по заполнению второго массива измерения останавливаются и его данные передаются на пк через сериал. Теперь собственно вопросы: можно ли как-то уменьшить кол-во манипуляций с массивами средствами HAL? как лучше организовать сбор и отправку данных: через прерывания , ДМА, еще как-то? если попытаться увеличить кол-во каналов измерений до трех чтобы они синхронно писали 3 графика, как это лучше сделать? на ардуино почти все работало через цикл "for", но что-то мне кажется, что есть решения покрасивше.
Насколько я понимаю, самый быстрый способ и вдобавок дающий максимальную синхронность по входам ацп - запись в массив через ДМА. Пока видится так (для 3 входов): записываем через ДМА значения с трех входов ацп в массив скажем на 30 или 150 или 300 значений, разбираем его в 3 другие массива через цикл "for" с дополнительной переменной которая показывает в какой массив переносить конкретную ячейку ИЛИ запустить  цикл "for" трижды каждый раз для нового  массива в который будут переноситься данные, при этом увеличивать счетчик ячеек в  цикле "for" не на 1, а на 3, и при смене конечного массива менять стартовую ячейку исходного массива. после чего начинаем работать с данными в отдельных массивах для каждого канала. Тогда при новой выборке если не останавливать циклическую запись АЦП и ДМА совпадут ли ячейки первого массива по каналам с предыдущей выборкой или нужно что-то из этого останавливать и снова запускать?
источник

DD

Dmitriy Developer in STM32
Денис Косяков
Ну если rc цепочки поставить на кнопки, тем самым избавишись от дребезга, то решение классное. Но мне это не очень подходит. Решаю дребезг отключая прерывания после фронта на 50 мс. Но дребезг это ладно. А если я одновременно нажму 2 кнопки и они на разных столбцах? Одна из них тупо не считается
Почему же - ещё как считается.
источник

DD

Dmitriy Developer in STM32
Сработают два прерывания, и каждое даст свой результат.
источник

ДК

Денис Косяков... in STM32
Dmitriy Developer
Почему же - ещё как считается.
Даже если прерывание выключено, потому что так создается антидребезг?
источник

DD

Dmitriy Developer in STM32
Для борьбы с дребезгом не обязательно выключать прерывание.
Через программный счетчик / таймер не пропускать повторное нажатие раньше определенного промежутка времени.
источник