<?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>
									Протокол bidirectional DSHOT на STM32F103 - STM32				            </title>
            <link>https://microtechnics.ru/community/stm32/protokol-bidirectional-dshot-na-stm32f103/</link>
            <description>Обсуждение вопросов, посвященных программированию микроконтроллеров, разработке электроники и не только.</description>
            <language>ru-RU</language>
            <lastBuildDate>Sun, 07 Jun 2026 04:37:08 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>НА: Протокол bidirectional DSHOT на STM32F103</title>
                        <link>https://microtechnics.ru/community/stm32/protokol-bidirectional-dshot-na-stm32f103/#post-2815</link>
                        <pubDate>Tue, 07 May 2024 10:05:50 +0000</pubDate>
                        <description><![CDATA[Добрый день, первая мысль, что что-то не так с временными интервалами, но по факту, конечно, надо детально смотреть с отладчиком, анализатором итд]]></description>
                        <content:encoded><![CDATA[<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/protokol-bidirectional-dshot-na-stm32f103/#post-2815</guid>
                    </item>
				                    <item>
                        <title>Протокол bidirectional DSHOT на STM32F103</title>
                        <link>https://microtechnics.ru/community/stm32/protokol-bidirectional-dshot-na-stm32f103/#post-2805</link>
                        <pubDate>Sun, 05 May 2024 18:39:50 +0000</pubDate>
                        <description><![CDATA[Всем привет! Пытаюсь реализовать bidir DSHOT300 это протокол цифрового управления драйвером бесщеточного двигателя(подробно написано тут). За основу взял библиотеку на HAL.
Если вкратце то ...]]></description>
                        <content:encoded><![CDATA[<p>Всем привет! Пытаюсь реализовать bidir DSHOT300 это протокол цифрового управления драйвером бесщеточного двигателя(подробно написано <a href="https://brushlesswhoop.com/dshot-and-bidirectional-dshot/" target="_blank" rel="noopener">тут</a>). За основу взял <a href="https://github.com/mokhwasomssi/stm32_hal_dshot/tree/main" target="_blank" rel="noopener">библиотеку</a> на HAL.</p>
<p>Если вкратце то вся суть протола заключается в том чтобы по одному проводу передать 16 бит с управляющим значением для двигателя, а затем драйвер в ответ отправляет 16 бит со значением оборотов двигателя. Вот это знаечение и не получается получить.</p>
612
<p> Написал вот такой индийский код и пытаюсь в прерывании таймера считывать в буфер поступающий пакет после получения отправляю его по UART.</p>
<div style="background-color: #ffffff;padding: 0px 0px 0px 2px">
<div style="color: #000000;background-color: #ffffff;font-size: 10pt">
<p style="margin: 0"><span style="color: #7f0055;font-weight: bold">void</span><span style="color: #000000"> </span><span style="color: #000000;font-weight: bold">TIM4_IRQHandler</span><span style="color: #000000">(</span><span style="color: #7f0055;font-weight: bold">void</span><span style="color: #000000">)</span></p>
<p style="margin: 0"><span style="color: #000000">{</span></p>
<p style="margin: 0"><span style="color: #000000"> </span><span style="color: #3f7f5f">/* USER CODE BEGIN TIM4_IRQn 0 */</span></p>
<p style="margin: 0"> </p>
<p style="margin: 0"><span style="color: #000000"> </span><span style="color: #3f7f5f">/* USER CODE END TIM4_IRQn 0 */</span></p>
<p style="margin: 0"><span style="color: #000000"> HAL_TIM_IRQHandler(&amp;htim4);</span></p>
<p style="margin: 0"><span style="color: #000000"> </span><span style="color: #3f7f5f">/* USER CODE BEGIN TIM4_IRQn 1 */</span></p>
<p style="margin: 0"><span style="color: #000000"> readeRPM ();</span></p>
<p style="margin: 0"><span style="color: #000000"> </span><span style="color: #3f7f5f">/* USER CODE END TIM4_IRQn 1 */</span></p>
<p style="margin: 0"><span style="color: #000000">}</span></p>
<p> </p>
</div>
</div>
<div style="background-color: #ffffff;padding: 0px 0px 0px 2px">
<div style="color: #000000;background-color: #ffffff;font-size: 10pt">
<p style="margin: 0"><span style="color: #7f0055;font-weight: bold">void </span><span style="color: #000000;font-weight: bold">readeRPM</span><span style="color: #000000"> (){</span></p>
<p style="margin: 0"><span style="color: #7f0055;font-weight: bold">if</span><span style="color: #000000"> (flag == 1 ) // включется в прерывании после передачи пакета DMA</span></p>
<p style="margin: 0"><span style="color: #000000"> {</span></p>
<p style="margin: 0"><span style="color: #7f0055;font-weight: bold"> if</span><span style="color: #000000">((GPIOB-&gt;</span><span style="color: #0000c0">IDR</span><span style="color: #000000"> &amp; GPIO_PIN_6) == (</span><span style="color: #005032">uint32_t</span><span style="color: #000000">)</span><span style="color: #0000c0;font-style: italic">GPIO_PIN_RESET</span><span style="color: #000000">) {</span></p>
<p style="margin: 0"><span style="color: #000000"> readStr = 1; // разрешенаем заполнение буфера</span></p>
<p style="margin: 0"><span style="color: #000000"> }</span></p>
<p style="margin: 0"><span style="color: #000000"> }</span></p>
<p style="margin: 0"> </p>
<p style="margin: 0"><span style="color: #7f0055;font-weight: bold">if</span><span style="color: #000000">(flag == 1 &amp;&amp; readStr == 1) {</span></p>
<p style="margin: 0"><span style="color: #005032"> uint8_t</span><span style="color: #000000"> val = (GPIOB-&gt;</span><span style="color: #0000c0">IDR</span><span style="color: #000000"> &amp; GPIO_PIN_6) &gt;&gt; 6;</span></p>
<p style="margin: 0"><span style="color: #000000"> (val &gt; 0) ? (val |= 49) : (val |= 0);</span></p>
<p style="margin: 0"><span style="color: #000000"> *(str + i) = </span><span style="color: #000000">val;</span></p>
<p style="margin: 0"><span style="color: #7f0055;font-weight: bold"> if</span><span style="color: #000000">(i &gt; 12) {</span></p>
<p style="margin: 0"><span style="color: #000000"> *(str + i + 1) = </span><span style="color: #2a00ff">'\r'</span><span style="color: #000000">;</span></p>
<p style="margin: 0"><span style="color: #000000"> *(str + i + 2) = </span><span style="color: #2a00ff">'\n'</span><span style="color: #000000">;</span></p>
<p style="margin: 0"><span style="color: #000000"> i = 0;</span></p>
<p style="margin: 0"><span style="color: #000000"> readStr = 0;</span></p>
<p style="margin: 0"><span style="color: #000000"> flag = 0;</span></p>
<p style="margin: 0"><span style="background-color: #ffffff;padding: 0px 0px 0px 2px"><span style="color: #000000;background-color: #ffffff;font-size: 10pt"><span style="color: #000000"> HAL_UART_Transmit_IT(&amp;huart1, (</span><span style="color: #005032">uint8_t</span><span style="color: #000000">*)str, 18); //отправляем по UART</span></span></span></p>
<p style="margin: 0"><span style="color: #000000"> }</span><span style="color: #7f0055;font-weight: bold">else</span><span style="color: #000000">{</span></p>
<p style="margin: 0"><span style="color: #000000"> i++;</span></p>
<p style="margin: 0"><span style="color: #000000"> }</span></p>
<p style="margin: 0"><span style="color: #000000"> }</span></p>
<p style="margin: 0"><span style="color: #000000"> }</span></p>
</div>
</div>
<p>На выходе получаю непонятную картину. </p>
613
<p>У меня подозрения что вся проблема в прерываниях. Если дергать ногой в прерываниях таймера то получаем:</p>
614
<p> Подскажите пожалуйста что делаю не так?</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>SKYa2019</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/protokol-bidirectional-dshot-na-stm32f103/#post-2805</guid>
                    </item>
							        </channel>
        </rss>
		