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

stm32f4 mem->dma->gpio.odr tim6

Здравствуйте.
идея простая и проверенная.
тикаем таймером, он генерит запрос DMA по которому DMA перекладывает из циклического буфера данные в GPIO->ODR.
если взять TIM8 DMA2_stream1_chanal7 то все бодро работает и можно сделать например программный шим и много прочего полезного без вмешательств проца.
TIM8 жалко для тупого переполнения и генерации запроса DMA.
попробsвал на "дешевом" TIM6 и DMA1_stream1_chanal7 - DMA отваливается с выставлением флага transfer_error. то есть схема та же .. но не работает.
в документации четко написано что модуль DMA1 - не умеет работать если оба порта прикручивать к диапазону адресов памяти. оди обязательно в диапазоне переферии должен быть.
может gpio->odr "не совсем" переферия?

где я даташит недочитал?

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


Ссылка на сообщение
Поделиться на другие сайты
GPIO сидит на шине AHB1, туда DMA1 не может дотянуться.
Можно схитрить. Например, у таймеров бывают режимы, которые позволяют управлять ногой CHx через регистр таймера.

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


Ссылка на сообщение
Поделиться на другие сайты
>GPIO сидит на шине AHB1, туда DMA1 не может дотянуться.
Точно!!! я эти грабли уже получал, и забыл.

>Можно схитрить. Например, у таймеров бывают режимы, которые позволяют управлять ногой CHx через регистр таймера.
это да, но мне сразу 16 синхронных шимов надо сделать.

спасибо.

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


Ссылка на сообщение
Поделиться на другие сайты
Не спец по F4, даташит не читал, но в порядке выдвижения гипотезы: в Вашем кристалле TIM6 точно присутствует? Например, по опыту с F0 - TIM6, TIM7 - "редкие" таймеры, присутствуют только в "жирных" камнях, а в базовых и малоногих приходится довольствоваться TIM1,3,14,16,17. Может быть обращаетесь к не реализованному на данном кристалле таймеру?

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(klen @ Jan 25 2018, 15:49) <{POST_SNAPBACK}>
это да, но мне сразу 16 синхронных шимов надо сделать.

А то что Ваш ШИМ будет иметь приличный джиттер - не смущает?

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(jcxz @ Jan 25 2018, 20:34) <{POST_SNAPBACK}>
А то что Ваш ШИМ будет иметь приличный джиттер - не смущает?

То же люблю делать ШИМ черезтДМА.
Объясните по-русски что такое "джиттер"? Может колебания частоты?

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MiklPolikov @ Jan 25 2018, 20:27) <{POST_SNAPBACK}>
То же люблю делать ШИМ черезтДМА.
Объясните по-русски что такое "джиттер"? Может колебания частоты?

У Вас DMA что делает? Пишет в регистры управления GPIO пинами? Чтобы импульсы ШИМ определённой длительности сгенерить?
А теперь подумайте, что будет если таймер выставил запрос обслуживания к DMA, а в этот момент CPU выполняет команду PUSH {R0-R12,LR} ?
Как изменится длительность импульса ШИМ?
А если работают ещё и другие bus-masters и они тоже к шине обращаются?
Вот тогда и получите джиттер - длительность импульсов ШИМа будет болтаться.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(jcxz @ Jan 25 2018, 22:02) <{POST_SNAPBACK}>
У Вас DMA что делает? Пишет в регистры управления GPIO пинами? Чтобы импульсы ШИМ определённой длительности сгенерить?
А теперь подумайте, что будет если таймер выставил запрос обслуживания к DMA, а в этот момент CPU выполняет команду PUSH {R0-R12,LR} ?
Как изменится длительность импульса ШИМ?
А если работают ещё и другие bus-masters и они тоже к шине обращаются?
Вот тогда и получите джиттер - длительность импульсов ШИМа будет болтаться.


приоритет на шине у DMA-стрима выставляем very-high. у CPU мастера ahb он аппаратно равен на один уровень ниже - high, так специально придумали чтобы DMA можно былобы пускать вперед (но есть ограничение - не перманентно, если перегрузить шину запросами мастера c приоритетом very-high то как я помню на 4 транзакции все равно процу дадут доступ на одну транзакцию.) поэтому PUSH {R0-R12,LR} страшен не сильно при наличии не перегруза ahb шины.

болтатся может - но в моем случае это не очень важно. точность такого шима приемлемая - главное требование - много штук одновременно.
закодю померю джиттер раскажу что получилось.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(klen @ Jan 25 2018, 22:56) <{POST_SNAPBACK}>
приоритет на шине у DMA-стрима выставляем very-high. у CPU мастера ahb он аппаратно равен на один уровень ниже - high, так специально придумали чтобы DMA можно былобы пускать вперед (но есть ограничение - не перманентно, если перегрузить шину запросами мастера c приоритетом very-high то как я помню на 4 транзакции все равно процу дадут доступ на одну транзакцию.) поэтому PUSH {R0-R12,LR} страшен не сильно при наличии не перегруза ahb шины.

А где в мануале STM32F4 можно найти табличку с уровнями приоритета разных bus-masters? Что-то я не нахожу такую, подскажите.
Да и интересно: CPU команду PUSH {R0-R12,LR} выполнит отдельными транзакциями через арбитра или одной burst-транзакцией? Если 2-е - тогда будет хуже.

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


Ссылка на сообщение
Поделиться на другие сайты
Ага, по русски "джиттер" это "колебания периода".
Один раз видел, когда запустил DMA в режиме m2m , и он тупо занял всю системную шину.
Если по таймеру - то всё чётко.
Т.е. на практике проблемы нет.
И ШИМ через ДМА очень полезен, я таким образом динамическое управление цифровыми индикаторами делаю и много всего другого.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MiklPolikov @ Jan 26 2018, 00:26) <{POST_SNAPBACK}>
Ага, по русски "джиттер" это "колебания периода".

Это не "колебания периода", а дрожание чего угодно. Кроме периода у цифрового сигнала есть и другие параметры, скважность например.

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


Ссылка на сообщение
Поделиться на другие сайты
ну вобщем получилось.
240кГц, 50 отсчетов скважности, это примерно 5.6 битный цап. 16 каналов.
работает довольно дубово, то есть хорошо.
у меня предназначено для управления 16 ключами в зарядной станции. что бы все ключи не втыкались одновременно, фазы включения разнесены со сдвигом на 1/16 периода. частоту несущей меняю по псевтослучайному закону в близи 240кгц перегружая регистр аrr , это размазывает спектр помех и убирает пики гармоник.
проц учавствует в этом только когда нужно изменить скажности каналов.
и никаких прерываний.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(klen @ Jan 30 2018, 00:25) <{POST_SNAPBACK}>
240кГц, 50 отсчетов скважности, это примерно 5.6 битный цап. 16 каналов.
работает довольно дубово, то есть хорошо.
у меня предназначено для управления 16 ключами в зарядной станции. что бы все ключи не втыкались одновременно, фазы включения разнесены со сдвигом на 1/16 периода. частоту несущей меняю по псевтослучайному закону в близи 240кгц перегружая регистр аrr , это размазывает спектр помех и убирает пики гармоник.
проц учавствует в этом только когда нужно изменить скажности каналов.
и никаких прерываний.

Жесть какая! Такой паровоз на квадратных колёсах. laughing.gif
Никаких прерываний, зато непрерывный DMA-поток и к тому же - накладывающий ограничения на другие процессы. У вас в устройстве больше ничего кроме этого паровоза нет?
А какой практический смысл было городить такое, а не взять просто более подходящий МК с достаточным количеством аппаратных ШИМ-ов?
И сделать всё с характеристиками на порядок лучше, а не на уровне ардуины.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(jcxz @ Jan 30 2018, 02:24) <{POST_SNAPBACK}>
А какой практический смысл было городить такое, а не взять просто более подходящий МК с достаточным количеством аппаратных ШИМ-ов?
И сделать всё с характеристиками на порядок лучше, а не на уровне ардуины.

лучше что?
какой мк имеет 32 аппаратных канала шим?
в моем случае это самы подходящий вариант, дешево и быстро.
никаких ограничений на другие процессы не присутствуют, предположительно переферийная шина нагружена каждую 13 транзакцию, ahb каждую 52 (с 16 каналами)
это же не цап прецизионный, это балансир-зарядник, чем прще тем надежней. таймеры и процессор - это я экономлю для великих задач.
к стати, во время войны паровоз спасет промышленность.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(klen @ Jan 30 2018, 07:38) <{POST_SNAPBACK}>
какой мк имеет 32 аппаратных канала шим?

А у Вас разве 32? 16 вроде wink.gif
Например Infineon XMC4500 или XMC4700 имеют по 8 продвинутых таймеров, в каждом таймере к регистру-счётчику привязаны по 2 compare-регистра, каждый compare - с двумя выводами на пины МК.
Т.е. - уже можно 16 двухтактных ШИМов сделать (а не однотактных как у Вас).
А ещё в каждом МК есть 16 простых таймеров, содержащих каждый по одному compare-регистру с одним выходом - это ещё 16 однотактных ШИМов.
И каждый работает на <= 120/144 МГц (а не 240кГц), имеет разрядность 16 бит (а не 5.5), имеют встроенное аппаратное дрожание (для размазывания спектра), имеют center-aligned режим ШИМа (а не только edge), продвинутые таймеры имеют кроме того аппаратный dead-time и много других фич.
И это всё - без всяких DMA и с полностью свободной шиной.

Поэтому мне и кажется Ваш выбор МК, для такой задачи, странным.

Цитата(klen @ Jan 30 2018, 07:38) <{POST_SNAPBACK}>
никаких ограничений на другие процессы не присутствуют, предположительно переферийная шина нагружена каждую 13 транзакцию, ahb каждую 52 (с 16 каналами)

Это всё в теории. В таких системах где необходима жёсткая привязка работы к реалтайму, как показывает практика, добавлять что-то очень сложно - вдруг начинает рушиться работа этого реалтайма и начинает иногда сбоить. Несмотря на теоретические выкладки laughing.gif

PS: Вы мне так и не ответили на мой вопрос, где Вы смотрите таблицу приоритетов доступа к шине разных bus-мастеров для STM32F4? Я что-то не нашёл.... sad.gif

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация