Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба 1 hour ago, ViKo said: А FPU регистры там, случайно, не сохраняются? Точно, спасибо за наводку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба 11 минут назад, Алексей ВМ сказал: Спасибо! Именно это я и хотел услышать - менять параметры таймера не в обработчике прерывания DMA, а по другому событию и в другом месте. Только немного непонятно - у меня таймер используется под DMA. О каком update event идет речь? Если будущие периоды таймера известны заранее, то естественно можно запустить второй канал DMA и писать через него новые значения в регистры периода таймера. И высокочастотные прерывания тогда не нужны от слова "совсем". PS: Мля - как всегда - условия задачи меняются на ходу на совершенно другие.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 (изменено) · Жалоба 2 hours ago, jcxz said: Если будущие периоды таймера известны заранее, то естественно можно запустить второй канал DMA и писать через него новые значения в регистры периода таймера. И высокочастотные прерывания тогда не нужны от слова "совсем". PS: Мля - как всегда - условия задачи меняются на ходу на совершенно другие.... Я наверно как-то коряво объясняю свою проблему. Надо выводить на пины порта сигналы пачками разной длительности. В пачке 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 нс на порт выдается новая порция данных. Как сюда ещё вкрячить изменения периода? Изменено 29 августа, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба Получается, надо выдавать данные с частотой 100 МГц. А это уже ПЛИС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 (изменено) · Жалоба 8 minutes ago, mcheb said: Получается, надо выдавать данные с частотой 100 МГц. А это уже ПЛИС. Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется. Затык с переинициализацией таймера на ходу. Изменено 29 августа, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 24 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба Just now, Алексей ВМ said: Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется. Это при условии, что больше ничего серьезного ему делать не нужно )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 (изменено) · Жалоба 3 minutes ago, Forger said: Это при условии, что больше ничего серьезного ему делать не нужно )) Это DMA с двойным буфером. Грузи данные раз в несколько мкс и все. Изменено 29 августа, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 24 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба Just now, Алексей ВМ said: Это DMA А прерывания которые без вариантов должны прерывать все остальное? Не, если камень используется только как ПЛИС и прошивка уже закончена и развиваться никогда не будет, то вполне годное решение. В противном случае лютый геморрой программисту обеспечен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 (изменено) · Жалоба Есть ещё обмен по уарту, и больше никаких прерываний. По сути, да, STM большую часть времени используется как ПЛИС. Изменено 29 августа, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 24 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба Just now, Алексей ВМ said: Есть ещё обмен по уарту, и больше никаких прерываний. А в будущем что-то будет добавляться в код? Протокол усложняться по тому же "уарту" или еще чтото? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба 17 минут назад, Алексей ВМ сказал: Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется. Затык с переинициализацией таймера на ходу. Не будет у Вас с таким алгоритмом точности 50 нс. Никак. Так как это - МК. DMA здесь нельзя использовать для задания временных задержек. Потому что DMA использует шину. Совместно с другими bus-master-ами в системе. Соответственно - на время установления состояния на пинах будет влиять загрузка шины. К тому же приоритет доступа DMA-контроллера шины - как правило ниже чем у процессора, начнёт скажем процессор что-то читать активно по шины - DMA будет ждать. Сооветственно - все ваши времянки будут плавать. Уже сто раз это обсуждалось здесь и на других форумах.... Ну или определите точность задания времянок. А то может Вам достаточно 50нс +-10нс. Тогда может ещё как-то кое-как и будет работать. Для формирования временных диаграмм сигналов использовать нужно соответствующую периферию, например ШИМ. Почему не использовали ШИМ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 (изменено) · Жалоба По мелочи если только. Протокол в части добавления новых команд, но объем обмена данными небольшой. Основной функционал - выдача на пины сигналов. Есть ещё редкое- раз в неск секунд - чтение данных из SPI памяти и обработка этих данных, но логика обработки относительно простая. Изменено 29 августа, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 24 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба 2 minutes ago, Алексей ВМ said: По мелочи если только. Протокол в части добавления новых команд, но объем обмена данными небольшой. Основной функционал - выдача на пины сигналов. Есть ещё редкое- раз в неск секунд - чтение данных из SPI памяти и обработка этих данных, но логика обработки относительно простая. я бы сделал простую плату под дешевую плис и тупо клеил ее чуть не прямо на контроллер, типа мезонин. Такое неоднократно видел в серийных изделия военного назначения, главное - правильный клей, лак и испытания )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 29 августа, 2019 Опубликовано 29 августа, 2019 (изменено) · Жалоба 7 minutes ago, jcxz said: Не будет у Вас с таким алгоритмом точности 50 нс. Никак. Так как это - МК. DMA здесь нельзя использовать для задания временных задержек. Потому что DMA использует шину. Соответственно - на время установления состояния на пинах будет влиять загрузка шины. К тому же приоритет доступа DMA-контроллера шины - как правило ниже чем у процессора, начнёт скажем процессор что-то читать активно по шины - DMA будет ждать. Сооветственно - все ваши времянки будут плавать. Уже сто раз это обсуждалось здесь и на других форумах.... Ну или определите точность задания времянок. А то может Вам достаточно 50нс +-10нс. Тогда может ещё как-то кое-как и будет работать. Для формирования временных диаграмм сигналов использовать нужно соответствующую периферию, например ШИМ. Точность +- 10 нс для наименьшего периода 50 нс, меньше не нужна. По сути, это параллельная шина с 10 сигналами, один из которых клок. ШИМ, к сожалению, здесь не прокатит... 3 minutes ago, Forger said: я бы сделал простую плату под дешевую плис и тупо клеил ее чуть не прямо на контроллер, типа мезонин. Такое неоднократно видел в серийных изделия военного назначения, главное - правильный клей, лак и испытания )) Платы уже вовсю клепают... Изменено 29 августа, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться