STM32 DMA Кольцевой FIFO-буфер

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Post Reply
Goshik
Posts: 4
Joined: 24 Sep 2013, 06:27

STM32 DMA Кольцевой FIFO-буфер

Post by Goshik »

Всем привет. Хочу организовать 2 кольцевых FIFO-буфера для передачи и приема данных по UART. Если делать тупо прерываниями, то проблем не воникает. Но хочется использовать DMA, чтобы избавить проц от лишних телодвижений.

Работать должно так:
Имеется n байт. Проверяем заполненность буфера и смотрим влезут-ли туда эти n байт.
Если влезут, записываем и запускаем дма на передачу данных из буфера в UART, если нет, то сигнализируем об ошибке.

Вся проблема в том, что у дма недоступно значение смещения от базового адреса памяти. Следовательно нельзя узнать сколько байт уже ушло и проверить заполненность буфера.

В сязи с чем возникает вопрос, как можно реализовать такую штуку? Нашел этот апноут, но там, кроме того, что "DMA является крутой штукой для организации FIFO" ничего толкового не сказано.
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

Re: STM32 DMA Кольцевой FIFO-буфер

Post by BSVi »

Неправда, узнать количество байт, переданных DMA можно, регистр CNDTR или функция DMA_GetCurrDataCounter STшной библиотеки.
Goshik
Posts: 4
Joined: 24 Sep 2013, 06:27

Re: STM32 DMA Кольцевой FIFO-буфер

Post by Goshik »

Допустим DMA пишет данные из буфера в UART. А мы хотим записать в этот буфер еще пакет данных на отправку. Останавливаем ДМА. Узнаем из CNDTR, что уже ушло 3 байта. Проверяем остаток в буфере, ага, новый пакет данных влезет, записываем его туда. Как теперь сказать DMA, что данных стало больше? Писать в CNDTR нельзя, т.к. DMA начнет чтение с базового адреса. Базовый адрес менять тоже нельзя, т. к. потеряется "цикличность".
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

Re: STM32 DMA Кольцевой FIFO-буфер

Post by BSVi »

нужно просто данные для передачи копировать так как их будет читать DMA, тоесть начиная с CNDTR пишем байты, учитывая что когда CNDTR = 0, данные начинают читаться со стартового адреса.
Goshik
Posts: 4
Joined: 24 Sep 2013, 06:27

Re: STM32 DMA Кольцевой FIFO-буфер

Post by Goshik »

Я понимаю, что копировать байты надо так, чтобы ДМА последовательно их читал. Сейчас еще раз попробую объяснить ситуацию:
Есть буфер размером, скажем, 10 байт. Есть несколько блоков данных, допустим, по 3 байта. Закидываем в буффер два блока (6 байт). Как заставить переслать ДМА только эти 6 байт, но так, чтобы на начальный адрес он переключился только после того, как дойдет до конца 10-байтового буфера (т.е. после того, как мы накидаем в буфер еще пакетов).
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

Re: STM32 DMA Кольцевой FIFO-буфер

Post by BSVi »

Менять количество байт, которое должен передать ДМА. Тоесть система должна быть такая - заполнили буфер - включили дма - пока он передает, заполняем буфер дальше по кольцу. Когда он передал, ставим ему новые указатели и включаем опять.
Goshik
Posts: 4
Joined: 24 Sep 2013, 06:27

Re: STM32 DMA Кольцевой FIFO-буфер

Post by Goshik »

BSVi, кажется я понял твою мысль. Спасибо, попробую реализовать. Правда видится один недостаток у такого решения - пока дма не отправит весь "пакет" место в буфере не освободится.
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

Re: STM32 DMA Кольцевой FIFO-буфер

Post by BSVi »

Освободиться, можно писать новые данные до (стартового адреса + количество отправлных байт).
User avatar
Guddiny
Posts: 6
Joined: 21 Mar 2014, 10:37

Re: STM32 DMA Кольцевой FIFO-буфер

Post by Guddiny »

Люди, может кто просветит: Можно ли через DMA перезаписывать ячейки flash памяти самого контроллера(при. STM32f103)?
tetraa
Posts: 41
Joined: 24 Sep 2011, 01:01
Location: киев

Re: STM32 DMA Кольцевой FIFO-буфер

Post by tetraa »

Можно. Но они должны быть предварительно стерты, и в момент записи нужно ее разблокировать.
Post Reply