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

Здравствуйте.

идея простая и проверенная.

тикаем таймером, он генерит запрос 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. Может быть обращаетесь к не реализованному на данном кристалле таймеру?

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


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

это да, но мне сразу 16 синхронных шимов надо сделать.

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

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


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

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

То же люблю делать ШИМ черезтДМА.

Объясните по-русски что такое "джиттер"? Может колебания частоты?

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


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

То же люблю делать ШИМ черезтДМА.

Объясните по-русски что такое "джиттер"? Может колебания частоты?

У Вас DMA что делает? Пишет в регистры управления GPIO пинами? Чтобы импульсы ШИМ определённой длительности сгенерить?

А теперь подумайте, что будет если таймер выставил запрос обслуживания к DMA, а в этот момент CPU выполняет команду PUSH {R0-R12,LR} ?

Как изменится длительность импульса ШИМ?

А если работают ещё и другие bus-masters и они тоже к шине обращаются?

Вот тогда и получите джиттер - длительность импульсов ШИМа будет болтаться.

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


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

У Вас 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 шины.

 

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

закодю померю джиттер раскажу что получилось.

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


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

приоритет на шине у 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 , и он тупо занял всю системную шину.

Если по таймеру - то всё чётко.

Т.е. на практике проблемы нет.

И ШИМ через ДМА очень полезен, я таким образом динамическое управление цифровыми индикаторами делаю и много всего другого.

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


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

Ага, по русски "джиттер" это "колебания периода".

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

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


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

ну вобщем получилось.

240кГц, 50 отсчетов скважности, это примерно 5.6 битный цап. 16 каналов.

работает довольно дубово, то есть хорошо.

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

проц учавствует в этом только когда нужно изменить скажности каналов.

и никаких прерываний.

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


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

240кГц, 50 отсчетов скважности, это примерно 5.6 битный цап. 16 каналов.

работает довольно дубово, то есть хорошо.

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

проц учавствует в этом только когда нужно изменить скажности каналов.

и никаких прерываний.

Жесть какая! Такой паровоз на квадратных колёсах. :laughing:

Никаких прерываний, зато непрерывный DMA-поток и к тому же - накладывающий ограничения на другие процессы. У вас в устройстве больше ничего кроме этого паровоза нет?

А какой практический смысл было городить такое, а не взять просто более подходящий МК с достаточным количеством аппаратных ШИМ-ов?

И сделать всё с характеристиками на порядок лучше, а не на уровне ардуины.

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


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

А какой практический смысл было городить такое, а не взять просто более подходящий МК с достаточным количеством аппаратных ШИМ-ов?

И сделать всё с характеристиками на порядок лучше, а не на уровне ардуины.

лучше что?

какой мк имеет 32 аппаратных канала шим?

в моем случае это самы подходящий вариант, дешево и быстро.

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

это же не цап прецизионный, это балансир-зарядник, чем прще тем надежней. таймеры и процессор - это я экономлю для великих задач.

к стати, во время войны паровоз спасет промышленность.

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


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

какой мк имеет 32 аппаратных канала шим?

А у Вас разве 32? 16 вроде ;)

Например Infineon XMC4500 или XMC4700 имеют по 8 продвинутых таймеров, в каждом таймере к регистру-счётчику привязаны по 2 compare-регистра, каждый compare - с двумя выводами на пины МК.

Т.е. - уже можно 16 двухтактных ШИМов сделать (а не однотактных как у Вас).

А ещё в каждом МК есть 16 простых таймеров, содержащих каждый по одному compare-регистру с одним выходом - это ещё 16 однотактных ШИМов.

И каждый работает на <= 120/144 МГц (а не 240кГц), имеет разрядность 16 бит (а не 5.5), имеют встроенное аппаратное дрожание (для размазывания спектра), имеют center-aligned режим ШИМа (а не только edge), продвинутые таймеры имеют кроме того аппаратный dead-time и много других фич.

И это всё - без всяких DMA и с полностью свободной шиной.

 

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

 

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

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

 

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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