Jump to content

    

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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 нс на порт выдается новая порция данных. Как сюда ещё вкрячить изменения периода?

 

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
8 minutes ago, mcheb said:

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

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

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
Just now, Алексей ВМ said:

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

 

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

Share this post


Link to post
Share on other sites
3 minutes ago, Forger said:

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

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

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
Just now, Алексей ВМ said:

Это DMA

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
Just now, Алексей ВМ said:

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

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

Share this post


Link to post
Share on other sites
17 минут назад, Алексей ВМ сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
2 minutes ago, Алексей ВМ said:

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

 

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

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

Share this post


Link to post
Share on other sites
7 minutes ago, jcxz said:

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

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

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

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

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

3 minutes ago, Forger said:

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

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

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

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now