adnega 11 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Я кубом не пользуюсь совсем. Через регистры быстрее во всех смыслах. Но ни к чему не призываю. 1 час назад, jcxz сказал: 1) Если источник прерывания на данном векторе единственный; 2) если этот флаг программист не очищал где-то помимо этого ISR (криво, так что флаг в регистре периферии очистился, а в pending-регистре NVIC - остался); 3) если не генерил этого прерывания программно (через соответствующий регистр NVIC) Если это всё выполняется - то должен быть установлен на входе в ISR. Создаете прерывание таймера по переполнению. В самом конце обработчика сбрасываете UIF флаг таймера. Увидите, что в прерывание будет заходить в два раза чаще: один раз с взведенным UIF, второй раз со сброшенным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Таких косяков вроде не было. Я LL ками пользуюсь . Как то привык к ним. Но и регистрами тоже. Просто вот эти настройки ввода вывода, альтернативные дела, меня очень напрягает. Поэтому это в кубе, пусть сам думает) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба 6 минут назад, adnega сказал: Создаете прерывание таймера по переполнению. В самом конце обработчика сбрасываете UIF флаг таймера. Увидите, что в прерывание будет заходить в два раза чаще: один раз с взведенным UIF, второй раз со сброшенным. Намекаете на то, что командой очистки флаг может не успеть сброситься до выходе (из-за write buffer) и будет повторный вход? Так это просто некорректный способ сброса для данного флага. И надо флаг сбрасывать в начале ISR, и в каких-то МК ещё нужно и ставить барьер или операцию обратного чтения регистра статуса. Естественно, что если сделать криво, то может быть всё что угодно. Я же имел в виду случай "если код написан корректно". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Но сейчас другая проблема. Не сбрасываются флаги прерываний.))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба 1 минуту назад, jcxz сказал: Намекаете на то, что командой очистки флаг может не успеть сброситься до выходе (из-за write buffer) и будет повторный вход? Да. Поэтому лучше к правильному коду относить и тот, который содержит проверку установленного флага прерывания. Только что, khlenar сказал: Но сейчас другая проблема. Не сбрасываются флаги прерываний.))) Они сбрасываются, но тут же устанавливаются: у вас 4 измерения проходят за (19.5+12.5) * 4 = 128 тактов АЦП. Если у вас частота АЦП четверть от FPLL=72 МГц, то прерывания будут возникать каждые 7 мкс или 512 тактов ядра. Нужно: понижать частоту тактирования АЦП, и/или увеличивать время семплирования, и/или увеличивать размер кольца DMA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Хорошо. Сейчас попробую понизить.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба 2 минуты назад, adnega сказал: Да. Поэтому лучше к правильному коду относить и тот, который содержит проверку установленного флага прерывания. Так может лучше код правильно писать? Чтобы не нужно было костылей в виде лишних проверок и ненужных затрат времени исполнения на ложные прерывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба 7 минут назад, jcxz сказал: Так может лучше код правильно писать? Чтобы не нужно было костылей в виде лишних проверок и ненужных затрат времени исполнения на ложные прерывания? Конечно код нужно писать правильно, но лишние проверки не помешают. В подавляющем большинстве случаев это никак не сказывается на производительности. Поэтому не рекомендую экономить на спичках. А если код прерывания супер-критичный к быстродействию, то нужно задуматься над архитектурой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба Да, прдделитель на 4 поставил, работает. Но все равно нужно наверное уменьшать. А то вывод на дисплей как то цифры замораживаются и некоторые разряды временно исчезают) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 6 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба 4 часа назад, khlenar сказал: Сейчас покушаю...)) Автор, Вы тут что, блог ведёте?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 2 февраля, 2022 Опубликовано 2 февраля, 2022 · Жалоба 57 минут назад, Herz сказал: Автор, Вы тут что, блог ведёте?! Нет. Что я не потерялся имелось ввиду... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Доброго утра. Я тут немного поэксперементировал и офигел). Короче. У АЦП есть кубовская стандартная инициализация void MX_ADC1_Init(void). Так вот с ней АЦП не работает потому что не устанавливаются некоторые регистры. Хотя стандартные LL макросы присутствуют. Это видно из моих выше приведенных картинок. Если я создаю свою функцию инициализации например ADC1init и вставляю туда полную копию тела из void MX_ADC1_Init(void) вот один к одному в том же файле и этой функцией ADC1init инициализирую АЦП (void MX_ADC1_Init(void) отключаю соответственно), то все нормально работает. Блин, это как это понимать ?? Нет, он ведь заходит в эту стандартную функцию. Я по шагам проверял. А макросы не работают. А тоже самое скопированное в другую функцию работает. Какая то магия )) Вспоминается мне, давно какая то шняга была. Т.е. стандартная функция с каким то именем присутсвовала в каком то другом стандартном файле. Надо поискать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Короче. Все понятно. Все зависит от последовательности расположений файлов инициализаций. там вот как /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI2_Init(); MX_I2C1_Init(); // MX_ADC1_Init(); // MX_ADC2_Init(); MX_TIM2_Init(); MX_DMA_Init(); MX_TIM3_Init(); MX_ADC1_Init(); Они стояли где сейчас закоментированы. Ниже, как сейчас стоит поставил, все нормально стало. Интересно, это из за MX_DMA_Init(); что ли?) И еще такая шняга с АЦП. Входа возбуждаются всякие гармоники, и пр. Хотя я подтянул резистором 10к к земле, там на входах гармоники амплитудой 2В. И они как то влияют друг на друга. Опорное напряжение чистое нормальное 3В. Такое впечатление, что входа не аналоговые. Ерунда какая то.( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба 2 часа назад, khlenar сказал: И еще такая шняга с АЦП. Входа возбуждаются всякие гармоники, и пр. Хотя я подтянул резистором 10к к земле, там на входах гармоники амплитудой 2В. И они как то влияют друг на друга. Опорное напряжение чистое нормальное 3В. Такое впечатление, что входа не аналоговые. Ерунда какая то.( Это не гармоники, а конденсатор выборки-хранения работает аж на 4 канала. Или время сэмплирования по-максимуму увеличивайте и/или керамику 100 нФ на каждый АЦП вход вешайте (вторую обкладку на GND). В DS есть зависимость входного сопротивления от сэмплирования - чем быстрее, тем сопротивление увеличивается, и нужен какой-то буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 3 февраля, 2022 Опубликовано 3 февраля, 2022 · Жалоба Я предполагал , что это семплирование. Но не думал, что с таким эффектом)) Но почему же вход подтянутый к земле через 10к имеет почти максимальное значение ? неужели такое маленькое сопротивление по входу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться