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

STM32F4 как уменьшить время входа в обработчик прерывания

1 hour ago, ViKo said:

А FPU регистры там, случайно, не сохраняются? 

Точно, спасибо за наводку.

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


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

11 минут назад, Алексей ВМ сказал:

Спасибо! Именно это я и хотел услышать - менять параметры таймера не в обработчике прерывания DMA, а по другому событию и в другом месте. Только немного непонятно - у меня таймер используется под DMA. О каком update event идет речь?

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

 

PS: Мля - как всегда - условия задачи меняются на ходу на совершенно другие.... :russian_ru:

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


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

32 минуты назад, Алексей ВМ сказал:

О каком update event идет речь?

Я предполагал что таймер отсчитывает несколько (RCR+1) периодов длительностью ARR+1 и только после этого случается update event у таймера. По нему таймер переписывает данные из буферных регистров в рабочие и по нему же активируется очередной цикл пересылки второго DMA.  Разрешается битом UDE в регистре DIER.

Первый DMA тогда нужно запускать от другого события, например от события сравнения с CCR1, этот запрос DMA разрешается битом CC1DE в регистре DIER.

 

Совсем не обязательно всё время разбивать на периоды по 50нс. Достаточно удлинить слишком короткие интервалы за счёт следующих.

В предыдущем примере "..., 50нс, 500нс" заменяется на "..., 2х50нс, 450нс".

Записей от второго DMA по прежнему две (смотрите где стоят запятые), но теперь у него есть на это не 50нс, а целых 100.

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


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

2 hours ago, jcxz said:

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

 

PS: Мля - как всегда - условия задачи меняются на ходу на совершенно другие.... :russian_ru:

Я наверно как-то коряво объясняю свою проблему.

Надо выводить на пины  порта сигналы пачками разной длительности. В пачке 68 импульсов одинаковой длительности - клоки и дата, всего 10 сигналов, соответственно размер буферов DMA 68 слов. Период импульса формируется таймером, по которому с помощью DMA и выдаются данные на пины. Сущестует 4 периода импульса - 50 нс, 120 нс, 250 нс и 500 нс, то есть сначала выдаем пачку импульсов с периодом 50 нс, затем 120, 250, 500, затем опять 50.  Умножаем на 68 - получаем, что прерывания от DMA (TC) возникают, в зависимости от периода таймера, через 3.4 мкс, 8 мкс, 17 мкс и 34 мкс. Сейчас я меняю период таймера в обработчике прерывания DMA, в котором, помимо этого, формируется теневой буфер данных для отправки, всё это занимает порядка 2 мкс. Проблема в том, что когда я захожу в обработчик прерывания DMA, чтобы изменить период таймера, он уже выдает новую пачку данных с предыдущим периодом из-за латентности входа в обработчик. Тоже самое описано в стартовом посте, чуть лаконичнее.

Что мне нужно - таймер отсчитал 68 раз с заданным периодом, и только после этого необходимо записать в него другое значение периода, лучше аппаратно. Advanced-control timers вроде как позволяют это сделать, у них есть RCR.

 

Или можно на update event таймера повесить запись по DMA нового периода?

 

Тогда все равно есть непонятные моменты

 

Сейчас у меня для дерганья пинов используется DMA2 request Channel 6 Stream 5 - TIM1_UP. По есть по событию update TIM1 каждые 50, 120, 250 или 500 нс на порт выдается новая порция данных. Как сюда ещё вкрячить изменения периода?

 

Изменено пользователем Алексей ВМ

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


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

8 minutes ago, mcheb said:

Получается, надо выдавать данные с частотой 100 МГц. А это уже ПЛИС.

Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется. Затык с переинициализацией таймера на ходу.

Изменено пользователем Алексей ВМ

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


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

Just now, Алексей ВМ said:

Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется.

 

Это при условии, что больше ничего серьезного ему делать не нужно ))

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


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

3 minutes ago, Forger said:

Это при условии, что больше ничего серьезного ему делать не нужно ))

Это DMA с двойным буфером. Грузи данные раз в несколько мкс и все.

Изменено пользователем Алексей ВМ

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


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

Just now, Алексей ВМ said:

Это DMA

А прерывания которые без вариантов должны прерывать все остальное?

Не, если камень используется только как ПЛИС и прошивка уже закончена и развиваться никогда не будет, то вполне годное решение.

В противном случае лютый геморрой программисту обеспечен :dirol:

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


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

Есть ещё обмен по уарту, и больше никаких прерываний. По сути, да, STM большую часть времени  используется как ПЛИС.

Изменено пользователем Алексей ВМ

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


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

Just now, Алексей ВМ said:

Есть ещё обмен по уарту, и больше никаких прерываний.

А в будущем что-то будет добавляться в код? Протокол усложняться по тому же "уарту" или еще чтото?

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


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

17 минут назад, Алексей ВМ сказал:

Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется. Затык с переинициализацией таймера на ходу.

Не будет у Вас с таким алгоритмом точности 50 нс. Никак. Так как это - МК. DMA здесь нельзя использовать для задания временных задержек. Потому что DMA использует шину. Совместно с другими bus-master-ами в системе. Соответственно - на время установления состояния на пинах будет влиять загрузка шины. К тому же приоритет доступа DMA-контроллера шины - как правило ниже чем у процессора, начнёт скажем процессор что-то читать активно по шины - DMA будет ждать. Сооветственно - все ваши времянки будут плавать.

Уже сто раз это обсуждалось здесь и на других форумах....  :russian_ru:

Ну или определите точность задания времянок. А то может Вам достаточно 50нс +-10нс. Тогда может ещё как-то кое-как и будет работать.

Для формирования временных диаграмм сигналов использовать нужно соответствующую периферию, например ШИМ. Почему не использовали ШИМ?

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


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

По мелочи если только. Протокол в части добавления новых команд, но объем обмена данными небольшой. Основной функционал - выдача на пины сигналов. Есть ещё редкое- раз в неск секунд - чтение данных из SPI памяти и обработка этих данных, но логика обработки относительно простая.

Изменено пользователем Алексей ВМ

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


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

2 minutes ago, Алексей ВМ said:

По мелочи если только. Протокол в части добавления новых команд, но объем обмена данными небольшой. Основной функционал - выдача на пины сигналов. Есть ещё редкое- раз в неск секунд - чтение данных из SPI памяти и обработка этих данных, но логика обработки относительно простая.

 

я бы сделал простую плату под дешевую плис и тупо клеил ее чуть не прямо на контроллер, типа мезонин.

Такое неоднократно видел в серийных изделия военного назначения, главное - правильный клей, лак и испытания ))

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


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

7 minutes ago, jcxz said:

Не будет у Вас с таким алгоритмом точности 50 нс. Никак. Так как это - МК. DMA здесь нельзя использовать для задания временных задержек. Потому что DMA использует шину. Соответственно - на время установления состояния на пинах будет влиять загрузка шины. К тому же приоритет доступа DMA-контроллера шины - как правило ниже чем у процессора, начнёт скажем процессор что-то читать активно по шины - DMA будет ждать. Сооветственно - все ваши времянки будут плавать.

Уже сто раз это обсуждалось здесь и на других форумах....  :russian_ru:

Ну или определите точность задания времянок. А то может Вам достаточно 50нс +-10нс. Тогда может ещё как-то кое-как и будет работать.

Для формирования временных диаграмм сигналов использовать нужно соответствующую периферию, например ШИМ. 

Точность +- 10 нс для наименьшего периода 50 нс, меньше не нужна. По сути, это параллельная шина с 10 сигналами, один из которых клок. ШИМ, к сожалению, здесь не прокатит...

3 minutes ago, Forger said:

я бы сделал простую плату под дешевую плис и тупо клеил ее чуть не прямо на контроллер, типа мезонин.

Такое неоднократно видел в серийных изделия военного назначения, главное - правильный клей, лак и испытания )) 

Платы уже вовсю клепают...

Изменено пользователем Алексей ВМ

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


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

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

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

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

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

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

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

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

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

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