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

TIM2+DMA дублирует 8bit данные.

Добрый день.

Пытаюсь научиться управлять светодиодной лентой, для примера взял  https://narodstream.ru/stm-urok-119-ws2812b-lenta-na-umnyx-svetodiodax-rgb-chast-2

но ничего не заработало.

Снизил частоты чтобы таймер срабатывал 2 секунды, подключил светодиод.

В итоге пришел к выводу что если я пишу в регистр 8 битные данные, вместо того чтобы записаться в нижний регистр, они дублируються 4 раза на весь 32 бит регистр.  image.png.a29481d29cc9d5b7085bc2b1f632c4f0.png

А если переключаю в 16 бит загрузку, то пишет в верхний и нижний регистры по 16 бит  image.png.80ee61c9c218ef5a57c9522269a6e773.png

Сначала грешил на HAL библиотеку, переписал по другому примеру вручную настройку всех регистров DMA и TIM2 и тот же эффект.

Вопрос: кто то может сталкивался с подобным?

Пока мысли или процессор с данным глючком, или я все же не учел какие то настройки.

Странно, у автора примера видимо лента работает и не наблюдается дублирование данных.

DMA_setup.thumb.jpg.ee097225a0f635e923008da5a9ddc476.jpgTIM2_setup.thumb.jpg.e79c4a08b424b195d942687f965559c2.jpg

 

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


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

Просто поставьте нужные значения в регистры MSIZE и PSIZE. Нечего тут глюки в процессорах подозревать.

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


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

On 8/11/2022 at 5:37 PM, tgruzd said:

Просто поставьте нужные значения в регистры MSIZE и PSIZE. Нечего тут глюки в процессорах подозревать.

я все варианты перепробовал 0b00-8 бит / 01 - 16 бит / 10 - 32 бит.

Какой самый правильный?

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


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

@taraserker, буду исходить из предположений, что у вас F103 (хотя указывать точно, с чем вы работаете - дело полезное).

Первое,
15.4 TIMx registers

Refer to Section 2.2 for a list of abbreviations used in register descriptions. The 32-bit peripheral registers have to be written by words (32 bits). All other peripheral registers have to be written by half-words (16 bits) or words (32 bits). Read accesses can be done by bytes (8 bits), half-words (16 bits) or words (32 bits).

т.е. по 8 бит туда писать нельзя никоим образом.

Второе,

15.1 TIM2 to TIM5 introduction

The general-purpose timers consist of a 16-bit auto-reload counter driven by a programmable prescaler.

т.е. прескалер/каунтер/капча-компэйр регистры имеют размер 16 бит, и писать в старшую часть что-то кроме нулей не надо (я никогда не проверял, как оно работает. Подозреваю, просто игнорируется).

 

В описании DMA есть некая мутная фраза, как устроена передача в APB (таймеры висят на APB)

Addressing an AHB peripheral that does not support byte or halfword write operations

When the DMA initiates an AHB byte or halfword write operation, the data are duplicated on the unused lanes of the HWDATA[31:0] bus. So when the used AHB slave peripheral does not support byte or halfword write operations (when HSIZE is not used by the peripheral) and does not generate any error, the DMA writes the 32 HWDATA bits as shown in the two examples below:

 To write the halfword “0xABCD”, the DMA sets the HWDATA bus to “0xABCDABCD” with HSIZE = HalfWord

 To write the byte “0xAB”, the DMA sets the HWDATA bus to “0xABABABAB” with HSIZE = Byte

Assuming that the AHB/APB bridge is an AHB 32-bit slave peripheral that does not take the HSIZE data into account, it will transform any AHB byte or halfword operation into a 32-bit APB operation in the following manner:

 an AHB byte write operation of the data “0xB0” to 0x0 (or to 0x1, 0x2 or 0x3) will be converted to an APB word write operation of the data “0xB0B0B0B0” to 0x0

 an AHB halfword write operation of the data “0xB1B0” to 0x0 (or to 0x2) will be converted to an APB word write operation of the data “0xB1B0B1B0” to 0x0

For instance, to write the APB backup registers (16-bit registers aligned to a 32-bit address boundary), the memory source size (MSIZE) must be configured to “16-bit” and the peripheral destination size (PSIZE) to “32-bit”.

 

Я никогда не проверял это утверждение (насколько помню, регистры таймера во всех заголовках описаны как 32-битные).

Но вам ведь тоже никто не мешает установить PSize=32bit, MSize=8bit (см. табличку в описании, данные будут дополнены нулями).

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


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

On 8/14/2022 at 2:29 PM, Arlleex said:

МК какой? Читайте про особенности AHB-APB bridge.

Спасибо за комментарий.

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

У меня плата STM32F4 discovery   с процессором 407, а не STM23F103 как в примере. Почему я и начал использовать TIM2 так же как в примере.

Попробовал на BLUE PILL 103 проц и работает, есть похожие примеры на 407 но они используют TIM3 который 16 бит, как и TIM2 в 103 процессоре. Т.е с 16 битным таймером 16 битный буфер ДМА прекрасно работает, а делать буфер 32 бита, слишком расточительно, чтобы пересылать длительность 55 и 25.

Буду разбираться дальше с настройками DMA. чтобы верхние байты заполнялись нулями, потому что далее хочу уменьшить буфер ДМА до 8 бит, а не как в примере 16 бит. И как я понимаю возникнет та же ситуация, но уже с верхним и нижним байтом 16 битного регистра.

On 8/11/2022 at 5:37 PM, tgruzd said:

Просто поставьте нужные значения в регистры MSIZE и PSIZE. Нечего тут глюки в процессорах подозревать.

и разрешить FIFO, без него получается DIRECT ACCESS - память в регистр отправляется напрямую,  MSIZE и PSIZE становятся одинакового размера.

On 8/15/2022 at 12:58 PM, esaulenka said:

@taraserker, буду исходить из предположений, что у вас F103 (хотя указывать точно, с чем вы работаете - дело полезное).

F407 (TIM2 32 бит)   на 103 (16 бит ) пример работает.

On 8/15/2022 at 12:58 PM, esaulenka said:

Но вам ведь тоже никто не мешает установить PSize=32bit, MSize=8bit (см. табличку в описании, данные будут дополнены нулями).

И этот вариант попробовал,

нижние 16 бит пишет нужное значение, верхние пишет следующие 16 бит из буфера ДМА.

Спасибо за хорошее разъяснение, еще раз перечитаю и постараюсь понять какие биты настройки мне еще надо поставить чтобы верхние регистры заполнялись нулями, я в даташите видел этот момент, но еще не понял его.

Изменено пользователем taraserker

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


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

On 8/15/2022 at 12:58 PM, esaulenka said:

 To write the halfword “0xABCD”, the DMA sets the HWDATA bus to “0xABCDABCD” with HSIZE = HalfWord

 To write the byte “0xAB”, the DMA sets the HWDATA bus to “0xABABABAB” with HSIZE = Byte

Именно такой результат и получаю.

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


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

В 19.08.2022 в 10:46, taraserker сказал:

Буду разбираться дальше с настройками DMA. чтобы верхние байты заполнялись нулями, потому что далее хочу уменьшить буфер ДМА до 8 бит...

Вы этого не добьетесь, потому что DMA - это такой же мастер шины, как и CPU, а "дублирование" байт-лэйнов описано в RM на STM32 а также в некоторых редакциях спецификации AMBA AHB/APB. Поэтому не зря в примерах буфер DMA сделан 16-битным, по разрядности значимой части регистра таймера (несмотря на его 32-битную адресную границу).

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


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

On 8/20/2022 at 7:08 PM, Arlleex said:

Вы этого не добьетесь

Самое смешное, что в STM32F1xx и STM32F4xx поведение DMA при разных PSIZE/MSIZE принципиально разное. В F1xx DMA добивает нулями (или обрезает), количество транзакций чтение/запись одинаковое. Более новые DMA умеют склеивать и разрезать данные, количество транзакций будет разное. Возможности переключать это поведение не предусмотрено.

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


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

2 часа назад, esaulenka сказал:

В F1xx DMA добивает нулями (или обрезает), количество транзакций чтение/запись одинаковое...

...и, ИМХО, это поведение весьма правильное. В DMA на F4 уже как-то более топорно сделано.

Поэтому в F1 вполне реально сделать то, о чем просит ТС, в отличие от F4. PSIZE == 32 бит и добитие нулями решает.

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


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

Всем спасибо за ответы и участие.

Почитал англоязычные форумы, походу нету тут решения, так ДМА странно реализован.

Хотелось бы еще поэкспериментировать, поискать возможные решения, но не хватает времени и знаний.

Перекинул на 16 битный таймер ТИМ4.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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