<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>STM32 on moth site</title><link>https://mothsite.netlify.app/tags/stm32/</link><description>Recent content in STM32 on moth site</description><generator>Hugo</generator><language>en-us</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener"&gt;CC BY-NC 4.0&lt;/a&gt;</copyright><lastBuildDate>Fri, 27 Mar 2026 12:08:37 -0400</lastBuildDate><atom:link href="https://mothsite.netlify.app/tags/stm32/index.xml" rel="self" type="application/rss+xml"/><item><title>dshot timer setup</title><link>https://mothsite.netlify.app/posts/03-27-26/</link><pubDate>Fri, 27 Mar 2026 12:08:37 -0400</pubDate><guid>https://mothsite.netlify.app/posts/03-27-26/</guid><description>&lt;p&gt;I spent most of my week helping another shop member set up for RP2040 programming, as well as brainstorming and developing a plan for their project for robotic arm control.&lt;/p&gt;
&lt;p&gt;I also helped several other students use the laser cutter to create acrylic etchings.&lt;/p&gt;
&lt;p&gt;As such my work was relatively limited.&lt;/p&gt;
&lt;p&gt;It can generally be summarized as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setup_dshot_timer&lt;/span&gt;(TIM1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setup_dshot_timer&lt;/span&gt;(TIM8);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;configure_dshot_timer_dma&lt;/span&gt;(DMA2_Stream5, TIM1, cmd_ccr_tim1_buf[cmd_ccr_front],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;configure_dshot_timer_dma&lt;/span&gt;(DMA2_Stream1, TIM8, cmd_ccr_tim8_buf[cmd_ccr_front],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;enable_pwm_pins&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set DShot pins OSPEEDR value to high [DS8626 Table 50]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GPIOA&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;OSPEEDR &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;(GPIO_OSPEEDR_OSPEED8_Msk &lt;span style="color:#f92672"&gt;|&lt;/span&gt; GPIO_OSPEEDR_OSPEED9_Msk &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GPIO_OSPEEDR_OSPEED10_Msk &lt;span style="color:#f92672"&gt;|&lt;/span&gt; GPIO_OSPEEDR_OSPEED11_Msk);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GPIOA&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;OSPEEDR &lt;span style="color:#f92672"&gt;|=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED8_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED9_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED10_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED11_Pos);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GPIOC&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;OSPEEDR &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;(GPIO_OSPEEDR_OSPEED6_Msk &lt;span style="color:#f92672"&gt;|&lt;/span&gt; GPIO_OSPEEDR_OSPEED7_Msk &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GPIO_OSPEEDR_OSPEED8_Msk &lt;span style="color:#f92672"&gt;|&lt;/span&gt; GPIO_OSPEEDR_OSPEED9_Msk);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GPIOC&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;OSPEEDR &lt;span style="color:#f92672"&gt;|=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED6_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED7_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED8_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; GPIO_OSPEEDR_OSPEED9_Pos);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;setup_dshot_timer() and configure_dshot_timer_dma() simply reduce some code duplication and make the main function easier to read.&lt;/p&gt;</description></item><item><title>Finished RX DMA Setup and Interrupt, Set Hardware NSS</title><link>https://mothsite.netlify.app/posts/03-23-26/</link><pubDate>Mon, 23 Mar 2026 10:36:48 -0400</pubDate><guid>https://mothsite.netlify.app/posts/03-23-26/</guid><description>&lt;p&gt;I first finished the SPI RX DMA setup. I simply changed a few settings, and actually included the arming of both streams.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Reset Stream
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; DMA_SxCR_EN);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set source peripheral pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;PAR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;uint32_t&lt;/span&gt;)&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;SPI2&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;DR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set buffer pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;M0AR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;uint32_t&lt;/span&gt;)cmd_data_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Transfer 11 bytes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;NDTR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Enabled direct mode (no FIFO)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;FCR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA_SxCR_TCIE &lt;span style="color:#75715e"&gt;// Enable transfer complete interrupt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_DIR_Pos) &lt;span style="color:#75715e"&gt;// Peripheral to Memory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; DMA_SxCR_MINC &lt;span style="color:#75715e"&gt;// Enable memory increment mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_PSIZE_Pos) &lt;span style="color:#75715e"&gt;// Set 8-bit peripheral data size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_MSIZE_Pos) &lt;span style="color:#75715e"&gt;// Set 8-bit memory data size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set priority level to medium. Doesn&amp;#39;t actually matter since TIMs and
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// IDR are on on DMA2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_PL_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_CHSEL_Pos); &lt;span style="color:#75715e"&gt;// Set channel 0 [RM0090 Table 43]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; DMA_SxCR_EN);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set source periphal pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;PAR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;uint32_t&lt;/span&gt;)&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;SPI2&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;DR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set buffer pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;M0AR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;uint32_t&lt;/span&gt;)erpm_data_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Transfer 11 bytes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;NDTR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Enable direct mode (no FIFO)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;FCR &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_DIR_Pos) &lt;span style="color:#75715e"&gt;// Memory to Peripheral
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; DMA_SxCR_MINC &lt;span style="color:#75715e"&gt;// Enable memory increment mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_PSIZE_Pos) &lt;span style="color:#75715e"&gt;// Set 8-bit peripheral data size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_MSIZE_Pos) &lt;span style="color:#75715e"&gt;// Set 8-bit memory data size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set priority level to medium. Doesn&amp;#39;t actually
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// matter since TIMs and IDR are on on DMA2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_PL_Pos) &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; DMA_SxCR_CHSEL_Pos); &lt;span style="color:#75715e"&gt;// Set channel 0 [RM0090 Table 43]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Arm both streams
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream3&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;|=&lt;/span&gt; DMA_SxCR_EN;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMA1_Stream4&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;CR &lt;span style="color:#f92672"&gt;|=&lt;/span&gt; DMA_SxCR_EN;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After examining the protocol for re-syching after a CRC failure and looking at methods for frame synchronization I decided to change to hardware NSS, which required some changes to the SPI and PIN setup. I also finished the CRC setup int he SPI configuration, selecting the 0x2F polynomial to allow for triple bit error detection.&lt;/p&gt;</description></item><item><title>more register-level STM32: SPI, DMA, DShot</title><link>https://mothsite.netlify.app/posts/03-13-26/</link><pubDate>Fri, 13 Mar 2026 10:37:57 -0400</pubDate><guid>https://mothsite.netlify.app/posts/03-13-26/</guid><description>&lt;p&gt;This is my second attempt at this post, so it&amp;rsquo;ll probably be a bit shorter than the first time.&lt;/p&gt;
&lt;p&gt;I first realized that the HAL_Init() function in the code autogenerated by STM32CubeMX actually does more than just initializing the HAL, it sets up flash, and the SysTick interrupt.&lt;/p&gt;
&lt;p&gt;When setting up the flash, I needed to set the proper flash latency for the CPU speed and voltage. Consulting the table, I found 5 to be the correct option.&lt;/p&gt;</description></item><item><title>ESC specification mistakes, correcting r &amp; d, register-level STM32 motor controller implementation</title><link>https://mothsite.netlify.app/posts/03-06-26/</link><pubDate>Fri, 06 Mar 2026 07:38:15 -0500</pubDate><guid>https://mothsite.netlify.app/posts/03-06-26/</guid><description>&lt;p&gt;After getting my custom PIO DShot implementation working last week, I needed to someone run the motor in reverse as well as forward. Checking the DShot specification, I needed to send the correct command. These commands occupy the lower 48 values of the 11 bits of data in a DShot packet.&lt;/p&gt;
&lt;p&gt;| Number | Command | Remark |
|// Set priority level to medium.
// matter since TIMS and IDR on DMA2 &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash; | &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash; | &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash; |
| 0..6 | &amp;hellip; | &amp;hellip; |
| 7 | DSHOT_CMD_SPIN_DIRECTION_1 | Needs 6x |
| 8 | DSHOT_CMD_SPIN_DIRECTION_2 | Needs 6x |
| 9 | DSHOT_CMD_3D_MODE_OFF | Needs 6x |
| 10 | DSHOT_CMD_3D_MODE_ON | Needs 6x |
| 11..47 | &amp;hellip; | &amp;hellip; |&lt;/p&gt;</description></item></channel></rss>