Jump to content

    
Apollo

Написание программы и одновременно наладка железа на STM32F091

Recommended Posts

14 minutes ago, jcxz said:

PS: Ни о каких "строгих таймингах" в этом случае и речи быть не может. Ну разве что если только остановить ядро и выключить все другие DMA-каналы и прочие bus-мастеры. Но в этом случае теряется смысл использования DMA.

Ну смотря что считать строгим таймингом +- 1-2 такта шины вряд ли будут критичными. И насчёт остальных каналов DMA: есть возможность настройки правильных приоритетов.

1 hour ago, adnega said:

Настраиваем 3 канала совпадения (можно и два, если очень захотеть).

Первый записывает через DMA лог "1" во все нужные пины GPIOx->BSRR (это может быть UP-событие).

Второй канал через 0.35 мкс записывает значение в GPIOx->BSRR из специального массива M[0].

Третий канал через 0.9 мкс записывает значение в GPIOx->BSRR из специального массива M[1].

Задача подготовить два 32-(можно и 16-)битных массива M[0] и M[1], по одному элементу на каждый бит.

Т.е. размер в элементах равен 24 * N, где N-число светодиодов в линий.

Но так можно до 16 линий одновременно рулить.

Если памяти жалко, то можно попробовать в кольцевом DMA готовить данные на лету.

А что напрямую в порт нельзя писать, только через SET/RESET? Единственное остальные выводы порта не должны использоваться как GPIO_OUT

И что мешает настроить 8 битные массивы? К регистрам GPIO нет доступа побайтно?

Share this post


Link to post
Share on other sites
4 минуты назад, C2000 сказал:

Ну смотря что считать строгим таймингом +- 1-2 такта шины вряд ли будут критичными. И насчёт остальных каналов DMA: есть возможность настройки правильных приоритетов.

Откуда взяли эти цифры "1-2 такта"? Имхо - намного больше.

Как ни настраивай приоритеты, но если какой-то DMA-канал выполняет транзакцию, то новый канал не сможет начать своей работы, пока текущий не завершит свою.

Share this post


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

Откуда взяли эти цифры "1-2 такта"? Имхо - намного больше.

Как ни настраивай приоритеты, но если какой-то DMA-канал выполняет транзакцию, то новый канал не сможет начать своей работы, пока текущий не завершит свою.

Это еще почему? Откуда Вы вообще взяли такую информацию? Если конечно у Вас транзакция в режиме Burst настроена. Но кто мешает так не делать?

Share this post


Link to post
Share on other sites
16 минут назад, jcxz сказал:

PS: Ни о каких "строгих таймингах" в этом случае и речи быть не может. Ну разве что если только остановить ядро и выключить все другие DMA-каналы и прочие bus-мастеры. Но в этом случае теряется смысл использования DMA.

По моим ощущениям, DMA-транзакция может занимать порядка 12 тактов, это при 168МГц порядка 0.071 мкс.

Да, дребезжать фронты будут, но по-моему не критично.

Share this post


Link to post
Share on other sites

По вашему если я в UART начал передавать 100 байт на скорости 1200, то DMA будет заблокирован пока все 100 байт не передадутся?:biggrin:

1 minute ago, adnega said:

По моим ощущениям, DMA-транзакция может занимать порядка 12 тактов, это при 168МГц порядка 0.071 мкс.

Да, дребезжать фронты будут, но по-моему не критично.

Что значит по Вашим ощущениям? Откуда эти цифры?

Share this post


Link to post
Share on other sites
9 минут назад, C2000 сказал:

Это еще почему? Откуда Вы вообще взяли такую информацию? Если конечно у Вас транзакция в режиме Burst настроена. Но кто мешает так не делать?

Причём тут burst? DMA-канал получив DMA-запрос (который выиграл приоритет среди других DMA-запросов) должен выполнить: 1) чтение источника; 2) запись источника. Если во время выполнения этих операций появится другой DMA-запрос (к другому DMA-каналу), он будет ждать завершения работы текущего. Сколько бы он ни выполнялся тактов. Так как DMA-контроллеры обычно умеют обслуживать только один запрос за раз. К тому же - в МК ТС-а (STM32F091) DMA-контроллер не имеет FIFO.

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

как на этом обеспечить "строгие тайминги" на выводах этих самых "адресных светодиодов"?

Я вот не нашел в тексте упоминания, что же за светодиоды такие. Если это - WS2812B, то там никаких синхроимпульсов нет (а ТС вроде говорил о синхроимпульсах), да и погрешность таймингов — аж ±150нс!

В общем загадки сплошные...

Share this post


Link to post
Share on other sites

Ну и сколько тактов надо чтобы передать из одной ячейки памяти в другую? Я и написал +- пара тактов

Потом арбитраж выйграет канал с большим приоритетом

Share this post


Link to post
Share on other sites
10 минут назад, adnega сказал:

По моим ощущениям, DMA-транзакция может занимать порядка 12 тактов, это при 168МГц порядка 0.071 мкс.

Я об этом и говорю. Эт уже вполне реальная цифра. Но может быть и больше в некоторых случаях. Просто такие дребезги будут реже происходить.

10 минут назад, adnega сказал:

Да, дребезжать фронты будут, но по-моему не критично.

Ну он есть. В отличие от использования SPI, где его совсем нет (ну если не сичтать тепловой шум ;)

11 минут назад, C2000 сказал:

По вашему если я в UART начал передавать 100 байт на скорости 1200, то DMA будет заблокирован пока все 100 байт не передадутся?:biggrin:

Читайте внимательнее. Вы ничего не поняли...

Share this post


Link to post
Share on other sites
Just now, jcxz said:

Я об этом и говорю. Эт уже вполне реальная цифра. Но может быть и больше в некоторых случаях. Просто такие дребезги будут реже происходить.

Ну он есть. В отличие от использования SPI, где его совсем нет (ну если не сичтать тепловой шум ;)

Как может возникнуть 12 тактов, прошу объяснить с ссылкой на документацию. Это не придирки, просто хочется понять ход Вашей мысли.

Ну и по поводу дребезга если он "ничтожен" по сравнению с частотой сигнала то можно считать что его нет.

2 minutes ago, jcxz said:

Читайте внимательнее. Вы ничего не поняли...

Ну так объясните как и в результате чего может возникнуть задержка в 12 тактов? Если Вы конечно сами понимаете о чем говорите.

Share this post


Link to post
Share on other sites
8 минут назад, C2000 сказал:

Ну и сколько тактов надо чтобы передать из одной ячейки памяти в другую? Я и написал +- пара тактов

Потом арбитраж выйграет канал с большим приоритетом

Чувствуется что Вы никогда не работали реально с DMA на больших скоростях. Только теоретизируете.

Знаете что такое например процедура Stacking-а в Cortex-M? И сколько она занимает тактов? В это время шина занята. А область ОЗУ в (STM32F091) всего одна. И что будет делать DMA-контроллер? :unknw:

А есть ведь ещё такая чудесная периферия кк CRC! :wink2:

Share this post


Link to post
Share on other sites
1 minute ago, Eddy_Em said:

Я вот не нашел в тексте упоминания, что же за светодиоды такие. Если это - WS2812B, то там никаких синхроимпульсов нет (а ТС вроде говорил о синхроимпульсах), да и погрешность таймингов — аж ±150нс!

В общем загадки сплошные...

От WS2812B думаю уже давно все отказались.
Теперь на APA102 c SPI подобным интерфейсом все делают. Они  гораздо более надежные и цветопередача лучше. 
У меня с ними работает по DMA на 10 МГц

Share this post


Link to post
Share on other sites
9 минут назад, C2000 сказал:

Потом арбитраж выйграет канал с большим приоритетом

А если CPU? Вы кажется забыли что у нас есть ещё и CPU  :biggrin:

Share this post


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

Знаете что такое например процедура Stacking-а в Cortex-M? 

В Cortex-M0?

Ну расскажите и дайте ссылку на документацию, из которой было бы что то понятно

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.