<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									DMA + UART + 1Wire - STM32				            </title>
            <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/</link>
            <description>Обсуждение вопросов, посвященных программированию микроконтроллеров, разработке электроники и не только.</description>
            <language>ru-RU</language>
            <lastBuildDate>Sun, 07 Jun 2026 04:35:02 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>НА: DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1985</link>
                        <pubDate>Sun, 02 Jul 2023 07:37:13 +0000</pubDate>
                        <description><![CDATA[@eduard DMA зачастую пихают бездумно, чисто чтобы галочку поставить &quot;тут в проекте DMA, значит круто&quot; 😆]]></description>
                        <content:encoded><![CDATA[<p>@eduard DMA зачастую пихают бездумно, чисто чтобы галочку поставить "тут в проекте DMA, значит круто" 😆 </p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1985</guid>
                    </item>
				                    <item>
                        <title>НА: DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1980</link>
                        <pubDate>Fri, 30 Jun 2023 16:24:11 +0000</pubDate>
                        <description><![CDATA[Перед тем как это делать, я проштудировал несколько статей на эту тему.
У некоторых доходит до маразма.
Они принимают 8 байт и переинициализируют всё заново. И так пока весь пакет не приму...]]></description>
                        <content:encoded><![CDATA[<p>Перед тем как это делать, я проштудировал несколько статей на эту тему.</p>
<p>У некоторых доходит до маразма.</p>
<p>Они принимают 8 байт и переинициализируют всё заново. И так пока весь пакет не примут. Тогда вообще смысл в DMA теряется.</p>
<p>Получается да же дольше.</p>
<p>Один деятель делал заливку экрана сплошным цветом создавая буфер экрана в памяти, а затем перезаливая его с помощью DMA. На то, что бы отключить инкремент памяти и передать один байт в контроллер экрана нужное количество раз, ума не хватило.</p>
<p>Вообще DMA довольно интересная вещь. Немногие умеют им пользоваться. А кто умеет, им некогда описать, как правильно делать.</p>
<p>А жаль.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Эдуард</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1980</guid>
                    </item>
				                    <item>
                        <title>НА: DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1975</link>
                        <pubDate>Fri, 30 Jun 2023 11:11:44 +0000</pubDate>
                        <description><![CDATA[От: @eduard 
DMA я сюда прикрутил ради интереса.

Так да, а то получается десяток байт в секунду плюс-минус всего.]]></description>
                        <content:encoded><![CDATA[<blockquote data-userid="1817" data-postid="1972" data-mention="eduard">
<div class="wpforo-post-quote-author"><strong> От: @eduard </strong></div>
<p>DMA я сюда прикрутил ради интереса.</p>
</blockquote>
<p>Так да, а то получается десяток байт в секунду плюс-минус всего.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1975</guid>
                    </item>
				                    <item>
                        <title>НА: DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1972</link>
                        <pubDate>Thu, 29 Jun 2023 17:15:25 +0000</pubDate>
                        <description><![CDATA[Там не совсем так.
После команды &quot;Померять температуру&quot; проходит 700-800 мС.Команда - это два байта. Следовательно в UART нужно кинуть 16 байт. На скорости 115200 проскакивает быстро. После...]]></description>
                        <content:encoded><![CDATA[<p>Там не совсем так.</p>
<p>После команды "Померять температуру" проходит 700-800 мС.<br />Команда - это два байта. Следовательно в UART нужно кинуть 16 байт. На скорости 115200 проскакивает быстро. После чего производится измерение.</p>
<p>Всё это время можно заниматься чем угодно. Можно или спросить DS18B20 закончила ли она, или просто заниматься чем нибудь, а через 800мС считать температуру.</p>
<p>Это 2 байта команда и 9 байт ответ. Всего UART передаёт 16 байт и принимает 72 байта.</p>
<p>Я обычно в устройствах обновление экрана делаю раз в секунду, если нет быстрых процессов. Сразу же после обновления делаю запрос на измерение. Потом занимаюсь чем угодно, а после истечения секунды запрашиваю измерянную температуру, вывожу её на экран и т.д. по кругу.</p>
<p>Я делал это на ногодрыге на быстрых МК. На медленных библиотека не захотела работать. Поэтому и пришлось натравливать на это дело UART.</p>
<p>DMA я сюда прикрутил ради интереса. Без него код будет проще, а время уходить то же самое. Если не быстрее. Инициализация DMA команд многовато.</p>
<p>Можно попробовать скрестить с предыдущей библиотекой UART. Где есть FIFO. Плюнул и забыл. FIFO само всё выкинет. Только там проблема. FIFO может работать только с одним UART. Там всё через прерывания. А прерывания как класс, я ещё не доделал.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Эдуард</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1972</guid>
                    </item>
				                    <item>
                        <title>НА: DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1966</link>
                        <pubDate>Thu, 29 Jun 2023 14:22:49 +0000</pubDate>
                        <description><![CDATA[@eduard слушай, а не будет нерационального расходования ресурсов? DS18B20 вроде медленный сам по себе, то есть между считанными с него новыми значениями очень большой период. А тут целый кан...]]></description>
                        <content:encoded><![CDATA[<p>@eduard слушай, а не будет нерационального расходования ресурсов? DS18B20 вроде медленный сам по себе, то есть между считанными с него новыми значениями очень большой период. А тут целый канал DMA под это помимо самого USART'а.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1966</guid>
                    </item>
				                    <item>
                        <title>НА: DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1963</link>
                        <pubDate>Wed, 28 Jun 2023 17:16:37 +0000</pubDate>
                        <description><![CDATA[Наконец то разобрался с данной связкой. Всё, что я написал ранее, оказалось совсем не так, как я предполагал. Исходил из неверных предпосылок и выводов.
Всё оказалось проще. Я думал, что пр...]]></description>
                        <content:encoded><![CDATA[<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Наконец то разобрался с данной связкой. Всё, что я написал ранее, оказалось совсем не так, как я предполагал. Исходил из неверных предпосылок и выводов.</p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Всё оказалось проще. Я думал, что при окончании работы <span>DMA</span><span> и поднятии им флага всё заканчивается, данные ушли. Но это оказалось совершенно не так. </span></p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Я не учёл, что <span>DMA </span><span>высокоскоростное устройство, а </span><span>USART</span><span> довольно медленный. Получается так, что </span><span>DMA </span><span>подняв флаг окончания передачи, рапортует об окончании перекачивания данных в </span><span>USART</span><span>. Но </span><span>USART</span><span> продолжает передавать последний байт. Понял я это проанализировав логи линии передачи с помощью логического анализатора. Если в этот момент мы снова проинициализируем </span><span>DMA</span><span> и</span><span> USART</span><span> на новую передачу, </span><span>USART</span><span> прерывает передачу предыдущей информации и начинает новую и данные становятся кривыми. Без переиницииализации </span><span>USART </span><span>не знаю будет работать или нет. Не пробовал. Такой подход усложняет код очень значительно.</span></p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Ну чтож. Нам никто не мешает дождаться окончания передачи <span>USART</span><span> и продолжить работу. Удалось начать читать температуру. Но как то не устойчиво. В логах логического анализатора было видно, что часть информации при чтении почему то кривая. Читаем байты друг за другом и некоторый момент получаем битый байт.</span></p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Сейчас могу опять сделать немного неправильный вывод, но кто знает, может он и верен.</p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Дело в том, что я передаю и принимаю данные в полудуплексе. В этом случае вход и выход <span>USART</span><span> объеденены вместе на уровне коммутатора </span><span>GPIO </span><span>самого МК. Пробовал и внешнее соединение, но результат был тот же. Правда есть некоторые схемные решения, которые я не мог попробовать. Так как плата уже собрана.</span></p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Выводы <span>TX </span><span>и </span><span>RX</span><span> переключены в режим открытого стока, что позволяет нам не использовать внешние схемы. И такой способ подключения или что то ещё так же влияет на обмен информацией. Решение оказалось довольно простым. Есть такой флаг </span><span>BUSY</span><span>. Он устанавливается в "1" когда идёт приём. И в "0", когда приём закончен. Оказалось, что перед каждой передачей, нужно с помощью этого флага убедиться, что приёма нет, сбросить флаги </span><span>DMA</span><span> и начать процесс обмена. Всё заработало с полтыка.</span></p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify"><span>Есть очень неприятная вещь. Библиотека 1-Wire получилась не универсальной. Из за разных каналов </span><span>DMA</span><span> подключаемых к периферии. Поэтому придётся для каждого типа МК писать свою библиотеку. Можно при инициализации указывать какой </span><span>DMA</span><span> использовать и какие именно каналы. Я позже этим и займусь. И как всегда есть одно НО. Я делал это всё на </span><span>STM32F030CCT6</span><span>. А у него всё никак у людей. У всей серии этих МК каналы </span><span>DMA</span><span> фиксированно закреплены за определённой периферией, но вот именно у этого кристалла каждое периферийное устройство можно подключить к одному из нескольких каналов </span><span>DMA</span><span>.</span></p>
<p class="western" style="line-height: 100%;text-indent: 0.3cm;margin-top: 0.1cm;margin-bottom: 0.2cm;background: transparent" align="justify">Немного причешу библиотеку. Осталось доделать поиск адресов подключенных устройств. И можно выкладывать статью.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Эдуард</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1963</guid>
                    </item>
				                    <item>
                        <title>DMA + UART + 1Wire</title>
                        <link>https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1953</link>
                        <pubDate>Thu, 22 Jun 2023 16:54:38 +0000</pubDate>
                        <description><![CDATA[Решил изобразить из себя крутого программиста и написать класс для работы с 1Wire через USART + DMA
И офигел.
Важно !!! Чип STM32F030CCT
Вся идея, подсмотренная у более опытных программис...]]></description>
                        <content:encoded><![CDATA[<p>Решил изобразить из себя крутого программиста и написать класс для работы с 1Wire через USART + DMA</p>
<p>И офигел.</p>
<p>Важно !!! Чип STM32F030CCT</p>
<p>Вся идея, подсмотренная у более опытных программистов состоит в том, что бы отправить байт в 1 Wire, нужно через UART послать 8 байт на определённой скорости. Что бы послать бит "1", подсовываем UART 0xFF, что бы послать "0", посылаем 0x00.</p>
<p>Чем не задача для DMA. Провозился долго, пока не прочитал, что STM32F030xC особенный в отличие от всей линейки. Но справился. Попросил DS18B20 измерить температуру, микросхема байт приняла и начала замер температуры. Теперь надо считать данные. Для этого нужно послать две команды. "Пропустить адрес" и "Читать данные". Запуливаю два байта команд и наблюдаю полную кашу на линии.</p>
<p>Не понял. Как так. Да я забыл отслеживать окончание передачи. НО !!! В Мануале сказано, что пока DMA работает, перезаписать регистры невозможно и я хотя бы одну посылку должен получить правильную. Чёрта с два !!! Можно !!! Есть второй вариант. Может я что то напутал.</p>
<p>Для проверки я поставил задержку на 1 миллисекунду. Команды проходят. Значит в этом месте нужно просто проверять флаги. (Перед посылкой я их естественно сбросил). И пока флаг не поднимется, следующий пакет не посылать. Ага жди. Не работает. Похеризация пакетов просто изменила рисунок.</p>
<p>Сейчас начал готовить пакет запросов с одновременным приёмом результата, но рабочий день закончился и я не успел.</p>
<p>До этого пробовал запустить DMA под HAL. Не заработало. И я не один такой невезучий.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Эдуард</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/dma-uart-1wire/#post-1953</guid>
                    </item>
							        </channel>
        </rss>
		