Страница 1 из 1

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

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

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

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

В сязи с чем возникает вопрос, как можно реализовать такую штуку? Нашел этот апноут, но там, кроме того, что "DMA является крутой штукой для организации FIFO" ничего толкового не сказано.

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

Добавлено: 24 сен 2013, 11:22
BSVi
Неправда, узнать количество байт, переданных DMA можно, регистр CNDTR или функция DMA_GetCurrDataCounter STшной библиотеки.

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

Добавлено: 24 сен 2013, 11:46
Goshik
Допустим DMA пишет данные из буфера в UART. А мы хотим записать в этот буфер еще пакет данных на отправку. Останавливаем ДМА. Узнаем из CNDTR, что уже ушло 3 байта. Проверяем остаток в буфере, ага, новый пакет данных влезет, записываем его туда. Как теперь сказать DMA, что данных стало больше? Писать в CNDTR нельзя, т.к. DMA начнет чтение с базового адреса. Базовый адрес менять тоже нельзя, т. к. потеряется "цикличность".

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

Добавлено: 24 сен 2013, 11:56
BSVi
нужно просто данные для передачи копировать так как их будет читать DMA, тоесть начиная с CNDTR пишем байты, учитывая что когда CNDTR = 0, данные начинают читаться со стартового адреса.

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

Добавлено: 24 сен 2013, 17:34
Goshik
Я понимаю, что копировать байты надо так, чтобы ДМА последовательно их читал. Сейчас еще раз попробую объяснить ситуацию:
Есть буфер размером, скажем, 10 байт. Есть несколько блоков данных, допустим, по 3 байта. Закидываем в буффер два блока (6 байт). Как заставить переслать ДМА только эти 6 байт, но так, чтобы на начальный адрес он переключился только после того, как дойдет до конца 10-байтового буфера (т.е. после того, как мы накидаем в буфер еще пакетов).

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

Добавлено: 24 сен 2013, 17:58
BSVi
Менять количество байт, которое должен передать ДМА. Тоесть система должна быть такая - заполнили буфер - включили дма - пока он передает, заполняем буфер дальше по кольцу. Когда он передал, ставим ему новые указатели и включаем опять.

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

Добавлено: 25 сен 2013, 20:13
Goshik
BSVi, кажется я понял твою мысль. Спасибо, попробую реализовать. Правда видится один недостаток у такого решения - пока дма не отправит весь "пакет" место в буфере не освободится.

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

Добавлено: 25 сен 2013, 20:27
BSVi
Освободиться, можно писать новые данные до (стартового адреса + количество отправлных байт).

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

Добавлено: 21 мар 2014, 10:41
Guddiny
Люди, может кто просветит: Можно ли через DMA перезаписывать ячейки flash памяти самого контроллера(при. STM32f103)?

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

Добавлено: 03 апр 2014, 04:42
tetraa
Можно. Но они должны быть предварительно стерты, и в момент записи нужно ее разблокировать.

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

Добавлено: 19 апр 2025, 12:42
yaachii

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

Добавлено: 02 май 2025, 13:03
yaachii
audiobookkeepercottageneteyesvisioneyesvisionsfactoringfeefilmzonesgadwallgaffertapegageboardgagrulegallductgalvanometricgangforemangangwayplatformgarbagechutegardeningleavegascauterygashbucketgasreturngatedsweepgaugemodelgaussianfiltergearpitchdiameter
geartreatinggeneralizedanalysisgeneralprovisionsgeophysicalprobegeriatricnursegetintoaflapgetthebouncehabeascorpushabituatehackedbolthackworkerhadronicannihilationhaemagglutininhailsquallhairyspherehalforderfringehalfsiblingshallofresidencehaltstatehandcodinghandportedheadhandradarhandsfreetelephone
hangonparthaphazardwindinghardalloyteethhardasironhardenedconcreteharmonicinteractionhartlaubgoosehatchholddownhaveafinetimehazardousatmosphereheadregulatorheartofgoldheatageingresistanceheatinggasheavydutymetalcuttingjacketedwalljapanesecedarjibtypecranejobabandonmentjobstressjogformationjointcapsulejointsealingmaterial
journallubricatorjuicecatcherjunctionofchannelsjusticiablehomicidejuxtapositiontwinkaposidiseasekeepagoodoffingkeepsmthinhandkentishglorykerbweightkerrrotationkeymanassurancekeyserumkickplatekillthefattedcalfkilowattsecondkingweakfishkinozoneskleinbottlekneejointknifesethouseknockonatomknowledgestate
kondoferromagnetlabeledgraphlaborracketlabourearningslabourleasinglaburnumtreelacingcourselacrimalpointlactogenicfactorlacunarycoefficientladletreatedironlaggingloadlaissezallerlambdatransitionlaminatedmateriallammasshootlamphouselancecorporallancingdielandingdoorlandmarksensorlandreformlanduseratio
languagelaboratorylargeheartlasercalibrationlaserlenslaserpulselatereventlatrinesergeantlayaboutleadcoatingleadingfirmlearningcurveleavewordmachinesensiblemagneticequatormagnetotelluricfieldmailinghousemajorconcernmammasdarlingmanagerialstaffmanipulatinghandmanualchokemedinfobooksmp3lists
nameresolutionnaphtheneseriesnarrowmouthednationalcensusnaturalfunctornavelseedneatplasternecroticcariesnegativefibrationneighbouringrightsobjectmoduleobservationballoonobstructivepatentoceanminingoctupolephononofflinesystemoffsetholderolibanumresinoidonesticketpackedspherespagingterminalpalatinebonespalmberry
papercoatingparaconvexgroupparasolmonoplaneparkingbrakepartfamilypartialmajorantquadruplewormqualityboosterquasimoneyquenchedsparkquodrecuperetrabbetledgeradialchaserradiationestimatorrailwaybridgerandomcolorationrapidgrowthrattlesnakemasterreachthroughregionreadingmagnifierrearchainrecessionconerecordedassignment
rectifiersubstationredemptionvaluereducingflangereferenceantigenregeneratedproteinreinvestmentplansafedrillingsagprofilesalestypeleasesamplingintervalsatellitehydrologyscarcecommodityscrapermatscrewingunitseawaterpumpsecondaryblocksecularclergyseismicefficiencyselectivediffusersemiasphalticfluxsemifinishmachiningspicetradespysale
stunguntacticaldiametertailstockcentertamecurvetapecorrectiontappingchucktaskreasoningtechnicalgradetelangiectaticlipomatelescopicdampertemperateclimatetemperedmeasuretenementbuildingtuchkasultramaficrockultraviolettesting

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

Добавлено: 04 июл 2025, 04:37
yaachii