Перейти к содержанию
    

Нужна помощь по ADC stm32f303 )

Я кубом не пользуюсь совсем. Через регистры быстрее во всех смыслах. Но ни к чему не призываю.

1 час назад, jcxz сказал:

1) Если источник прерывания на данном векторе единственный;

2) если этот флаг программист не очищал где-то помимо этого ISR (криво, так что флаг в регистре периферии очистился, а в pending-регистре NVIC - остался);

3) если не генерил этого прерывания программно (через соответствующий регистр NVIC)

Если это всё выполняется - то должен быть установлен на входе в ISR.

Создаете прерывание таймера по переполнению. В самом конце обработчика сбрасываете UIF флаг таймера. Увидите, что в прерывание будет заходить в два раза чаще: один раз с взведенным UIF, второй раз со сброшенным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таких косяков вроде не было. Я LL ками пользуюсь . Как то привык к ним. Но и регистрами тоже. Просто вот эти настройки ввода вывода, альтернативные дела, меня очень напрягает. Поэтому это в кубе, пусть сам думает)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, adnega сказал:

Создаете прерывание таймера по переполнению. В самом конце обработчика сбрасываете UIF флаг таймера. Увидите, что в прерывание будет заходить в два раза чаще: один раз с взведенным UIF, второй раз со сброшенным.

Намекаете на то, что командой очистки флаг может не успеть сброситься до выходе (из-за write buffer) и будет повторный вход?

Так это просто некорректный способ сброса для данного флага. И надо флаг сбрасывать в начале ISR, и в каких-то МК ещё нужно и ставить барьер или операцию обратного чтения регистра статуса.

Естественно, что если сделать криво, то может быть всё что угодно. Я же имел в виду случай "если код написан корректно".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но сейчас другая проблема. Не сбрасываются флаги прерываний.))) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jcxz сказал:

Намекаете на то, что командой очистки флаг может не успеть сброситься до выходе (из-за write buffer) и будет повторный вход?

Да. Поэтому лучше к правильному коду относить и тот, который содержит проверку установленного флага прерывания.

Только что, khlenar сказал:

Но сейчас другая проблема. Не сбрасываются флаги прерываний.))) 

Они сбрасываются, но тут же устанавливаются: у вас 4 измерения проходят за  (19.5+12.5) * 4 = 128 тактов АЦП.

Если у вас частота АЦП четверть от FPLL=72 МГц, то прерывания будут возникать каждые 7 мкс или 512 тактов ядра.

Нужно: понижать частоту тактирования АЦП, и/или увеличивать время семплирования, и/или увеличивать размер кольца DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, adnega сказал:

Да. Поэтому лучше к правильному коду относить и тот, который содержит проверку установленного флага прерывания.

Так может лучше код правильно писать? Чтобы не нужно было костылей в виде лишних проверок и ненужных затрат времени исполнения на ложные прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, jcxz сказал:

Так может лучше код правильно писать? Чтобы не нужно было костылей в виде лишних проверок и ненужных затрат времени исполнения на ложные прерывания?

Конечно код нужно писать правильно, но лишние проверки не помешают. В подавляющем большинстве случаев это никак не сказывается на производительности. Поэтому не рекомендую экономить на спичках. А если код прерывания супер-критичный к быстродействию, то нужно задуматься над архитектурой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, прдделитель на 4 поставил, работает. Но все равно нужно наверное уменьшать. А то вывод на дисплей как то цифры замораживаются и некоторые разряды временно исчезают)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, Herz сказал:

Автор, Вы тут что, блог ведёте?!

Нет. Что я не потерялся имелось ввиду...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго утра. Я тут немного поэксперементировал и офигел). Короче. У АЦП есть кубовская стандартная инициализация 

void MX_ADC1_Init(void). Так вот с ней АЦП не работает потому что не устанавливаются некоторые регистры. Хотя стандартные LL макросы присутствуют. Это видно из моих выше приведенных картинок. Если я создаю свою функцию инициализации например ADC1init и

вставляю туда полную копию тела из void MX_ADC1_Init(void) вот один к одному в том же файле и этой функцией ADC1init инициализирую АЦП (void MX_ADC1_Init(void) отключаю соответственно), то все нормально работает. Блин, это как это понимать ??

Нет, он ведь заходит в эту стандартную функцию. Я по шагам проверял. А макросы не работают. А тоже самое скопированное в другую функцию работает. Какая то магия ))

Вспоминается мне, давно какая то шняга была. Т.е. стандартная функция с каким то именем присутсвовала в каком то другом стандартном файле. Надо поискать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Короче. Все понятно. Все зависит от последовательности расположений файлов инициализаций. там вот как

  /* 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В. Такое впечатление, что входа не аналоговые. Ерунда какая то.(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, khlenar сказал:

И еще такая шняга с АЦП. Входа возбуждаются всякие гармоники, и пр. Хотя я подтянул резистором 10к к земле, там на входах гармоники амплитудой 2В. И они как то влияют друг на друга. Опорное напряжение чистое нормальное 3В. Такое впечатление, что входа не аналоговые. Ерунда какая то.(

Это не гармоники, а конденсатор выборки-хранения работает аж на 4 канала. Или время сэмплирования по-максимуму увеличивайте и/или керамику 100 нФ на каждый АЦП вход вешайте (вторую обкладку на GND). В DS есть зависимость входного сопротивления от сэмплирования - чем быстрее, тем сопротивление увеличивается, и нужен какой-то буфер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я предполагал , что это семплирование. Но не думал, что с таким эффектом))

Но почему же вход подтянутый к земле через 10к имеет почти максимальное значение ? неужели такое маленькое сопротивление по входу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...