<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://piolabs.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://piolabs.com/" rel="alternate" type="text/html" /><updated>2026-05-04T09:39:31+03:00</updated><id>https://piolabs.com/feed.xml</id><title type="html">PlatformIO Labs</title><subtitle>A proven technology used by global innovators and by millions of embedded developers around the world.</subtitle><author><name>PlatformIO Labs</name><email>contact@piolabs.com</email></author><entry><title type="html">PlatformIO Open Source April Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-april-2026-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source April Updates" /><published>2026-05-04T00:00:00+03:00</published><updated>2026-05-04T00:00:00+03:00</updated><id>https://piolabs.com/blog/news/platformio-oss-april-2026-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-april-2026-updates.html"><![CDATA[<p>Welcome to the April 2026 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.</p>

<p>This month we received a lot of helpful feedback from our community, which let us identify the most important parts of our OSS ecosystem that required our attention, so there are plenty of updates pushed in this month that we hope you will like.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-april-news.jpg" alt="PlatformIO Open Source April Updates" /></p>

<p>During April, we added support for the latest ESP-IDF v6.0 and Zephyr RTOS 4.4, published updates for several popular development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#esp-idf-v60" id="markdown-toc-esp-idf-v60">ESP-IDF v6.0</a></li>
  <li><a href="#zephyr-rtos-v44" id="markdown-toc-zephyr-rtos-v44">Zephyr RTOS v4.4</a></li>
  <li><a href="#espressif32-dev-platform-v70" id="markdown-toc-espressif32-dev-platform-v70">Espressif32 dev-platform v7.0</a></li>
  <li><a href="#st-stm32-dev-platform-v196" id="markdown-toc-st-stm32-dev-platform-v196">ST STM32 dev-platform v19.6</a></li>
  <li><a href="#microchip-avr-dev-platform-v52" id="markdown-toc-microchip-avr-dev-platform-v52">Microchip AVR dev-platform v5.2</a></li>
  <li><a href="#microchip-megaavr-dev-platform-v19" id="markdown-toc-microchip-megaavr-dev-platform-v19">Microchip megaAVR dev-platform v1.9</a></li>
  <li><a href="#teensy-dev-platform-v51" id="markdown-toc-teensy-dev-platform-v51">Teensy dev-platform v5.1</a></li>
</ul>

<h2 id="esp-idf-v60">ESP-IDF v6.0</h2>

<p>We’re happy to announce updated support for the latest release of <strong>ESP-IDF v6.0</strong> - the official development framework for the ESP32, ESP32-S and ESP32-C Series SoCs. It provides a self-sufficient SDK for any generic application development on these platforms, using programming languages such as C and C++. ESP-IDF currently powers millions of devices in the field, and enables building a variety of network-connected products, ranging from simple light bulbs and toys to big appliances and industrial devices.</p>

<p><strong>Major enhancements in v6.0:</strong></p>

<ul>
  <li>ESP-IDF upgrades to MbedTLS v4.x and adopts the new PSA Crypto API</li>
  <li>Upgraded default C standard to gnu23</li>
  <li>Upgraded default C++ standard to gnu++26</li>
</ul>

<p>More information on project configuration for ESP-IDF can be found <a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#configuration">here</a>.</p>

<p><strong>Related resources for ESP-IDF</strong>:</p>

<ul>
  <li><a href="https://github.com/espressif/esp-idf/releases/tag/v6.0">Release notes for v6.0</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html">Documentation for ESP-IDF</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#boards">Supported boards</a></li>
</ul>

<h2 id="zephyr-rtos-v44">Zephyr RTOS v4.4</h2>

<p>We’re happy to announce updated support for the latest release v4.4.0 of <a href="https://www.zephyrproject.org/" target="_blank">Zephyr Project</a> - a scalable real-time operating system (RTOS) supporting multiple hardware architectures, optimized for resource-constrained devices, and built with safety and security in mind.</p>

<p><strong>Major enhancements in v4.4:</strong></p>

<ul>
  <li>A new biometrics API for integrating biometric sensors such as fingerprint scanners or facial recognition systems</li>
  <li>A new context switch implementation for ARM Cortex-M</li>
  <li>A new successfully qualified Bluetooth Low Energy (LE) Host stack, aligned with Bluetooth Core Specification 6.2</li>
</ul>

<p><strong>Related resources for Zephyr framework</strong>:</p>

<ul>
  <li><a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.4.0">Release notes for v4.4.0</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html">Documentation for Zephyr framework</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#platforms">Supported development platforms</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#boards">Supported boards</a></li>
</ul>

<h2 id="espressif32-dev-platform-v70">Espressif32 dev-platform v7.0</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/espressif32">Espressif 32</a> dev-platform brings support for the latest ESP-IDF, updated toolchain packages and several minor improvements:</p>

<ul>
  <li>Added support for ESP-IDF v6.0 (<a href="https://github.com/espressif/esp-idf/releases/tag/v6.0">release notes</a>)</li>
  <li>Updated IDF toolchains to v15.2.0+20251107</li>
  <li>Fixed matching of IDF components directory when there’s a symlink in the path to .platformio (<a href="https://github.com/platformio/platform-espressif32/pull/1599">#1599</a>)</li>
  <li>Minor fixes and improvements</li>
</ul>

<p><strong>Related resources for the Espressif32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/espressif32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-espressif32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v196">ST STM32 dev-platform v19.6</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform comes the latest Zephyr RTOS and several minor improvements:</p>

<ul>
  <li>Updated Zephyr to v4.4.0 (<a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.4.0">release notes</a>)</li>
  <li>Added Zephyr framework support to Nucleo U575ZI-Q (<a href="https://github.com/platformio/platform-ststm32/issues/896">#896</a>)</li>
  <li>Updates for WeAct Studio STM32G474 CoreBoard (<a href="https://github.com/platformio/platform-ststm32/pull/900">#900</a>)</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="microchip-avr-dev-platform-v52">Microchip AVR dev-platform v5.2</h2>

<p>The latest release of the <a href="https://registry.platformio.org/platforms/platformio/atmelavr">Microchip AVR</a> dev-platform brings updates for highly customizable Arduino cores by MCUdude and minor improvements:</p>

<ul>
  <li>Updated Arduino AVR core to v1.8.7 (<a href="https://github.com/arduino/ArduinoCore-avr/releases/tag/1.8.7">release notes</a>)</li>
  <li>Updated MCUdude cores:
    <ul>
      <li>MajorCore v3.1.0 (<a href="https://github.com/MCUdude/MajorCore/releases/tag/v3.1.0">release notes</a>)</li>
      <li>MegaCore v3.1.0 (<a href="https://github.com/MCUdude/MegaCore/releases/tag/v3.1.0">release notes</a>)</li>
      <li>MightyCore v3.1.0 (<a href="https://github.com/MCUdude/MightyCore/releases/tag/v3.1.0">release notes</a>)</li>
      <li>MiniCore v3.1.2 (<a href="https://github.com/MCUdude/MiniCore/releases/tag/v3.1.2">release notes</a>)</li>
      <li>MicroCore v2.5.2 (<a href="https://github.com/MCUdude/MicroCore/releases/tag/v2.5.2">release notes</a>)</li>
    </ul>
  </li>
  <li>Updated AVRDUDE packages to v8.1 for MCUdude cores (<a href="https://github.com/avrdudes/avrdude/releases/tag/v8.1">release notes</a>)</li>
</ul>

<p><strong>Related resources for the Microchip AVR dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/atmelavr.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-atmelavr/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="microchip-megaavr-dev-platform-v19">Microchip megaAVR dev-platform v1.9</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/atmelmegaavr">Microchip megaAVR</a> v1.9.0 brings several updated Arduino cores:</p>

<ul>
  <li>Added new board <code class="language-plaintext highlighter-rouge">ATtiny416 Xplained Nano</code></li>
  <li>Updated MegaCoreX to v1.1.6 (<a href="https://github.com/MCUdude/MegaCoreX/releases/tag/v1.1.6">release notes</a>)</li>
  <li>Updated megatinycore to v2.6.11 (<a href="https://github.com/SpenceKonde/megaTinyCore/releases/tag/2.6.11">release notes</a>)</li>
  <li>Updated DxCore core to v1.6.2 (<a href="https://github.com/SpenceKonde/DxCore/releases/tag/1.6.2">release notes</a>)</li>
  <li>Updated AVRDUDE packages to v8.1 for MCUdude cores (<a href="https://github.com/avrdudes/avrdude/releases/tag/v8.1">release notes</a>)</li>
  <li>Fixed serial port issue when burning bootloader (<a href="https://github.com/platformio/platform-atmelmegaavr/issues/67">#67</a>)</li>
</ul>

<p><strong>Related resources for the Microchip megaAVR dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/atmelmegaavr.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-atmelmegaavr/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="teensy-dev-platform-v51">Teensy dev-platform v5.1</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/teensy">Teensy</a> dev-platform brings support for the latest Teensyduino v1.60 and minor improvements:</p>

<ul>
  <li>Updated Teensyduino to v1.60 (<a href="https://github.com/PaulStoffregen/cores/releases/tag/1.60">release notes</a>)</li>
</ul>

<p><strong>Related resources for the Teensy dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/teensy.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-teensy/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[Support for the latest ESP-IDF and Zephyr RTOS, Updates for Espressif32, ST STM32, Microchip AVR/megaAVR and Teensy dev-platforms]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-april-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-april-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO Open Source February Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-februrary-2026-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source February Updates" /><published>2026-03-02T00:00:00+02:00</published><updated>2026-03-02T00:00:00+02:00</updated><id>https://piolabs.com/blog/news/platformio-oss-februrary-2026-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-februrary-2026-updates.html"><![CDATA[<p>Welcome to the February 2026 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.</p>

<p>This month we received a lot of helpful feedback from our community, which let us identify the most important parts of our OSS ecosystem that required our attention, so there are plenty of updates pushed in this month that we hope you will like.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-february-news.jpg" alt="PlatformIO Open Source February Updates" /></p>

<p>During February, we released a bugfix update for PlatformIO Core, added support for the latest ESP-IDF and Zephyr RTOS, rolled out updates for Espressif32, ST STM32 and other development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#platformio-core-6119" id="markdown-toc-platformio-core-6119">PlatformIO Core 6.1.19</a></li>
  <li><a href="#zephyr-rtos-v43" id="markdown-toc-zephyr-rtos-v43">Zephyr RTOS v4.3</a></li>
  <li><a href="#esp-idf-v553" id="markdown-toc-esp-idf-v553">ESP-IDF v5.5.3</a></li>
  <li><a href="#st-stm32-dev-platform-v195" id="markdown-toc-st-stm32-dev-platform-v195">ST STM32 dev-platform v19.5</a></li>
  <li><a href="#espressif32-dev-platform-v613" id="markdown-toc-espressif32-dev-platform-v613">Espressif32 dev-platform v6.13</a></li>
  <li><a href="#arduino-core-for-mbed-enabled-devices-v45" id="markdown-toc-arduino-core-for-mbed-enabled-devices-v45">Arduino Core for mbed-enabled devices v4.5</a></li>
</ul>

<h2 id="platformio-core-6119">PlatformIO Core 6.1.19</h2>

<p><a href="https://docs.platformio.org/en/latest/core/index.html">PlatformIO Core</a> is the heart of the whole PlatformIO ecosystem and we are excited to announce the next v6.1.19 release with lots of great improvements and bugfixes:</p>

<ul>
  <li>Added support for Python 3.14</li>
  <li>Upgraded the <a href="https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html">Doctest</a> testing framework to version 2.4.12, the <a href="https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html">GoogleTest</a> to version 1.17.0, and the <a href="https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/unity.html">Unity</a> to version 2.6.1, incorporating the latest features and improvements for enhanced testing capabilities</li>
  <li>Enhanced compatibility with the CCLS language server, improving integration with editors like <a href="https://docs.platformio.org/en/latest/integration/ide/emacs.html">Emacs</a>, <a href="https://docs.platformio.org/en/latest/integration/ide/sublimetext.html">Sublime Text</a>, and <a href="https://docs.platformio.org/en/latest/integration/ide/vim.html">Vim</a> (<a href="https://github.com/platformio/platformio-core/issues/5186">issue #5186</a>)</li>
  <li>Improved error messages for package installation to make it easier to understand when a package is missing or incompatible (<a href="https://github.com/platformio/platformio-core/pull/5336">pull #5336</a>).</li>
  <li>Fixed a regression issue where custom build flags were not properly reflected in the <a href="https://docs.platformio.org/en/latest/integration/compile_commands.html">compile_commands.json</a> file, ensuring accurate compilation database generation</li>
  <li>Fixed an issue where fully-qualified serial port URLs (e.g., <code class="language-plaintext highlighter-rouge">rfc2217://host:port</code>) were incorrectly treated as wildcard patterns (<a href="https://github.com/platformio/platformio-core/issues/5225">issue #5225</a>)</li>
  <li>Fixed an issue where the toolchain path in static analysis was not handled correctly if it contained spaces (<a href="https://github.com/platformio/platformio-core/issues/5351">pull #5351</a>)</li>
  <li>Fixed installation failure when the executable path contains spaces for <code class="language-plaintext highlighter-rouge">postinstall</code> scripts and handling both list and string command formats (<a href="https://github.com/platformio/platformio-core/pull/5366">pull #5366</a>)</li>
  <li>Fixed cleanup of the <code class="language-plaintext highlighter-rouge">.pio/libdeps</code> folder so that leftover libraries are properly removed when the <a href="https://docs.platformio.org/en/latest/projectconf/sections/env/options/library/lib_deps.html">lib_deps</a> option is empty (<a href="https://github.com/platformio/platformio-core/issues/5110">issue #5110</a>)</li>
</ul>

<p>See <a href="https://github.com/platformio/platformio-core/releases/tag/v6.1.19">Release Notes</a> for more detailed information and use <a href="https://docs.platformio.org/en/latest/core/userguide/cmd_upgrade.html">pio upgrade</a> command to update to the latest version.</p>

<h2 id="zephyr-rtos-v43">Zephyr RTOS v4.3</h2>

<p>We’re happy to announce updated support for the latest release v4.3.0 of <a href="https://www.zephyrproject.org/" target="_blank">Zephyr Project</a> - a scalable real-time operating system (RTOS) supporting multiple hardware architectures, optimized for resource-constrained devices, and built with safety and security in mind.</p>

<p><strong>Related resources for Zephyr framework</strong>:</p>

<ul>
  <li><a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.3.0">Release notes for v4.3.0</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html">Documentation for Zephyr framework</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#platforms">Supported development platforms</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#boards">Supported boards</a></li>
</ul>

<h2 id="esp-idf-v553">ESP-IDF v5.5.3</h2>

<p>We’re happy to announce updated support for the latest release of <strong>ESP-IDF v5.5.3</strong> - the official development framework for the ESP32, ESP32-S and ESP32-C Series SoCs. It provides a self-sufficient SDK for any generic application development on these platforms, using programming languages such as C and C++. ESP-IDF currently powers millions of devices in the field, and enables building a variety of network-connected products, ranging from simple light bulbs and toys to big appliances and industrial devices.</p>

<p><strong>Major enhancements in v5.5.3:</strong></p>

<ul>
  <li>Supported bluedroid host PAwR feature</li>
  <li>Added alignment checks for DMA when flash encryption is enabled</li>
  <li>SPI Master can transfer PSRAM buffers with DMA directly without extra copy</li>
</ul>

<p>More information on project configuration for ESP-IDF can be found <a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#configuration">here</a>.</p>

<p><strong>Related resources for ESP-IDF</strong>:</p>

<ul>
  <li><a href="https://github.com/espressif/esp-idf/releases/tag/v5.5.3">Release notes for v5.5.3</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html">Documentation for ESP-IDF</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#boards">Supported boards</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v195">ST STM32 dev-platform v19.5</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform comes with new boards, latest Zephyr RTOS, updated Arduino cores and several minor improvements:</p>

<ul>
  <li>Added new boards:
    <ul>
      <li>WeAct Studio STM32G474 CoreBoard</li>
      <li>LilyGo T3-STM32</li>
    </ul>
  </li>
  <li>Updated Zephyr to v4.3 (<a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.3.0">release notes</a>)</li>
  <li>Updated STM32 Arduino Core to v2.12.0 (<a href="https://github.com/stm32duino/Arduino_Core_STM32/releases/tag/2.12.0">release notes</a>)</li>
  <li>Updated Arduino-mbed core to v4.5.0 (<a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.5.0">release notes</a>)</li>
  <li>Updated J-Link to v9.2.0 (<a href="https://www.segger.com/downloads/jlink/ReleaseNotes_JLink.html">release notes</a>)</li>
  <li>Enabled CMSIS for Nucleo-H723ZG (<a href="https://github.com/platformio/platform-ststm32/pull/874">#894</a>)</li>
  <li>Minor fixes and improvements</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="espressif32-dev-platform-v613">Espressif32 dev-platform v6.13</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/espressif32">Espressif 32</a> dev-platform brings support for the latest ESP-IDF, updated packages and several minor improvements:</p>

<ul>
  <li>Added support for ESP-IDF v5.5.3 (<a href="https://github.com/espressif/esp-idf/releases/tag/v5.5.3">release notes</a>)</li>
  <li>Updated IDF toolchains to v14.2.0+20251107</li>
  <li>Updated <code class="language-plaintext highlighter-rouge">esptoolpy</code> to v4.11.0 (<a href="https://github.com/espressif/esptool/releases/tag/v4.11.0">release notes</a>)</li>
  <li>Minor fixes and improvements</li>
</ul>

<p><strong>Related resources for the Espressif32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/espressif32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-espressif32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="arduino-core-for-mbed-enabled-devices-v45">Arduino Core for mbed-enabled devices v4.5</h2>

<p>The <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a>, <a href="https://registry.platformio.org/platforms/platformio/nordicnrf52">Nordic nRF52</a> and <a href="https://registry.platformio.org/platforms/platformio/raspberrypi">Raspberry Pi RP2040</a> dev-platforms have been updated to support the latest Arduino Core for mbed-enabled devices v4.5.0. According to the <a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.5.0">release notes</a>, v4.5.0 brings a lot of bugfixes and improvements in the core and accompanying libraries.</p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[PlatformIO Core bugfix release, Support for the latest ESP-IDF and Zephyr RTOS, Updates for Espressif32, ST STM32 and mbed-enabled dev-platforms]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-february-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-february-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO 2025 Year in Review</title><link href="https://piolabs.com/blog/news/platformio-year-in-review-2025.html" rel="alternate" type="text/html" title="PlatformIO 2025 Year in Review" /><published>2026-01-05T00:00:00+02:00</published><updated>2026-01-05T00:00:00+02:00</updated><id>https://piolabs.com/blog/news/platformio-year-in-review-2025</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-year-in-review-2025.html"><![CDATA[<p>Even amid unprecedented challenges, PlatformIO Labs didn’t stand still - this period became one of steady progress, learning, and long-term growth.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/2026-01-05-platformio-year-in-review-2025/platformio_year_in_review_2025.png" alt="PlatformIO 2025 Year in Review" /></p>

<p>The year brought tests, but also victories. Our team in Ukraine kept working, learning, and building, even in difficult conditions. Adapting quickly and supporting each other helped us grow steadily. We finished the year stronger and more ready for what comes next.</p>

<h3>Table of Contents</h3>

<ul id="markdown-toc">
  <li><a href="#major-milestones" id="markdown-toc-major-milestones">Major Milestones</a>    <ul>
      <li><a href="#6-million-unique-installations" id="markdown-toc-6-million-unique-installations">6 Million Unique Installations</a></li>
      <li><a href="#long-term-support-you-can-rely-on" id="markdown-toc-long-term-support-you-can-rely-on">Long-Term Support You Can Rely On</a></li>
      <li><a href="#petabytes-of-traffic" id="markdown-toc-petabytes-of-traffic">Petabytes of Traffic</a></li>
      <li><a href="#helping-developers-learn-and-build" id="markdown-toc-helping-developers-learn-and-build">Helping Developers Learn and Build</a></li>
    </ul>
  </li>
  <li><a href="#words-of-appreciation" id="markdown-toc-words-of-appreciation">Words of Appreciation</a></li>
</ul>

<h2 id="major-milestones">Major Milestones</h2>

<h3 id="6-million-unique-installations">6 Million Unique Installations</h3>

<p>From the first installation to now, our <a href="https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide" target="_blank">PlatformIO IDE for VSCode</a> extension has grown faster than we ever imagined. Today, it has been installed over 6 million times! Each installation represents someone choosing to make their work easier, smarter, or more fun. Seeing this many people benefit from our work is truly inspiring.</p>

<p>Our success has also inspired many silicon vendors to introduce their own solutions and tools for VSCode. Even so, PlatformIO remains the most popular VS Code extension for embedded development and we’re proud to hold this position thanks to the trust of our community.</p>

<figure class="figure mb-7">
  <img class="figure-img img-fluid rounded lift lift-lg" src="/assets/posts/2026-01-05-platformio-year-in-review-2025/platformio_yearly_active_users_2014_2025.png" alt="PlatformIO Yearly Active Users (2014-2025)" />
  <figcaption class="figure-caption text-center">
    PlatformIO Active Users (2014-2025)
  </figcaption>
</figure>

<p>Thank you for choosing PlatformIO and helping us grow stronger every day!</p>

<h3 id="long-term-support-you-can-rely-on">Long-Term Support You Can Rely On</h3>

<p>We’re proud to say that we remain fully committed to maintaining all our development platforms, old and new. Over the past year, we delivered more than 20 releases, including updates to platforms that are less popular or considered “legacy”. We do this because we believe in providing reliable tools for every developer, no matter the project size or popularity of the platform. Every release reflects our dedication to quality, stability, and continuous improvement - ensuring that every user can rely on PlatformIO for their work, today and in the future.</p>

<h3 id="petabytes-of-traffic">Petabytes of Traffic</h3>

<p>Our <a href="/technology/trusted-package-registry.html">Trusted Package Registry</a> has become a core part of daily workflows for many developers and companies. As more teams rely on it for development and CI/CD pipelines, our yearly traffic has grown to petabytes of data. We’re happy to see this number increase, because it shows trust and long-term adoption. For us, it means we’ve become a reliable partner that teams can depend on for stable, fast, and scalable delivery of their services.</p>

<h3 id="helping-developers-learn-and-build">Helping Developers Learn and Build</h3>

<p>Our blog continues to be a public space for sharing high-quality content with the community. The content ranges from sneak-peeks of upcoming books to full-featured tutorials on CI/CD and other advanced workflows. Every post is designed to be practical, easy to follow, and useful for developers of all levels. We love seeing our readers try new ideas, improve their projects, and connect with the PlatformIO community through the knowledge we share.</p>

<h2 id="words-of-appreciation">Words of Appreciation</h2>

<p>Thank you to everyone in the PlatformIO community. Your enthusiasm, ideas, and trust have fueled our growth and motivated us to reach new heights. We’re proud of what we’ve built together and can’t wait to continue this journey - collaborating, innovating, and achieving even more in the years ahead.</p>

<p><strong>Have a great 2026!</strong></p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Ivan Kravets</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[Strengthening foundations, earning trust at scale, and continuing the journey with developers and partners around the world]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/2026-01-05-platformio-year-in-review-2025/platformio_year_in_review_2025.png" /><media:content medium="image" url="https://piolabs.com/assets/posts/2026-01-05-platformio-year-in-review-2025/platformio_year_in_review_2025.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO Open Source October Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-october-2025-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source October Updates" /><published>2025-11-03T00:00:00+02:00</published><updated>2025-11-03T00:00:00+02:00</updated><id>https://piolabs.com/blog/news/platformio-oss-october-2025-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-october-2025-updates.html"><![CDATA[<p>Welcome to the October 2025 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.</p>

<p>This month we received a lot of helpful feedback from our community, which let us identify the most important parts of our OSS ecosystem that required our attention, so there are plenty of updates pushed in this month that we hope you will like.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-october-news.jpg" alt="PlatformIO Open Source October Updates" /></p>

<p>During October, we released a bugfix release for PlatformIO Core, added support for the latest Zephyr framework, rolled out updates for ST STM32, Nordic nRF52 and Renesas RA development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#zephyr-rtos-v421" id="markdown-toc-zephyr-rtos-v421">Zephyr RTOS v4.2.1</a></li>
  <li><a href="#st-stm32-dev-platform-v194" id="markdown-toc-st-stm32-dev-platform-v194">ST STM32 dev-platform v19.4</a></li>
  <li><a href="#nordic-nrf52-dev-platform-v1010" id="markdown-toc-nordic-nrf52-dev-platform-v1010">Nordic nRF52 dev-platform v10.10</a></li>
  <li><a href="#renesas-ra-dev-platform-v18" id="markdown-toc-renesas-ra-dev-platform-v18">Renesas RA dev-platform v1.8</a></li>
  <li><a href="#arduino-core-for-mbed-enabled-devices-v44" id="markdown-toc-arduino-core-for-mbed-enabled-devices-v44">Arduino Core for mbed-enabled devices v4.4</a></li>
</ul>

<h2 id="zephyr-rtos-v421">Zephyr RTOS v4.2.1</h2>

<p>We’re happy to announce updated support for the latest release v4.2.1 of <a href="https://www.zephyrproject.org/" target="_blank">Zephyr Project</a> - a scalable real-time operating system (RTOS) supporting multiple hardware architectures, optimized for resource-constrained devices, and built with safety and security in mind.</p>

<p><strong>Related resources for Zephyr framework</strong>:</p>

<ul>
  <li><a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.2.1">Release notes for v4.2.1</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html">Documentation for Zephyr framework</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#platforms">Supported development platforms</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#boards">Supported boards</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v194">ST STM32 dev-platform v19.4</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform brings support for the latest Zephyr RTOS, updated Arduino cores, new boards and dev-kits, several minor improvements:</p>

<ul>
  <li>New boards:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">WE Oceanus-I EV</code></li>
      <li><code class="language-plaintext highlighter-rouge">WE Oceanus-I Module</code></li>
    </ul>
  </li>
  <li>Updated Zephyr to the latest v4.2.1 (<a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.2.1">release notes</a>)</li>
  <li>Updated STM32 Arduino Core to the latest v2.11.0 (<a href="https://github.com/stm32duino/Arduino_Core_STM32/releases/tag/2.11.0">release notes</a>)</li>
  <li>Updated Arduino-mbed core to v4.4.1 (<a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.4.1">release notes</a>)</li>
  <li>Added additional escaping for the binary image path in the J-Link upload script (<a href="https://github.com/platformio/platform-ststm32/pull/864">#864</a>)</li>
  <li>Updated Zephyr variant name for BluePill boards (<a href="https://github.com/platformio/platform-ststm32/pull/865">#865</a>)</li>
  <li>Added Zephyr support for Nucleo L552ZE-Q (<a href="https://github.com/platformio/platform-ststm32/pull/861">#861</a>)</li>
  <li>Minor fixes and improvements</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="nordic-nrf52-dev-platform-v1010">Nordic nRF52 dev-platform v10.10</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/nordicnrf52">Nordic nRF52</a> dev-platform brings support for the latest Arduino cores:</p>

<ul>
  <li>Updated Adafruit Arduino Core to the latest v1.7.0 (<a href="https://github.com/adafruit/Adafruit_nRF52_Arduino/releases/tag/1.7.0">release notes</a>)</li>
  <li>Updated Arduino-mbed core to v4.4.1 (<a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.4.1">release notes</a>)</li>
  <li>Minor fixes and improvements</li>
</ul>

<p><strong>Related resources for the Nordic nRF52 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/nordicnrf52.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-nordicnrf52/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="renesas-ra-dev-platform-v18">Renesas RA dev-platform v1.8</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/renesas-ra">Renesas RA</a> dev-platform v1.8.0 comes with a new board and support for the latest Arduino core:</p>

<ul>
  <li>Added new board <code class="language-plaintext highlighter-rouge">Arduino Nano R4</code></li>
  <li>Updated Arduino core to v1.5.1 (<a href="https://github.com/arduino/ArduinoCore-renesas/releases/tag/1.5.1">release notes</a>)</li>
</ul>

<p><strong>Related resources for the Renesas RA dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/renesas-ra.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-renesas-ra/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="arduino-core-for-mbed-enabled-devices-v44">Arduino Core for mbed-enabled devices v4.4</h2>

<p>The <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a>, <a href="https://registry.platformio.org/platforms/platformio/nordicnrf52">Nordic nRF52</a> and <a href="https://registry.platformio.org/platforms/platformio/raspberrypi">Raspberry Pi RP2040</a> dev-platforms have been updated to support the latest Arduino Core for mbed-enabled devices v4.4.1. According to the <a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.4.1">release notes</a>, v4.4.1 brings a lot of bugfixes and improvements in the core and accompanying libraries.</p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[Support for the latest Zephyr RTOS, Updates for ST STM32, Nordic nRF52, Renesas RA and mbed-enabled dev-platforms]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-october-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-october-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO Open Source August Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-august-2025-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source August Updates" /><published>2025-09-01T00:00:00+03:00</published><updated>2025-09-01T00:00:00+03:00</updated><id>https://piolabs.com/blog/news/platformio-oss-august-2025-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-august-2025-updates.html"><![CDATA[<p>Welcome to the August 2025 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.</p>

<p>This month we received a lot of helpful feedback from our community, which let us identify the most important parts of our OSS ecosystem that required our attention, so there are plenty of updates pushed in this month that we hope you will like.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-august-news.jpg" alt="PlatformIO Open Source August Updates" /></p>

<p>During August, we added support for the latest ESP-IDF and Zephyr frameworks, rolled out updates for several popular development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#esp-idf-v55" id="markdown-toc-esp-idf-v55">ESP-IDF v5.5</a></li>
  <li><a href="#zephyr-rtos-v42" id="markdown-toc-zephyr-rtos-v42">Zephyr RTOS v4.2</a></li>
  <li><a href="#espressif32-dev-platform-v612" id="markdown-toc-espressif32-dev-platform-v612">Espressif32 dev-platform v6.12</a></li>
  <li><a href="#st-stm32-dev-platform-v193" id="markdown-toc-st-stm32-dev-platform-v193">ST STM32 dev-platform v19.3</a></li>
  <li><a href="#nordic-nrf52-dev-platform-v1010" id="markdown-toc-nordic-nrf52-dev-platform-v1010">Nordic nRF52 dev-platform v10.10</a></li>
</ul>

<h2 id="esp-idf-v55">ESP-IDF v5.5</h2>

<p>We’re happy to announce updated support for the latest release of <strong>ESP-IDF v5.5</strong> - the official development framework for the ESP32, ESP32-S and ESP32-C Series SoCs. It provides a self-sufficient SDK for any generic application development on these platforms, using programming languages such as C and C++. ESP-IDF currently powers millions of devices in the field, and enables building a variety of network-connected products, ranging from simple light bulbs and toys to big appliances and industrial devices.</p>

<p><strong>Major enhancements in v5.5:</strong></p>

<ul>
  <li>Added UART DMA driver support</li>
  <li>Added support for std::filesystem</li>
  <li>Supported BR/EDR (e)SCO and Wi-Fi coexistence.</li>
  <li>Updated mbedTLS version to 3.6.3</li>
  <li>Greatly improved support for placing IRAM code into flash</li>
</ul>

<p>More information on project configuration for ESP-IDF can be found <a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#configuration">here</a>.</p>

<p><strong>Related resources for ESP-IDF</strong>:</p>

<ul>
  <li><a href="https://github.com/espressif/esp-idf/releases/tag/v5.5">Release notes for v5.5</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html">Documentation for ESP-IDF</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#boards">Supported boards</a></li>
</ul>

<h2 id="zephyr-rtos-v42">Zephyr RTOS v4.2</h2>

<p>We’re happy to announce updated support for the latest release v4.2 of <a href="https://www.zephyrproject.org/" target="_blank">Zephyr Project</a> - a scalable real-time operating system (RTOS) supporting multiple hardware architectures, optimized for resource-constrained devices, and built with safety and security in mind.</p>

<p>Major enhancements in v4.2.0:</p>

<ul>
  <li>The networking stack now includes full support for the MQTT 5.0 protocol.</li>
  <li>The Bluetooth Classic stack now includes support for Hands-Free Profile (HFP) for both Audio Gateway (AG) and Hands-Free (HF) roles.</li>
  <li>Updated Mbed TLS to version 3.6.4</li>
</ul>

<p><strong>Related resources for Zephyr framework</strong>:</p>

<ul>
  <li><a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.2.0">Release notes for v4.2.0</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html">Documentation for Zephyr framework</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#platforms">Supported development platforms</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#boards">Supported boards</a></li>
</ul>

<h2 id="espressif32-dev-platform-v612">Espressif32 dev-platform v6.12</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/espressif32">Espressif 32</a> dev-platform brings support for the latest ESP-IDF, new boards and several improvements:</p>

<ul>
  <li>Added new boards:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Cezerio dev ESP32C6</code></li>
      <li><code class="language-plaintext highlighter-rouge">Cezerio mini dev ESP32C6</code></li>
    </ul>
  </li>
  <li>Added support for ESP-IDF v5.5 (<a href="https://github.com/espressif/esp-idf/releases/tag/v5.5">release notes</a>)</li>
  <li>Updated CMake packages to v3.30</li>
  <li>Initial support for Secure Features (see <a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#security-features">instructions</a>)</li>
</ul>

<p><strong>Related resources for the Espressif32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/espressif32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-espressif32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v193">ST STM32 dev-platform v19.3</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform comes with support for the latest Zephyr RTOS and bug fixes:</p>

<ul>
  <li>Updated Zephyr to the latest v4.2.0 (<a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.2.0">release notes</a>)</li>
  <li>Fixed broken DFU uploader for STM32F103 targets</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="nordic-nrf52-dev-platform-v1010">Nordic nRF52 dev-platform v10.10</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/nordicnrf52">Nordic nRF52</a> dev-platform brings support for the latest Adafruit Arduino Core:</p>

<ul>
  <li>Updated Adafruit Arduino Core to the latest v1.7.0 (<a href="https://github.com/adafruit/Adafruit_nRF52_Arduino/releases/tag/1.7.0">release notes</a>)</li>
</ul>

<p><strong>Related resources for the Nordic nRF52 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/nordicnrf52.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-nordicnrf52/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[New boards and dev-kits, Support for the latest ESP-IDF and Zephyr RTOS, Updates for Espressif32, ST STM32 and Nordic nRF52]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-august-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-august-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO Open Source May Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-may-2025-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source May Updates" /><published>2025-06-02T00:00:00+03:00</published><updated>2025-06-02T00:00:00+03:00</updated><id>https://piolabs.com/blog/news/platformio-oss-may-2025-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-may-2025-updates.html"><![CDATA[<p>Welcome to the May 2025 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.</p>

<p>This month we received a lot of helpful feedback from our community, which let us identify the most important parts of our OSS ecosystem that required our attention, so there are plenty of updates pushed in this month that we hope you will like.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-may-news.jpg" alt="PlatformIO Open Source May Updates" /></p>

<p>During May, we added support for the latest ESP-IDF, rolled out updates for several popular development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#esp-idf-v541" id="markdown-toc-esp-idf-v541">ESP-IDF v5.4.1</a></li>
  <li><a href="#espressif32-dev-platform-v611" id="markdown-toc-espressif32-dev-platform-v611">Espressif32 dev-platform v6.11</a></li>
  <li><a href="#st-stm32-dev-platform-v192" id="markdown-toc-st-stm32-dev-platform-v192">ST STM32 dev-platform v19.2</a></li>
  <li><a href="#arduino-core-for-mbed-enabled-devices-v431" id="markdown-toc-arduino-core-for-mbed-enabled-devices-v431">Arduino Core for mbed-enabled devices v4.3.1</a></li>
</ul>

<h2 id="esp-idf-v541">ESP-IDF v5.4.1</h2>

<p>We’re happy to announce updated support for the latest release of <strong>ESP-IDF v5.4.1</strong> - the official development framework for the ESP32, ESP32-S and ESP32-C Series SoCs. It provides a self-sufficient SDK for any generic application development on these platforms, using programming languages such as C and C++. ESP-IDF currently powers millions of devices in the field, and enables building a variety of network-connected products, ranging from simple light bulbs and toys to big appliances and industrial devices.</p>

<p><strong>Major enhancements in v5.4.1:</strong></p>

<ul>
  <li>Added config to enable/disable BLE channel assessment and ping procedure on ESP32</li>
  <li>Optimization of RX calibration for Wi-Fi in high-interference environments</li>
  <li>Added MALLOC_CAP_SIMD flag to allocate memory that is suitable for SIMD instructions</li>
</ul>

<p>More information on project configuration for ESP-IDF can be found <a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#configuration">here</a>.</p>

<p><strong>Related resources for ESP-IDF</strong>:</p>

<ul>
  <li><a href="https://github.com/espressif/esp-idf/releases/tag/v5.4.1">Release notes for v5.4.1</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html">Documentation for ESP-IDF</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#boards">Supported boards</a></li>
</ul>

<h2 id="espressif32-dev-platform-v611">Espressif32 dev-platform v6.11</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/espressif32">Espressif 32</a> dev-platform brings support for the latest ESP-IDF, a new board and several fixes and improvements:</p>

<ul>
  <li>Added a new board: <code class="language-plaintext highlighter-rouge">Seeed Xiao ESP32C6</code></li>
  <li>Added support for ESP-IDF v5.4.1 (<a href="https://github.com/espressif/esp-idf/releases/tag/v5.4.1">release notes</a>)</li>
  <li>Added a new package for ESP32 series ROM ELF files (<a href="https://github.com/espressif/esp-rom-elfs/releases/tag/20240305">release notes</a>)</li>
  <li>Improvements to <code class="language-plaintext highlighter-rouge">Esp32ExceptionDecoder</code> to properly decode backtraces (<a href="https://github.com/platformio/platform-espressif32/pull/1572">#1572</a>)</li>
  <li>Fixed a incorrect OpenOCD config name for Freenove ESP32-Wrover (<a href="https://github.com/platformio/platform-espressif32/issues/1562">#1562</a>)</li>
</ul>

<p><strong>Related resources for the Espressif32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/espressif32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-espressif32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v192">ST STM32 dev-platform v19.2</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform comes with new boards, updated STM32Cube packages and several minor improvements:</p>

<ul>
  <li>Added a new board: <code class="language-plaintext highlighter-rouge">NUCLEO-G491RE</code></li>
  <li>Updated CMSIS packages to the latest available:
    <ul>
      <li>STM32F0 v2.3.7 (<a href="https://github.com/STMicroelectronics/cmsis-device-f0/releases/tag/v2.3.7">release notes</a>)</li>
      <li>STM32F1 v4.3.5 (<a href="https://github.com/STMicroelectronics/cmsis-device-f1/releases/tag/v4.3.5">release notes</a>)</li>
      <li>STM32F2 v2.2.6 (<a href="https://github.com/STMicroelectronics/cmsis-device-f2/releases/tag/v2.2.6">release notes</a>)</li>
      <li>STM32F3 v2.3.8 (<a href="https://github.com/STMicroelectronics/cmsis-device-f3/releases/tag/v2.3.8">release notes</a>)</li>
      <li>STM32F4 v2.6.11 (<a href="https://github.com/STMicroelectronics/cmsis-device-f4/releases/tag/v2.6.11">release notes</a>)</li>
      <li>STM32F7 v1.2.10 (<a href="https://github.com/STMicroelectronics/cmsis-device-f7/releases/tag/v1.2.10">release notes</a>)</li>
      <li>STM32G0 v1.4.4 (<a href="https://github.com/STMicroelectronics/cmsis-device-g0/releases/tag/v1.4.4">release notes</a>)</li>
      <li>STM32G4 v1.2.5 (<a href="https://github.com/STMicroelectronics/cmsis-device-g4/releases/tag/v1.2.5">release notes</a>)</li>
      <li>STM32H7 v1.10.6 (<a href="https://github.com/STMicroelectronics/cmsis-device-h7/releases/tag/v1.10.6">release notes</a>)</li>
      <li>STM32L0 v1.9.4 (<a href="https://github.com/STMicroelectronics/cmsis-device-l0/releases/tag/v1.9.4">release notes</a>)</li>
      <li>STM32L1 v2.3.4 (<a href="https://github.com/STMicroelectronics/cmsis-device-l1/releases/tag/v2.3.4">release notes</a>)</li>
      <li>STM32L4 v1.7.4 (<a href="https://github.com/STMicroelectronics/cmsis-device-l4/releases/tag/v1.7.4">release notes</a>)</li>
      <li>STM32L5 v1.0.6 (<a href="https://github.com/STMicroelectronics/cmsis-device-l5/releases/tag/v1.0.6">release notes</a>)</li>
    </ul>
  </li>
  <li>Updated Arduino-mbed core to v4.3.1 (<a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.3.1">release notes</a>)</li>
  <li>Updated stm32flash package to v0.7 (<a href="https://github.com/platformio/platform-ststm32/issues/610">#610</a>, <a href="https://github.com/platformio/platform-ststm32/issues/640">#640</a>, <a href="https://github.com/platformio/platform-ststm32/issues/665">#665</a>)</li>
  <li>Updated SVD Files for STM32G0 series (<a href="https://github.com/platformio/platform-ststm32/pull/847">#847</a>)</li>
  <li>Enabled Arduino for genericSTM32F407IGT6 (<a href="https://github.com/platformio/platform-ststm32/pull/844">#844</a>)</li>
  <li>Enabled Zephyr for Nucleo-G070RB (<a href="https://github.com/platformio/platform-ststm32/pull/854">#854</a>)</li>
  <li>Added DFU as upload method for WeAct MiniSTM32H743 (<a href="https://github.com/platformio/platform-ststm32/issues/850">#850</a>)</li>
  <li>Fixed default RAM size for genericSTM32H750VB board (<a href="https://github.com/platformio/platform-ststm32/issues/843">#843</a>)</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="arduino-core-for-mbed-enabled-devices-v431">Arduino Core for mbed-enabled devices v4.3.1</h2>

<p>The <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a>, <a href="https://registry.platformio.org/platforms/platformio/nordicnrf52">Nordic nRF52</a> and <a href="https://registry.platformio.org/platforms/platformio/raspberrypi">Raspberry Pi RP2040</a> dev-platforms have been updated to support the latest Arduino Core for mbed-enabled devices v4.3.1. According to the <a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.3.1">release notes</a>, v4.3.1 brings a lot of bugfixes and improvements in the core and accompanying libraries.</p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[New boards and dev-kits, Support for the latest ESP-IDF, Updates for Espressif32, ST STM32 and mbed-enabled dev-platforms]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-may-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-may-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO Open Source March Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-march-2025-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source March Updates" /><published>2025-04-07T00:00:00+03:00</published><updated>2025-04-07T00:00:00+03:00</updated><id>https://piolabs.com/blog/news/platformio-oss-march-2025-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-march-2025-updates.html"><![CDATA[<p>Welcome to the March 2025 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.</p>

<p>This month we received a lot of helpful feedback from our community, which let us identify the most important parts of our OSS ecosystem that required our attention, so there are plenty of updates pushed in this month that we hope you will like.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-march-news.jpg" alt="PlatformIO Open Source March Updates" /></p>

<p>During March, we released a bugfix release for PlatformIO Core, added support for the latest Zephyr framework, rolled out updates for ST STM32 and Renesas RA development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#platformio-core-6118" id="markdown-toc-platformio-core-6118">PlatformIO Core 6.1.18</a></li>
  <li><a href="#zephyr-rtos-v41" id="markdown-toc-zephyr-rtos-v41">Zephyr RTOS v4.1</a></li>
  <li><a href="#st-stm32-dev-platform-v191" id="markdown-toc-st-stm32-dev-platform-v191">ST STM32 dev-platform v19.1</a></li>
  <li><a href="#renesas-ra-dev-platform-v17" id="markdown-toc-renesas-ra-dev-platform-v17">Renesas RA dev-platform v1.7</a></li>
  <li><a href="#arduino-core-for-mbed-enabled-devices-v424" id="markdown-toc-arduino-core-for-mbed-enabled-devices-v424">Arduino Core for mbed-enabled devices v4.2.4</a></li>
</ul>

<h2 id="platformio-core-6118">PlatformIO Core 6.1.18</h2>

<p><a href="https://docs.platformio.org/en/latest/core/index.html">PlatformIO Core</a> is the heart of the whole PlatformIO ecosystem and we are excited to announce the next v6.1.18 release with lots of great improvements and bugfixes:</p>

<ul>
  <li>Introduced the <a href="https://docs.platformio.org/en/latest/envvars.html#envvar-PLATFORMIO_RUN_JOBS">PLATFORMIO_RUN_JOBS</a> environment variable, allowing manual override of the number of parallel build jobs (<a href="https://github.com/platformio/platformio-core/issues/5077">issue #5077</a>)</li>
  <li>Added support for <code class="language-plaintext highlighter-rouge">tar.xz</code> tarball dependencies (<a href="https://github.com/platformio/platformio-core/pull/4974">pull #4974</a>)</li>
  <li>Ensured that dependencies of private libraries are no longer unnecessarily re-installed, optimizing dependency management and reducing redundant operations (<a href="https://github.com/platformio/platformio-core/issues/4987">issue #4987</a>)</li>
  <li>Resolved an issue where the <code class="language-plaintext highlighter-rouge">compiledb</code> target failed to properly escape compiler executable paths containing spaces (<a href="https://github.com/platformio/platformio-core/issues/4998">issue #4998</a>)</li>
  <li>Resolved an issue with incorrect path resolution when linking static libraries via the <a href="https://docs.platformio.org/en/latest/projectconf/sections/env/options/build/build_flags.html">build_flags</a> option (<a href="https://github.com/platformio/platformio-core/issues/5004">issue #5004</a>)</li>
  <li>Resolved an issue where the <code class="language-plaintext highlighter-rouge">--project-dir</code> flag did not function correctly with the <a href="https://docs.platformio.org/en/latest/core/userguide/cmd_check.html">pio check</a> and <a href="https://docs.platformio.org/en/latest/core/userguide/cmd_debug.html">pio debug</a> commands (<a href="https://github.com/platformio/platformio-core/issues/5029">issue #5029</a>)</li>
  <li>Resolved an issue where the <a href="https://docs.platformio.org/en/latest/librarymanager/ldf.html">LDF</a> occasionally excluded bundled platform libraries from the dependency graph (<a href="https://github.com/platformio/platformio-core/pull/4941">pull #4941</a>)</li>
  <li>Resolved a regression issue that prevented <a href="https://docs.platformio.org/en/latest/home/index.html">PIO Home</a> from opening external links (<a href="https://github.com/platformio/platformio-core/issues/5084">issue #5084</a>)</li>
</ul>

<p>See <a href="https://github.com/platformio/platformio-core/releases/tag/v6.1.18">Release Notes</a> for more detailed information and use <a href="https://docs.platformio.org/en/latest/core/userguide/cmd_upgrade.html">pio upgrade</a> command to update to the latest version.</p>

<h2 id="zephyr-rtos-v41">Zephyr RTOS v4.1</h2>

<p>We’re happy to announce updated support for the latest release v4.1 of <a href="https://www.zephyrproject.org/" target="_blank">Zephyr Project</a> - a scalable real-time operating system (RTOS) supporting multiple hardware architectures, optimized for resource-constrained devices, and built with safety and security in mind.</p>

<p>Major enhancements in v4.1.0:</p>

<ul>
  <li>Multiple performance improvements of core Zephyr kernel functions</li>
  <li>New USB MIDI 2.0 device driver, allowing Zephyr devices to communicate with MIDI controllers and instruments over USB</li>
</ul>

<p><strong>Related resources for Zephyr framework</strong>:</p>

<ul>
  <li><a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.1.0">Release notes for v4.1.0</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html">Documentation for Zephyr framework</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#platforms">Supported development platforms</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/zephyr.html#boards">Supported boards</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v191">ST STM32 dev-platform v19.1</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform brings support for the latest Zephyr RTOS, updated Arduino cores, new boards and dev-kits, several minor improvements:</p>

<ul>
  <li>New boards:
    <ul>
      <li>ST Nucleo H563ZI</li>
      <li>Ebyte E77 Dev Board</li>
    </ul>
  </li>
  <li>Updated Zephyr to the latest v4.1.0 (<a href="https://github.com/zephyrproject-rtos/zephyr/releases/tag/v4.1.0">release notes</a>)</li>
  <li>Updated STM32 Arduino Core to the latest v2.10.1 (<a href="https://github.com/stm32duino/Arduino_Core_STM32/releases/tag/2.10.1">release notes</a>)</li>
  <li>Updated Arduino-mbed core to v4.2.4 (<a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.2.4">release notes</a>)</li>
  <li>Fixed missing macro that enables custom peripheral pins for several boards (<a href="https://github.com/platformio/platform-ststm32/issues/832">#832</a>)</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="renesas-ra-dev-platform-v17">Renesas RA dev-platform v1.7</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/renesas-ra">Renesas RA</a> dev-platform v1.7.0 brings support for the latest Arduino core:</p>

<ul>
  <li>Updated Arduino core to v1.4.1 (<a href="https://github.com/arduino/ArduinoCore-renesas/releases/tag/1.4.1">release notes</a>)</li>
</ul>

<p><strong>Related resources for the Renesas RA dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/renesas-ra.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-renesas-ra/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="arduino-core-for-mbed-enabled-devices-v424">Arduino Core for mbed-enabled devices v4.2.4</h2>

<p>The <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a>, <a href="https://registry.platformio.org/platforms/platformio/nordicnrf52">Nordic nRF52</a> and <a href="https://registry.platformio.org/platforms/platformio/raspberrypi">Raspberry Pi RP2040</a> dev-platforms have been updated to support the latest Arduino Core for mbed-enabled devices v4.2.4. According to the <a href="https://github.com/arduino/ArduinoCore-mbed/releases/tag/4.2.4">release notes</a>, v4.2.4 brings a lot of bugfixes and improvements in the core and accompanying libraries.</p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[PlatformIO Core bugfix release, Support for the latest Zephyr RTOS 4.1, Updates for ST STM32, Renesas RA and mbed-enabled dev-platforms]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-march-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-march-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Basics of Wired Embedded Protocols</title><link href="https://piolabs.com/blog/engineering/wired-embedded-protocols-basics.html" rel="alternate" type="text/html" title="Basics of Wired Embedded Protocols" /><published>2025-03-13T00:00:00+02:00</published><updated>2025-03-13T00:00:00+02:00</updated><id>https://piolabs.com/blog/engineering/wired-embedded-protocols-basics</id><content type="html" xml:base="https://piolabs.com/blog/engineering/wired-embedded-protocols-basics.html"><![CDATA[<script id="MathJax-script" async="" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>

<p>The essence of any protocol lies in the transmission of data. In the world of digital electronics, data is represented in binary form, that is, as sequences of zeros and ones. These two symbols form the foundation for storing, processing, and transmitting all information in digital systems, with protocols serving as the key tools for exchanging these binary data, providing a structured and reliable method of transferring them between devices.</p>

<!-- more -->

<div class="alert alert-light" role="alert">
  <b>Disclaimer</b>: This article is Chapter 2 of my book <b>"Wired Protocols in Embedded Systems"</b>,
  which I am currently writing. If you find this topic interesting, you can find and support the book at:
  <a href="https://leanpub.com/wiredembeddedprotocols">LeanPub</a>
</div>

<h3>Table of Contents</h3>

<ul id="markdown-toc">
  <li><a href="#voltage-levels" id="markdown-toc-voltage-levels">Voltage Levels</a>    <ul>
      <li><a href="#ttl-transistor-transistor-logic" id="markdown-toc-ttl-transistor-transistor-logic">TTL (Transistor-Transistor Logic)</a></li>
      <li><a href="#cmos-complementary-metal-oxide-semiconductor" id="markdown-toc-cmos-complementary-metal-oxide-semiconductor">CMOS (Complementary Metal-Oxide-Semiconductor)</a></li>
    </ul>
  </li>
  <li><a href="#pull-up-and-pull-down-resistors" id="markdown-toc-pull-up-and-pull-down-resistors">Pull-Up and Pull-Down Resistors</a>    <ul>
      <li><a href="#pull-up-resistors" id="markdown-toc-pull-up-resistors">Pull-Up Resistors</a></li>
      <li><a href="#pull-down-resistors" id="markdown-toc-pull-down-resistors">Pull-Down Resistors</a></li>
      <li><a href="#selecting-the-resistor-value" id="markdown-toc-selecting-the-resistor-value">Selecting the Resistor Value</a>        <ul>
          <li><a href="#the-impact-of-power-consumption-on-resistor-selection" id="markdown-toc-the-impact-of-power-consumption-on-resistor-selection">The Impact of Power Consumption on Resistor Selection</a></li>
          <li><a href="#the-effect-of-signal-speed-on-resistor-value-selection" id="markdown-toc-the-effect-of-signal-speed-on-resistor-value-selection">The Effect of Signal Speed on Resistor Value Selection</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#types-of-output-stages" id="markdown-toc-types-of-output-stages">Types of Output Stages</a>    <ul>
      <li><a href="#push-pull-output-stage" id="markdown-toc-push-pull-output-stage">Push-Pull Output Stage</a></li>
      <li><a href="#open-drain-output-stage" id="markdown-toc-open-drain-output-stage">Open-Drain Output Stage</a></li>
    </ul>
  </li>
  <li><a href="#wired-and-connection" id="markdown-toc-wired-and-connection">Wired AND Connection</a></li>
  <li><a href="#conclusion" id="markdown-toc-conclusion">Conclusion</a></li>
</ul>

<p>The concepts of a <strong>logical one</strong> and a <strong>logical zero</strong> play a central role in the architecture of digital electronics, creating the fundamental basis for all data operations. From simple logic gates that form the basic building blocks of electronic circuits to complex microprocessors and digital communication systems, these foundational concepts are employed everywhere.</p>

<p><strong>Logical Zero</strong> typically represents the absence of voltage or a lower voltage level in an electronic circuit. In the context of the binary numeral system, a logical zero corresponds to the value “0”.</p>

<p><strong>Logical One</strong> represents the presence of voltage or a higher voltage level. In the binary numeral system, a logical one corresponds to the value “1”.</p>

<p>However, in practice, these abstract concepts require specification. It is essential to clearly define which voltage levels correspond to logical zero and one and how these levels are transmitted in physical circuits. These aspects are fundamental for the design and utilization of any data transmission systems. In this chapter, we will delve into the details necessary for a deep understanding and effective work with wired data transmission protocols.</p>

<h2 id="voltage-levels">Voltage Levels</h2>

<p>When we talk about <strong>logical one</strong> and <strong>logical zero</strong>, we often use relative terms: high or low level, presence or absence of a signal. However, in real circuits, these levels are represented by specific voltage values. In this section, we will examine how voltage is used to encode logical levels in various digital circuit technologies.</p>

<p>In typical digital circuits, logical one and logical zero are encoded using different voltage levels:</p>

<ul>
  <li><strong>Logical one</strong> usually corresponds to the full supply voltage.</li>
  <li><strong>Logical zero</strong> corresponds to zero voltage or a voltage close to zero.</li>
</ul>

<p>Ideally, signals in digital circuits would always adopt only these two levels: maximum supply voltage for logical one and zero for logical zero. However, in practice, various factors, such as parasitic effects, voltage drops across transistors, and noise, lead to deviations from these ideal values.</p>

<p>Despite this, digital circuits can correctly interpret signals by using <em>voltage ranges</em> within which values are defined as logical one or logical zero. In real circuits, the levels of logical one and zero are not single specific values but rather <em>ranges</em> of voltage values, where a signal falling within these ranges will be interpreted as either logical one or logical zero:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.1.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.1.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.1 - Voltage ranges for interpreting 1 and 0
    </figcaption>
</figure>

<p>As we can see, the logical one and zero correspond to specific voltage ranges, marked in red for one and blue for zero. If the signal level falls within these ranges, the chip is guaranteed to correctly interpret the signal (sections <code class="language-plaintext highlighter-rouge">A</code> and <code class="language-plaintext highlighter-rouge">B</code>). However, there is a gap between these two ranges (section <code class="language-plaintext highlighter-rouge">C</code>), where the presence of a signal makes it impossible to interpret.</p>

<p>These voltage ranges are standardized based on the circuit technology used in the design of a particular chip. There are many such technologies: <em>ECL</em> (Emitter-Coupled Logic), <em>RTL</em> (Resistor-Transistor Logic), <em>DTL</em> (Diode-Transistor Logic), and so on. However, I will focus on two of the most well-known: <em>TTL</em> (Transistor-Transistor Logic) and <em>CMOS</em> (Complementary Metal-Oxide-Semiconductor).</p>

<p><strong>Note 1:</strong> Currently, CMOS is the dominant technology for manufacturing most modern integrated circuits, including processors, memory, and mobile devices.</p>

<h3 id="ttl-transistor-transistor-logic">TTL (Transistor-Transistor Logic)</h3>

<p>TTL (Transistor-Transistor Logic) is a technology developed and widely adopted in the 1960s, which became the foundation for many digital devices due to its reliability and design simplicity. As the name suggests, all logic elements in this technology are implemented using bipolar transistors.</p>

<p>Let’s look at an example of a two-input <em>NAND</em> gate constructed using TTL logic:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.2.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.2.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.2 - Two-input TTL NAND gate
    </figcaption>
</figure>

<p>Components based on TTL logic are designed to operate with a standard supply voltage of 5 volts, with allowable variations within +/- 0.25 volts. Ideally, a signal corresponding to a high logical level would have a voltage exactly at 5 volts, and a signal representing a low logical level would be exactly 0 volts. However, in practice, TTL components can correctly interpret logical levels even when they deviate from these ideal values. Acceptable voltage ranges for input signals vary from 0 to 0.8 volts for a low level and from 2 to 5 volts for a high level. For output signals, manufacturers guarantee that, under certain load conditions, voltages will remain within 0 to 0.5 volts for a low level and 2.7 to 5 volts for a high level:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.3.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.3.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.3 - Voltage ranges for TTL logic
    </figcaption>
</figure>

<p>When a signal with a voltage between 0.8 and 2 volts is applied to the input of a TTL element, no clear response from the circuit can be expected. Such a signal will be interpreted as <em>undefined</em>, and no manufacturer will provide guarantees as to which logical level it will be assigned.</p>

<p>You may notice that the allowable limits for output signal levels are stricter compared to those for input signals. This ensures that every digital signal transmitted from the output of one TTL element to the input of another corresponds to a voltage acceptable for the latter. This difference in tolerances for input and output signals is referred to as the <em>noise margin</em> (high or low level). In TTL logic, the noise margin for the low logical level is the difference between 0.8 V and 0.5 V (i.e., 0.3 V), and for the high logical level, it is the difference between 2.7 V and 2 V (i.e., 0.7 V). In other words, the noise margin determines the maximum allowable noise or interference that can be superimposed on the output signal of a logic circuit before the receiving circuit begins to misinterpret it.</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.4.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.4.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.4 - Noise margin for TTL logic
    </figcaption>
</figure>

<p>If the allowable levels for input and output signals in TTL logic were the same, the system’s noise immunity would be significantly reduced. Any slight change in the output signal caused by external noise or interference could lead to that signal being misinterpreted at the input of the next element. In such a situation, the system would become extremely vulnerable to external influences, potentially causing a chain reaction of errors in the logic circuits, rendering reliable system operation nearly impossible.</p>

<p>The noise margin creates a “buffer” between the levels at which signals are considered valid, ensuring that signals subjected to minor changes due to noise are still correctly interpreted by the receiver. This is critically important for ensuring the reliability and stability of digital devices, especially in environments with high levels of electromagnetic interference.</p>

<h3 id="cmos-complementary-metal-oxide-semiconductor">CMOS (Complementary Metal-Oxide-Semiconductor)</h3>

<p>The CMOS technology, widely adopted since the 1970s, uses pairs of complementary field-effect transistors (MOSFETs), including n-channel and p-channel transistors, to create efficient logic circuits. This technology achieves high energy efficiency because significant power consumption occurs only during state transitions of the circuit, while in a static state, power consumption is extremely low. This characteristic makes CMOS circuits ideal for portable devices where battery life is a critical concern.</p>

<p>Additionally, CMOS technology offers high noise immunity and the ability to operate within a wide range of supply voltages, extending its applications not only in portable electronics but also in various areas of digital technology, including computers, mobile phones, and consumer electronics. These features, combined with the capability to integrate a large number of transistors on a relatively small silicon substrate area, have made CMOS technology the dominant choice for manufacturing microprocessors, memory, and other integrated circuits.</p>

<p>The same two-input NAND gate implemented using CMOS logic would look as follows:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.5.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.5.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.5 - Two-input CMOS NAND gate
    </figcaption>
</figure>

<p>Voltage levels for CMOS technology depend on the supply voltage, enabling these circuits to operate across a wide voltage range. This is one of the key advantages of CMOS, as it provides greater flexibility in designing electronic devices and systems. A typical range for CMOS supply voltages can vary from 1.8 V to 15 V.</p>

<p>Let us consider the voltage levels for CMOS logic with a supply voltage of 5V.</p>

<p>In the context of CMOS elements with a supply voltage of 5 volts, acceptable voltage levels for input signals range from 0 to 1.5 volts for a low logical level and from 3.5 to 5 volts for a high logical level. For output signals, manufacturers guarantee voltage levels between 0 and 0.05 volts for a logical zero and between 4.95 and 5 volts for a logical one:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.6.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.6.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.6 - Voltage ranges for CMOS logic
    </figcaption>
</figure>

<p>These voltage values illustrate that CMOS logic elements have significantly greater noise margins compared to TTL-based elements. The noise margin for CMOS is 1.45 volts for both logical zero and logical one, whereas for TTL, this margin reaches a maximum of 0.7 volts:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.7.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.7.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.7 - Noise margin for CMOS logic
    </figcaption>
</figure>

<p>This means that CMOS circuits can tolerate more than double the amount of noise imposed on input signals without misinterpreting them as logical zeros or ones.</p>

<h2 id="pull-up-and-pull-down-resistors">Pull-Up and Pull-Down Resistors</h2>

<p>A pull-up resistor is a fundamental component in embedded system design, used to ensure a stable logical level on the input or output of a microcontroller or other digital logic when the input/output may be inactive or floating.</p>

<p>A pull-up resistor is connected between the corresponding input/output and the power supply voltage (<code class="language-plaintext highlighter-rouge">VCC</code>) or ground (<code class="language-plaintext highlighter-rouge">GND</code>). Its primary function is to “pull” the voltage level on the input/output to a high or low logical level when other active elements in the circuit are not influencing that input/output.</p>

<p>What does it mean to “pull”? It means that in the idle state of the line — when no device is transmitting on it — a specific signal level will be established: either logical one or logical zero. This is a crucial concept because such pulling ensures that we can always reliably determine the current signal level on the communication line.</p>

<p>Pull-up resistors serve the following purposes:</p>

<ol>
  <li><strong>Eliminating Floating States:</strong> Inputs on microcontrollers and other digital devices can “float” if they are not connected to a defined logical level. A “floating” input can randomly be interpreted as high or low due to electrical noise, leading to unpredictable behavior. Pull-up resistors ensure a stable logical state.</li>
  <li><strong>Ensuring Correct Control Logic:</strong> In certain circuits, for example, when a button or switch is used to close a circuit to ground, a pull-up resistor ensures that the input remains high in the absence of activation and transitions to a low level only when the button is pressed.</li>
  <li><strong>Reducing Noise:</strong> Maintaining an input or output in a defined state reduces susceptibility to electrical noise.</li>
</ol>

<h3 id="pull-up-resistors">Pull-Up Resistors</h3>

<p>Pull-up resistors are connected between the signal line and the positive power supply:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.8.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.8.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.8 - Pull-Up Resistor
    </figcaption>
</figure>

<p>When the switch <code class="language-plaintext highlighter-rouge">S1</code> is open (section <code class="language-plaintext highlighter-rouge">A</code> of Figure 1.8), the entire line is connected to the power supply through the pull-up resistor <code class="language-plaintext highlighter-rouge">R1</code>, and a high logical level is established on the line. If the switch <code class="language-plaintext highlighter-rouge">S1</code> is closed (section <code class="language-plaintext highlighter-rouge">B</code> of Figure 1.8), it creates a direct connection to ground, and the logical level on the line changes to low.</p>

<p>Thus, this pull-up resistor ensures a high logical level on the line in an idle state. This type of pull-up resistor is crucial for our topic, as it is used in many protocols to pull signal lines up to the supply voltage. Without this resistor, the operation of these protocols cannot be organized. Examples of protocols that require the presence of a pull-up resistor include 1-Wire and I2C.</p>

<h3 id="pull-down-resistors">Pull-Down Resistors</h3>

<p>Pull-down resistors are connected between the signal line and ground:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.9.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.9.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.9 - Pull-Down Resistor
    </figcaption>
</figure>

<p>When the switch <code class="language-plaintext highlighter-rouge">S1</code> is open (section <code class="language-plaintext highlighter-rouge">A</code> of Figure 1.9), the entire line is connected to ground through the pull-down resistor <code class="language-plaintext highlighter-rouge">R1</code>, and a low logical level is established on the line. If the switch <code class="language-plaintext highlighter-rouge">S1</code> is closed (section <code class="language-plaintext highlighter-rouge">B</code> of Figure 1.9), it creates a direct connection to the power supply line, and the logical level on the line changes to high.</p>

<p>This type of pull-down resistor is not used in the protocols discussed in this book. However, it is frequently applied to ensure a stable logical zero level on the microcontroller pins. It is often used for all unused pins of a microcontroller.</p>

<h3 id="selecting-the-resistor-value">Selecting the Resistor Value</h3>

<p>The value of pull-up and pull-down resistors depends on the specific application. <em>They must be large enough not to impose a significant load on the power supply circuit, yet small enough to ensure rapid changes in logical levels.</em></p>

<ul>
  <li><strong>Too low a resistance</strong> increases current consumption, which is especially critical for battery-powered devices.</li>
  <li><strong>Too high a resistance</strong> can slow down signal transitions, reduce the signal-to-noise ratio, and increase susceptibility to interference.</li>
</ul>

<p>Let’s take a closer look at the factors that influence the selection of the resistor value.</p>

<h4 id="the-impact-of-power-consumption-on-resistor-selection">The Impact of Power Consumption on Resistor Selection</h4>

<p>First, let’s examine the phrase: <em>not to impose a significant load on the power supply circuit</em>. A current flows through the pull-up resistor, as it does through any circuit element, and this current is drawn from the power source connected to the device. According to Ohm’s Law, the value of the pull-up resistor directly affects the current flowing through it, and consequently, the total current consumption of the entire circuit.</p>

<p><span class="alert alert-light" role="alert" style="display: inline-block;">
  <b>Note 2</b>: Ohm’s Law states that the current <span>(\(I\))</span> through a resistor is
  proportional to the voltage (\(V\)) across it and inversely proportional to
  its resistance (\(R\)):
\(I = \frac{V}{R} \tag{1.1}\)
</span></p>

<p>Let’s compare the current consumption for three cases of pull-up resistor values: 1 kΩ, 4.7 kΩ, and 10 kΩ, with a supply voltage of 5V:</p>

<ol>
  <li>For a 1 kΩ resistor, the current value will be:
\(I = \frac{V}{R} = \frac{5 (V)}{1000 (Ω)} = 5 (mA)\)</li>
  <li>For a 4.7 kΩ resistor, the current value will be:
\(I = \frac{V}{R} = \frac{5 (V)}{4700 (Ω)} ≈ 1 (mA)\)</li>
  <li>For a 10 kΩ resistor, the current value will be:
\(I = \frac{V}{R} = \frac{5 (V)}{10000 (Ω)} = 500 (\mu\text{A})\)</li>
</ol>

<p>These values illustrate how current changes depending on the resistor’s resistance. The difference between the extreme values is up to 10 times, which is critical for low-power devices.</p>

<div class="alert alert-light" role="alert">
  <b>Note 3</b>: A higher resistance value for the pull-up resistor can help save power.
  For example, in low-speed protocols, a larger pull-up resistor value can be chosen,
  thereby positively affecting the overall power consumption of the circuit.
</div>

<p>Increasing the resistance of the resistor reduces the current flowing through the circuit, which decreases power consumption — an essential factor for battery-powered devices. However, by reducing the current through higher resistance, you also weaken the signal, and a weak signal:</p>

<ul>
  <li><em>Increases the likelihood of errors</em> during data transmission due to the reduced signal amplitude relative to noise levels.</li>
  <li><em>Makes the line more susceptible</em> to electromagnetic interference and parasitic capacitance.</li>
</ul>

<p>Pull-up resistors are often chosen within the range of \(1\text{k}\Omega - 10\text{k}\Omega\). This range provides a reasonable trade-off between power consumption, switching speed, and data transmission reliability.</p>

<h4 id="the-effect-of-signal-speed-on-resistor-value-selection">The Effect of Signal Speed on Resistor Value Selection</h4>

<p>Now let’s take a closer look at the phrase: <em>ensure rapid changes in logical levels</em>.</p>

<p>The fact is that the signal line and ground create what is known as a <em>parasitic capacitor</em> — a data transmission line inherently has capacitance, even if no physical capacitor is connected. This capacitance arises due to the parasitic capacitance of PCB traces, cables (in the case of external devices), IC pins, and other components of electrical circuits, all of which inherently possess some level of capacitance. These capacitances occur both between signal conductors themselves and between power lines, signal conductors, and everything else on the board.</p>

<p>When you add the resistance of the pull-up resistor to this capacitance, an <code class="language-plaintext highlighter-rouge">RC</code> circuit is formed:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.10.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.10.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.10 - RC circuit formed by a pull-up resistor and parasitic capacitance
    </figcaption>
</figure>

<p>The main characteristic of any RC circuit that affects the speed of signal changes is the <em>time constant of the circuit (\(RC\) constant)</em>.</p>

<p>The \(RC\) constant time constant of a circuit is defined by the following formula:</p>

\[\tau = R \cdot C \tag{1.2}\]

<p>where:</p>

<ul>
  <li>\(\tau\) — the time constant of the circuit,</li>
  <li>\(R\) — resistance in ohms (Ω),</li>
  <li>\(C\) — capacitance in farads (F).</li>
</ul>

<p>It is measured in seconds and represents the time required for the signal to reach approximately 63.2% of the full charge of capacitor \(C\) in response to a step change in voltage across resistor \(R\) from logical zero to logical one:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.11.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.11.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.11 - The effect of the <b><i>RC</i></b> constant on capacitor charging
    </figcaption>
</figure>

<p>Or for the capacitor to discharge to 36.8% of its initial value in response to a step change in voltage across resistor \(R\) from logical one to logical zero:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.12.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.12.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.12 - The effect of the <b><i>RC</i></b> constant on capacitor discharging
    </figcaption>
</figure>

<p><span class="alert alert-light" role="alert" style="display: inline-block;">
  <b>Note 4</b>: The formula \(\tau = R \cdot C\) is used for simplified circuit analysis.
  <b>The time constant (\(\tau\))</b> represents the time required for the voltage
  across the capacitor to reach approximately <b>63% of the full charge level</b>
  (\(V_{PULLUP}\)), and this formula is used as an approximation for rough calculations.
</span></p>

<p>However, the charging process is described by the equation:</p>

\[V(t) = V_{PULLUP} \cdot \left(1 - e^{-\frac{t}{R \cdot C}}\right) \tag{1.3}\]

<p>To determine the time required for the voltage to reach a specific level \(V(t)\) (different from 63% or 95%), this equation can be rearranged as:</p>

\[t = -R \cdot C \cdot \ln\left(1 - \frac{V(t)}{V_{PULLUP}}\right) \tag{1.4}\]

<p>This is a more precise expression that describes the <strong>capacitor charging process</strong>, based on the exponential relationship of voltage over time.</p>

<p>However, for our purposes — understanding the reason for delayed signal edges — the formula \(\tau = R \cdot C\) is sufficient.</p>

<p>From formula \(1.2\), it follows that the higher the resistor’s resistance, the larger the value of \(\tau\), and thus the longer it takes for the signal to transition from one logical level to another. Consequently, the slower the protocol that can operate on this line.</p>

<p>Let’s again compare the values of \(\tau\) for the same three pull-up resistor values: 1 kΩ, 4.7 kΩ, and 10 kΩ, assuming a parasitic capacitance of 10 nF:</p>

<ul>
  <li>
    <p>For a 1 kΩ resistor:
\(\tau = R \cdot C = 1 \, \text{k}\Omega \cdot 10 \, \text{nF} = 0.00001 \, \text{s} = 10 \, \mu\text{s} \tag{1.5}\)</p>
  </li>
  <li>
    <p>For a 4.7 kΩ resistor:
\(\tau = R \cdot C = 4.7 \, \text{k}\Omega \cdot 10 \, \text{nF} = 0.000047 \, \text{s} = 47 \, \mu\text{s} \tag{1.6}\)</p>
  </li>
  <li>
    <p>For a 10 kΩ resistor:
\(\tau = R \cdot C = 10 \, \text{k}\Omega \cdot 10 \, \text{nF} = 0.0001 \, \text{s} = 100 \, \mu\text{s} \tag{1.7}\)</p>
  </li>
</ul>

<p>This parameter significantly affects the shape of the signal we actually observe on the line. Let’s explore how this happens in more detail.</p>

<p>Let’s take our circuit with a pull-up resistor and a switch, but this time connect an oscilloscope to it:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.13.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.13.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br /> Figure 1.13 - Initial circuit for analyzing the effect of the <b><i>RC</i></b> constant on signal shape
    </figcaption>
</figure>

<p>We begin toggling the switch <code class="language-plaintext highlighter-rouge">S1</code> at a fixed frequency. On the oscilloscope screen, we expect to see the following signal:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.14.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.14.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.14 - Ideal signal shape
    </figcaption>
</figure>

<p>However, in reality, we might observe something like this:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.15.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.15.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.15 - Actual signal shape
    </figcaption>
</figure>

<p>This signal distortion occurs, as you might have guessed, due to the presence of parasitic capacitance and the formation of an RC circuit.</p>

<p>Let’s examine this in detail using a single signal period as an example.</p>

<p>When the switch <code class="language-plaintext highlighter-rouge">S1</code> is open, parasitic capacitance starts charging through the pull-up resistor from the power line. The charging time depends on the value of the \(RC\) constant. On the oscilloscope screen, this will appear as a distorted signal:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.16.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.16.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.16 - Signal shape during the charging of parasitic capacitance
    </figcaption>
</figure>

<p>Now let’s close the switch <code class="language-plaintext highlighter-rouge">S1</code>. The parasitic capacitor starts discharging through the switch <code class="language-plaintext highlighter-rouge">S1</code>. Since it discharges directly through the switch and not through the resistor, the discharge process is faster than in a classic RC circuit, as shown in Figure 1.12. This is why the falling edge appears smooth. When the capacitor is fully discharged, the line reaches a low logical level:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.17.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.17.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.17 - Signal shape during the discharge of parasitic capacitance
    </figcaption>
</figure>

<p>This process repeats for every signal period, resulting in the following signal on the oscilloscope:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.18.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.18.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.18 - Actual signal shape during capacitor charging/discharging

    </figcaption>
</figure>

<p>The greater the total parasitic capacitance, the more pronounced the distortion of the signal edges becomes. Since parasitic capacitance is often beyond our control, we must manage these distortions by adjusting the resistance of the pull-up resistor.</p>

<p>The main issue here is that parasitic capacitance and the RC circuit delay the signal edges, which severely limits the maximum frequency at which signals can be transmitted on the line. If this delay is too long, the signal may fail to reach the required voltage level for the IC to unambiguously interpret the input signal as a <code class="language-plaintext highlighter-rouge">1</code>. Let’s illustrate this using an example of an IC with CMOS voltage levels.</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.19.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.19.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.19 - Signal fails to reach the logical high level due to high parasitic capacitance
    </figcaption>
</figure>

<p>Due to high parasitic capacitance, the signal fails to reach the voltage level of 3.5V — the lower threshold for recognizing a logical high. One possible solution to this problem is to reduce the value of the RC constant by decreasing the resistance of the pull-up resistor.</p>

<div class="alert alert-light" role="alert">
  <b>Note 5</b>: The capacitance of the signal line is such an important parameter
  that it must be considered when implementing any protocol.
  In fact, almost all standards impose a specific limit on this value.
</div>

<p>In summary, selecting the optimal resistor value requires balancing the desired signal switching speed and minimizing power consumption. For critical applications where switching speed is a priority, lower-resistance resistors are preferred. In applications where energy efficiency is more important, higher-resistance resistors can be used, provided that this does not compromise the functionality of the circuit.</p>

<h2 id="types-of-output-stages">Types of Output Stages</h2>

<p>Modern microcontrollers, as well as other ICs, offer the ability to configure their pins to operate in one of two output modes: <em>Push-Pull</em> or <em>Open-Drain</em>. This configurability provides engineers with the flexibility to select the optimal mode for each specific case, considering factors such as electrical characteristics, data exchange speed, and power consumption.</p>

<p>To ensure successful integration with various communication protocols connected to the microcontroller, it is essential to understand the features and operating principles of these modes.</p>

<h3 id="push-pull-output-stage">Push-Pull Output Stage</h3>

<p>The Push-Pull output stage consists of a pair of <em>complementary transistors</em> that work in harmony to <strong>actively</strong> control the voltage level on the output for both high and low states. One transistor is connected to the positive power supply, “pushing” the output signal to the high state, while the other transistor is connected to ground, “pulling” the output to the low state:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.20.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.20.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.20 - Push-Pull Output Stage
    </figcaption>
</figure>

<div class="alert alert-light" role="alert">
  <b>Note 6</b>: The term <b>active</b> control, in the context of electronic
  circuits such as Push-Pull output stages, refers to the circuit's ability to
  dynamically and directly manage the voltage level at its output without
  relying on additional external components like pull-up or pull-down resistors.
  This means that the Push-Pull output stage itself dictates the line's voltage
  level, rather than any external components.
</div>

<div class="alert alert-light" role="alert">
  <b>Note 7</b>: <i>Complementary</i> refers to transistors with opposite
  conductivity types. If one transistor in the pair is n-type, the other must
  be p-type. These transistors are controlled in opposition to each other: when
  one transistor is activated, it "pulls" the output to the power supply
  voltage level (Vcc), creating a high logical level. Simultaneously, the other
  transistor remains off, preventing current flow. To create a low logical
  level, the second transistor is activated, "pulling" the output to
  ground (GND), while the first transistor is turned off.
</div>

<p>The logic behind the Push-Pull output stage is straightforward. If the input value is <strong>logical one</strong>, the P-channel transistor <code class="language-plaintext highlighter-rouge">Q1</code> is <strong>off</strong> (does not conduct current), while the N-channel transistor <code class="language-plaintext highlighter-rouge">Q2</code> is <strong>on</strong> (conducts current) — resulting in the output value being <strong>logical zero</strong>, thanks to a low-impedance connection to ground:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.21.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.21.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.21 - Logical zero formation at the Push-Pull output stage
    </figcaption>
</figure>

<p>If the input value is <strong>logical zero</strong>, the P-channel transistor <code class="language-plaintext highlighter-rouge">Q1</code> is <strong>on</strong> (conducts current), while the N-channel transistor <code class="language-plaintext highlighter-rouge">Q2</code> is <strong>off</strong> (does not conduct current) — resulting in the output value being <strong>logical one</strong>:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.22.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.22.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.22 - Logical one formation at the Push-Pull output stage
    </figcaption>
</figure>

<p><strong>Advantages</strong></p>

<ol>
  <li><strong>Fast Switching:</strong> Due to active control of both levels, Push-Pull stages provide higher switching speeds compared to open-drain/collector configurations. Remember the discussion on parasitic capacitance? The speed at which any capacitance charges or discharges depends directly on the current supplied to it. In a Push-Pull design, active control of both voltage levels allows sufficient current to rapidly alter the charge of parasitic capacitance. This, in turn, increases the signal line’s operating speed.</li>
  <li><strong>Lower Power Consumption:</strong> Since no external pull-up resistor is required to pull the signal to a high level, Push-Pull stages can be more energy-efficient in certain applications. The absence of a pull-up resistor eliminates quiescent current through the resistor, reducing overall power consumption.</li>
</ol>

<p><strong>Disadvantages</strong></p>

<ol>
  <li>
    <p><strong>Risk of Short Circuit:</strong> If, due to a design error or failure, both transistors are turned on simultaneously, an excessive current may flow through them, potentially leading to rapid component failure and circuit damage. In a Push-Pull design, each device on the bus can actively drive the line, supplying both high and low levels. If two devices attempt to drive opposite signal levels simultaneously, this can result in a short circuit on the line. Consider the two scenarios:</p>

    <ul>
      <li><strong>Short Circuit within the Push-Pull Stage:</strong> This occurs if both transistors are turned on (conducting current) simultaneously. This can happen during a transition in gate control voltage when one transistor has not fully turned off and still conducts current, while the other has already turned on. This effectively shorts the power supply to ground, causing a short circuit:</li>
    </ul>
    <figure class="figure mb-5" align="center">
     <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.23.jpg&quot;}" href="#">
         <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.23.jpg" />
     </a>
     <figcaption class="figure-caption text-center">
         <br />Figure 1.23 - Short circuit within the Push-Pull stage
     </figcaption>
 </figure>

    <ul>
      <li><strong>Short Circuit across Multiple Push-Pull Stages:</strong> This occurs if two devices are on the same line, and one device attempts to drive a logical one while the other tries to drive a logical zero simultaneously. Again, this results in the power supply being shorted to ground:</li>
    </ul>
    <figure class="figure mb-5" align="center">
 <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.23.jpg&quot;}" href="#">
     <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.23.jpg" />
 </a>
 <figcaption class="figure-caption text-center">
     <br />Figure 1.23 - Short circuit within the Push-Pull stage
 </figcaption>
 </figure>
  </li>
  <li>
    <p><strong>Complex Control:</strong> Proper operation of a Push-Pull stage requires precise synchronization of control signals for both transistors to avoid simultaneous activation. This necessitates more sophisticated control mechanisms, complicating driver design.</p>
  </li>
</ol>

<p><a name="od-output"></a></p>

<h3 id="open-drain-output-stage">Open-Drain Output Stage</h3>

<p>The concept of an open-drain plays a key role in many digital circuits and embedded system protocols. This term refers to the way transistors are connected and operate in ICs, where the transistor’s output is not directly connected to the power supply (it remains “open”).</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.25.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.25.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.25 - Open-Drain Output Stage
    </figcaption>
</figure>

<p>For this circuit to operate, an external resistor is required to connect the transistor’s output to the supply voltage:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.26.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.26.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.26 - Open-Drain Output Stage with an external resistor
    </figcaption>
</figure>

<p>When the transistor is off (does not conduct current), the output signal is formed by the pull-up resistor. This is fundamentally different from the Push-Pull configuration, where the signal is actively controlled entirely by the transistors:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.27.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.27.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.27 - Logical one formation at the Open-Drain output stage
    </figcaption>
</figure>

<p>When the transistor is on (conducts current), the output is connected to ground, and the output signal becomes low. No short circuits occur because the current flows through the resistor:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.28.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.28.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.28 - Logical zero formation at the Open-Drain output stage
    </figcaption>
</figure>

<p>This approach to implementing a bus interface has several notable characteristics:</p>

<ul>
  <li>The line will always remain high (logical one) unless one of the devices on the bus turns on its N-channel transistor to pull the logical level of the line down to zero. This connection type is known as <strong>“wired-AND”</strong>. More about this configuration will be discussed in the next section.</li>
  <li>Data transmission is effectively carried out only by <strong>pulling the line down</strong> to the value of <strong>logical zero</strong>, as the logical one is automatically set by the pull-up resistor.</li>
  <li>Only this configuration allows directly connecting two (or more) open-drain (or open-collector) drivers to a single bus: the pull-up resistor ensures there is no short circuit between Vdd and GND.</li>
</ul>

<h2 id="wired-and-connection">Wired AND Connection</h2>

<p>In wired embedded protocols, it is common to encounter situations where devices are connected to a shared line pulled up to the supply voltage through a pull-up resistor:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.29.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.29.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.29 - Wired AND Connection
    </figcaption>
</figure>

<p>This type of connection is used in protocols such as 1-Wire, I2C, and I3C and is called <strong>Wired AND</strong> because, just like the result of a logical AND operation is zero if at least one operand is zero, in the <strong>Wired AND</strong> connection, <em>the line will be in a logical one state if all devices on the line drive it to a logical one, and in a logical zero state if at least one device drives it to a logical zero</em>.</p>

<p>The truth table for the diagram:</p>

<figure class="figure mb-7">
  <table class="table table-sm table-striped table-bordered" style="text-align: center">
    <thead class="thead">
      <tr class="table-dark">
        <th scope="col">DEV1</th>
        <th scope="col">DEV2</th>
        <th scope="col">DEV3</th>
        <th scope="col">BUS</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>0</td>
        <td>1</td>
        <td>0</td>
      </tr>
      <tr>
        <td>0</td>
        <td>0</td>
        <td>0</td>
        <td>0</td>
      </tr>
      <tr>
        <td>0</td>
        <td>1</td>
        <td>1</td>
        <td>0</td>
      </tr>
      <tr>
        <td>0</td>
        <td>1</td>
        <td>0</td>
        <td>0</td>
      </tr>
      <tr>
        <td>1</td>
        <td>0</td>
        <td>0</td>
        <td>0</td>
      </tr>
      <tr>
        <td>1</td>
        <td>0</td>
        <td>1</td>
        <td>0</td>
      </tr>
      <tr>
        <td>1</td>
        <td>1</td>
        <td>0</td>
        <td>0</td>
      </tr>
      <tr>
        <td>1</td>
        <td>1</td>
        <td>1</td>
        <td>1</td>
      </tr>
    </tbody>
  </table>
</figure>

<p>This behavior is enabled by the fact that the output stages of all devices connected to the shared line are implemented as Open-Drain:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.30.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.30.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.30 - Output stages of devices in a Wired AND connection
    </figcaption>
</figure>

<p>As you can see, all devices connected to the shared line use Open-Drain output stages: <code class="language-plaintext highlighter-rouge">Q1</code>, <code class="language-plaintext highlighter-rouge">Q2</code>, and <code class="language-plaintext highlighter-rouge">Q3</code>. Input buffers <code class="language-plaintext highlighter-rouge">D1</code>, <code class="language-plaintext highlighter-rouge">D2</code>, and <code class="language-plaintext highlighter-rouge">D3</code> allow the devices to also read the line state.</p>

<p>Let’s examine how the <strong>Wired AND</strong> connection works.</p>

<p>As we recall from the section <a href="#od-output">Open-Drain Output Stage</a>, an Open-Drain stage actively drives only the low level, while the high level is set automatically by the pull-up resistor. Thus, when all output transistors of the devices connected to the bus are off, the entire line is pulled to the supply voltage by the pull-up resistor, resulting in a logical one state:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.31.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.31.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.31 - Logical one formation in a Wired AND connection
    </figcaption>
</figure>

<p>Now let’s see what happens if, for example, device <code class="language-plaintext highlighter-rouge">DEV2</code> turns on its transistor <code class="language-plaintext highlighter-rouge">Q2</code>:</p>

<figure class="figure mb-5" align="center">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.32.jpg&quot;}" href="#">
        <img class="img-fluid screenshot mw-md-50" src="/assets/posts/2025-03-13-wired-embedded-protocols-basics/figure-1.32.jpg" />
    </a>
    <figcaption class="figure-caption text-center">
        <br />Figure 1.32 - Logical zero formation in a Wired AND connection
    </figcaption>
</figure>

<p>In this case, the entire line transitions to a low logical state because device <code class="language-plaintext highlighter-rouge">DEV2</code> effectively pulls the line to ground through its active transistor <code class="language-plaintext highlighter-rouge">Q2</code>. Notably, devices <code class="language-plaintext highlighter-rouge">DEV1</code> and <code class="language-plaintext highlighter-rouge">DEV3</code> do not change their states and effectively “want” to set a logical one on the line. However, it only takes one device (<code class="language-plaintext highlighter-rouge">DEV2</code> in this case) setting the line to a logical zero for the line to adopt a logical zero state. This is why the bit <code class="language-plaintext highlighter-rouge">0</code> is called <strong>dominant</strong>.</p>

<p>This feature of the <strong>Wired AND</strong> connection underpins fundamental functions in various protocols, such as the device discovery algorithm in the 1-Wire bus and bus arbitration in I2C, which will be discussed in their respective chapters. Moreover, thanks to the use of Open-Drain stages, this connection is safe for operation with multiple devices on the same line, regardless of whether any device is transmitting a logical one or zero. These unique characteristics make the <strong>Wired AND</strong> connection widely used in many wired communication protocols.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Communication protocols are the foundation of digital systems, enabling the transmission and processing of information in binary form. In this chapter, we explored the key aspects underlying such protocols, from the concepts of logical one and logical zero to practical implementations, including various voltage levels, resistor usage, types of output stages, and device connection methods.</p>

<p>Understanding how data transmission works at the physical level is critical for designing and configuring wired protocols. Knowledge of which voltage levels correspond to logical values, how to select appropriate resistor values, and the characteristics of different output stages is essential for proper design and ensuring reliable data transmission.</p>

<p>Each of these factors can significantly impact system efficiency, noise immunity, and compatibility with various devices. Engineers and developers must consider these details when designing digital interfaces, enabling the creation of more robust and high-speed communication systems.</p>

<p>Further exploration of specific wired protocols, such as 1-Wire, UART, I2C, SPI, and others, will reveal even more details to consider when developing effective and reliable solutions for digital data transmission.</p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>
<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Alex Kavalchuk</name></author><category term="blog" /><category term="engineering" /><summary type="html"><![CDATA[A Comprehensive Look at the Physical Level Principles that enable Reliable Embedded System Communication]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/2025-03-13-wired-embedded-protocols-basics/cover.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/2025-03-13-wired-embedded-protocols-basics/cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PlatformIO Open Source January Updates</title><link href="https://piolabs.com/blog/news/platformio-oss-january-2025-updates.html" rel="alternate" type="text/html" title="PlatformIO Open Source January Updates" /><published>2025-02-03T00:00:00+02:00</published><updated>2025-02-03T00:00:00+02:00</updated><id>https://piolabs.com/blog/news/platformio-oss-january-2025-updates</id><content type="html" xml:base="https://piolabs.com/blog/news/platformio-oss-january-2025-updates.html"><![CDATA[<p>Welcome to the January 2025 updates of <a href="https://platformio.org/">PlatformIO Open Source</a> professional collaborative platform for embedded development.
What better way to start the new year than by sharing a few exciting updates? Here’s a look at what we’ve accomplished this January.</p>

<!-- more -->

<p><img class="figure-img img-fluid rounded" src="/assets/posts/oss-updates/platformio-oss-january-news.jpg" alt="PlatformIO Open Source January Updates" /></p>

<p>During January, we added support for the latest ESP-IDF, rolled out updates for several popular development platforms, fixed a lot of issues. Some of the key highlights include:</p>

<ul id="markdown-toc">
  <li><a href="#esp-idf-v54" id="markdown-toc-esp-idf-v54">ESP-IDF v5.4</a></li>
  <li><a href="#espressif32-dev-platform-v610" id="markdown-toc-espressif32-dev-platform-v610">Espressif32 dev-platform v6.10</a></li>
  <li><a href="#st-stm32-dev-platform-v190" id="markdown-toc-st-stm32-dev-platform-v190">ST STM32 dev-platform v19.0</a></li>
  <li><a href="#renesas-ra-dev-platform-v16" id="markdown-toc-renesas-ra-dev-platform-v16">Renesas RA dev-platform v1.6</a></li>
</ul>

<h2 id="esp-idf-v54">ESP-IDF v5.4</h2>

<p>We’re happy to announce updated support for the latest release of <strong>ESP-IDF v5.4</strong> - the official development framework for the ESP32, ESP32-S and ESP32-C Series SoCs. It provides a self-sufficient SDK for any generic application development on these platforms, using programming languages such as C and C++. ESP-IDF currently powers millions of devices in the field, and enables building a variety of network-connected products, ranging from simple light bulbs and toys to big appliances and industrial devices.</p>

<p><strong>Major enhancements in v5.4:</strong></p>

<ul>
  <li>Amazon SMP Kernel: Upgraded to upstream v11.1.0</li>
  <li>MbedTLS: Updated the MbedTLS version to v3.6.2</li>
  <li>Added support for BLE scanning and initiating state coexistence on ESP32</li>
  <li>Added a new Generic PHY driver to support all 802.3 compliant PHYs</li>
</ul>

<p>More information on project configuration for ESP-IDF can be found <a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#configuration">here</a>.</p>

<p><strong>Related resources for ESP-IDF</strong>:</p>

<ul>
  <li><a href="https://github.com/espressif/esp-idf/releases/tag/v5.4">Release notes for v5.4</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html">Documentation for ESP-IDF</a></li>
  <li><a href="https://docs.platformio.org/en/latest/frameworks/espidf.html#boards">Supported boards</a></li>
</ul>

<h2 id="espressif32-dev-platform-v610">Espressif32 dev-platform v6.10</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/espressif32">Espressif 32</a> dev-platform brings support for the latest ESP-IDF, new boards and dev-kits, several fixes and improvements:</p>

<ul>
  <li>Added new boards:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Freenove ESP32-S3-WROOM</code></li>
      <li><code class="language-plaintext highlighter-rouge">Freenove ESP32-WROVER-E</code></li>
      <li><code class="language-plaintext highlighter-rouge">RYMCU ESP32-DevKitC</code></li>
      <li><code class="language-plaintext highlighter-rouge">RYMCU ESP32-C3-DevKitM-1</code></li>
      <li><code class="language-plaintext highlighter-rouge">ESP32-S3-DevKitC-1</code></li>
      <li><code class="language-plaintext highlighter-rouge">LilyGo T3 S3</code></li>
    </ul>
  </li>
  <li>Added support for ESP-IDF v5.4 (<a href="https://github.com/espressif/esp-idf/releases/tag/v5.4">release notes</a>)</li>
  <li>Updated toolchain packages for IDF to v14.2.0</li>
  <li>Added support for ESP32-C6 ULP (<a href="https://github.com/platformio/platform-espressif32/issues/1507">#1507</a>)</li>
  <li>Better handling of the IDF Python virtual environment (<a href="https://github.com/platformio/platform-espressif32/issues/1525">#1525</a>)</li>
  <li>Added automatic rebuild for IDF projects if external dependencies changed (<a href="https://github.com/platformio/platform-espressif32/issues/1514">#1514</a>)</li>
  <li>Enabled by default IDF Component Manager option to allow modification of managed components</li>
  <li>Fixed missing PSRAM flags for <code class="language-plaintext highlighter-rouge">Adafruit Feather ESP32-S3 TFT</code> (<a href="https://github.com/platformio/platform-espressif32/issues/1498">#1498</a>)</li>
  <li>Fixed default flash frequency for <code class="language-plaintext highlighter-rouge">Heltec Wireless Stick Lite</code> (<a href="https://github.com/platformio/platform-espressif32/issues/1480">#1480</a>)</li>
  <li>Added missing USB_CDC flag for <code class="language-plaintext highlighter-rouge">Romeo ESP32-S3</code> (<a href="https://github.com/platformio/platform-espressif32/issues/1512">#1512</a>)</li>
</ul>

<p><strong>Related resources for the Espressif32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/espressif32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-espressif32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="st-stm32-dev-platform-v190">ST STM32 dev-platform v19.0</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/ststm32">ST STM32</a> dev-platform comes with new boards, updated STM32Cube packages and several minor improvements:</p>

<ul>
  <li>Added new boards: <code class="language-plaintext highlighter-rouge">Blues Cygnet</code>, <code class="language-plaintext highlighter-rouge">Blues Swan R5</code></li>
  <li>Updated STM32Cube packages to the latest available (<a href="https://github.com/platformio/platform-ststm32/pull/806">#806</a>):
    <ul>
      <li>STM32CubeF0 v1.11.5 (<a href="https://github.com/STMicroelectronics/STM32CubeF0/releases/tag/v1.11.5">release notes</a>)</li>
      <li>STM32CubeF1 v1.8.6 (<a href="https://github.com/STMicroelectronics/STM32CubeF1/releases/tag/v1.8.6">release notes</a>)</li>
      <li>STM32CubeF2 v1.9.5 (<a href="https://github.com/STMicroelectronics/STM32CubeF2/releases/tag/v1.9.5">release notes</a>)</li>
      <li>STM32CubeF3 v1.11.5 (<a href="https://github.com/STMicroelectronics/STM32CubeF3/releases/tag/v1.11.5">release notes</a>)</li>
      <li>STM32CubeF4 v1.28.1 (<a href="https://github.com/STMicroelectronics/STM32CubeF4/releases/tag/v1.28.1">release notes</a>)</li>
      <li>STM32CubeF7 v1.17.2 (<a href="https://github.com/STMicroelectronics/STM32CubeF7/releases/tag/v1.17.2">release notes</a>)</li>
      <li>STM32CubeG0 v1.6.2 (<a href="https://github.com/STMicroelectronics/STM32CubeG0/releases/tag/v1.6.2">release notes</a>)</li>
      <li>STM32CubeG4 v1.6.1 (<a href="https://github.com/STMicroelectronics/STM32CubeG4/releases/tag/v1.6.1">release notes</a>)</li>
      <li>STM32CubeH7 v1.12.1 (<a href="https://github.com/STMicroelectronics/STM32CubeH7/releases/tag/v1.12.1">release notes</a>)</li>
      <li>STM32CubeL0 v1.12.2 (<a href="https://github.com/STMicroelectronics/STM32CubeL0/releases/tag/v1.12.2">release notes</a>)</li>
      <li>STM32CubeL1 v1.10.4 (<a href="https://github.com/STMicroelectronics/STM32CubeL1/releases/tag/v1.10.4">release notes</a>)</li>
      <li>STM32CubeL4 v1.18.1 (<a href="https://github.com/STMicroelectronics/STM32CubeL4/releases/tag/v1.18.1">release notes</a>)</li>
      <li>STM32CubeL5 v1.5.1 (<a href="https://github.com/STMicroelectronics/STM32CubeL5/releases/tag/v1.5.1">release notes</a>)</li>
    </ul>
  </li>
  <li>Added support for project-based Zephyr manifest files</li>
  <li>Fixed broken variant name for Nucleo F446ZE (<a href="https://github.com/platformio/platform-ststm32/pull/819">#819</a>)</li>
  <li>Improved consistency between Blues boards (<a href="https://github.com/platformio/platform-ststm32/pull/824">#824</a>)</li>
</ul>

<p><strong>Related resources for the ST STM32 dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/ststm32.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-ststm32/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 id="renesas-ra-dev-platform-v16">Renesas RA dev-platform v1.6</h2>

<p>The new release of the <a href="https://registry.platformio.org/platforms/platformio/renesas-ra">Renesas RA</a> dev-platform v1.6.0 brings support for the latest Arduino core:</p>

<ul>
  <li>Updated Arduino core to v1.3.2 (<a href="https://github.com/arduino/ArduinoCore-renesas/releases/tag/1.3.2">release notes</a>)</li>
</ul>

<p><strong>Related resources for the Renesas RA dev-platform</strong>:</p>

<ul>
  <li><a href="https://docs.platformio.org/en/latest/platforms/renesas-ra.html">Documentation</a></li>
  <li><a href="https://github.com/platformio/platform-renesas-ra/tree/develop/examples">Project Examples</a></li>
</ul>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Valerii Koval</name></author><category term="blog" /><category term="news" /><summary type="html"><![CDATA[New boards and dev-kits, Support for the latest ESP-IDF, Updates for Espressif32, ST STM32 and Renesas RA dev-platforms]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-january-news.jpg" /><media:content medium="image" url="https://piolabs.com/assets/posts/oss-updates/platformio-oss-january-news.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Leveraging PlatformIO and STM32CubeIDE for Optimized STM32 Firmware Development</title><link href="https://piolabs.com/blog/insights/platformio-stm32cube-workflow.html" rel="alternate" type="text/html" title="Leveraging PlatformIO and STM32CubeIDE for Optimized STM32 Firmware Development" /><published>2025-01-13T00:00:00+02:00</published><updated>2025-01-13T00:00:00+02:00</updated><id>https://piolabs.com/blog/insights/platformio-stm32cube-workflow</id><content type="html" xml:base="https://piolabs.com/blog/insights/platformio-stm32cube-workflow.html"><![CDATA[<p>My preferred environment for firmware development is VSCode with PlatformIO.
However, for one of my projects, I needed to develop on an STM32, and for this MCU family,
STM32CubeIDE is the manufacturer’s recommended tool.</p>

<!-- more -->

<h3>Table of Contents</h3>

<ul id="markdown-toc">
  <li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
  <li><a href="#existing-conversion-tools" id="markdown-toc-existing-conversion-tools">Existing conversion tools</a></li>
  <li><a href="#project-setup" id="markdown-toc-project-setup">Project setup</a></li>
  <li><a href="#synching-files" id="markdown-toc-synching-files">Synching files</a></li>
  <li><a href="#file-locations-on-both-environments" id="markdown-toc-file-locations-on-both-environments">File Locations on both environments</a></li>
  <li><a href="#build-configurations" id="markdown-toc-build-configurations">Build Configurations</a></li>
  <li><a href="#tips-and-tricks" id="markdown-toc-tips-and-tricks">Tips and Tricks</a>    <ul>
      <li><a href="#file-saving" id="markdown-toc-file-saving">File Saving</a></li>
      <li><a href="#rerun-the-mx-project-config-tool" id="markdown-toc-rerun-the-mx-project-config-tool">Rerun the MX Project Config Tool</a></li>
    </ul>
  </li>
  <li><a href="#conclusion" id="markdown-toc-conclusion">Conclusion</a></li>
</ul>

<h2 id="introduction">Introduction</h2>

<p>Both IDEs have their own strengths. Rather than having to choose between them,
I would like to use both <strong>side by side</strong>, turning to either one whenever needed.</p>

<p>Strengths of PlatformIO with VSCode:</p>

<ul>
  <li>State-of-the-art editor</li>
  <li>Git integration with CI/CD possibilities</li>
  <li>Github Copilot</li>
  <li>Generic and target unit testing with test coverage</li>
  <li>Single configuration file that provides a good balance between simplicity and flexibility</li>
  <li>Support for third-party debug probes other than ST-Link</li>
</ul>

<p>Strengths of STM32CubeIDE:</p>

<ul>
  <li>Advanced project configurator with code generation</li>
  <li>Extensive debugger support</li>
  <li>Better support for ST-Link debug probes</li>
  <li>Support for SWO tracing</li>
</ul>

<h2 id="existing-conversion-tools">Existing conversion tools</h2>

<p>There are some tools that allow you to create a PlatformIO project from an STM32CubeIDE project,
but it’s a one-way conversion, and you can’t go back to STM32CubeIDE:</p>

<ul>
  <li><a href="https://github.com/jbaumann/pio_and_stm32cubeide" target="_blank">Python script</a> that converts the STM32Cube project to PlatformIO</li>
  <li><a href="https://marutimuthu.medium.com/stm32cubemx-porting-to-platform-ios-stm32cube-framework-9c0719cdeb3e" target="_blank">Tutorial</a> on how to manually convert your STM32Cube project to PlatformIO</li>
  <li><a href="https://marketplace.visualstudio.com/items?itemName=bmd.stm32-for-vscode" target="_blank">VSCode extension</a> to create a project from STM32CubeMX</li>
  <li>ST’s own VSCode <a href="https://marketplace.visualstudio.com/items?itemName=stmicroelectronics.stm32-vscode-extension" target="_blank">extension</a></li>
</ul>

<p>In my experience, it’s often necessary to go back to STM32CubeMX, for example,
to activate an extra peripheral or change existing settings. In such cases,
I would like to simply re-run the MX config tool and continue with the existing project,
rather than having to start from scratch.</p>

<p>I find it useful to be able to use both toolchains side by side,
as this provides some redundancy when something breaks down.
Whenever I encounter something unusual in the build process,
I can always build using the other toolchain to determine if the issue lies in my code or elsewhere.</p>

<h2 id="project-setup">Project setup</h2>

<p>Let’s set up a project that allows us to use <strong>both</strong> toolchains side by side.
To avoid either IDE overwriting the settings of the other, I will keep two versions of the project,
each in its own directory. Each IDE has a default or preferred location for its projects,
so we can use those. Additionally, this approach will allow us to create separate git repositories,
making it appear as a standard project for other users, whether they use PlatformIO or STM32CubeIDE.</p>

<h2 id="synching-files">Synching files</h2>

<p>With two project directories, we need a way to sync our source code between them.
There are various methods to do this, but I prefer using a program called <a href="https://freefilesync.org/" target="_blank">FreeFileSync</a>.
It allows you to set up a sync configuration with folder pairs, filters, and sync strategies.
At any time, you can compare both sides, view the differences, and sync them when you’re satisfied.</p>

<p>FreeFileSync also offers an ‘automatic’ mode, where it detects changes in any of the files to be synced and performs a sync operation immediately.
However, I prefer to manually trigger the ‘compare’ function and only initiate the sync when everything looks good.</p>

<figure class="figure mb-5">
    <a data-bigpicture="{&quot;imgSrc&quot;: &quot;/assets/posts/2025-01-13-platformio-stm32cube-workflow/image-1.png&quot;}" href="#">
      <img class="img-fluid screenshot mw-md-100" src="/assets/posts/2025-01-13-platformio-stm32cube-workflow/image-1.png" />
    </a>
</figure>

<h2 id="file-locations-on-both-environments">File Locations on both environments</h2>

<p>Project folder structures are a bit different on both sides,
so FreeFileSync will need a few folder-pairs to get everything synced.
Here’s how I have set them up:</p>

<ul>
  <li>Application source code:
    <ul>
      <li>STM32Cube path: <code class="language-plaintext highlighter-rouge">…/STM32WorkSpaces/&lt;someWorkspace&gt;/&lt;someProject&gt;/Core/Src</code></li>
      <li>PlatformIO path: <code class="language-plaintext highlighter-rouge">…/PlatformIO/Projects/&lt;someProject&gt;/Src</code></li>
      <li>Filter:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">main.cpp</code></li>
          <li><code class="language-plaintext highlighter-rouge">stm32wlxx_hal_msp.c</code></li>
          <li><code class="language-plaintext highlighter-rouge">stm32wlxx_it.cpp</code></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<div class="alert alert-warning" role="alert">
  Note: <b>.cpp</b> extensions for a C++ project and <b>.c</b> for a C-project
</div>

<ul>
  <li>Application include files
    <ul>
      <li>STM32Cube path: <code class="language-plaintext highlighter-rouge">…/STM32WorkSpaces/&lt;someWorkspace&gt;/&lt;someProject&gt;/Core/Inc</code></li>
      <li>PlatformIO path: <code class="language-plaintext highlighter-rouge">…/PlatformIO/Projects/&lt;someProject&gt;/Include</code></li>
      <li>Filter: none</li>
    </ul>
  </li>
  <li>Libraries
    <ul>
      <li>STM32Cube path : <code class="language-plaintext highlighter-rouge">…/STM32WorkSpaces/&lt;someWorkspace&gt;/&lt;someProject&gt;/lib</code></li>
      <li>PlatformIO path : <code class="language-plaintext highlighter-rouge">…/PlatformIO/Projects/&lt;someProject&gt;/lib</code></li>
      <li>Filter : none</li>
    </ul>
  </li>
  <li>Depending on your setup (hardware platform, external libraries, etc) you may want to add additional folder-pairs</li>
</ul>

<p>The following files and folders do not need synchronization because they are either specific to one IDE or already included in both IDEs:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Drivers</code>: Contains CMSIS and STM32_HAL</li>
  <li><code class="language-plaintext highlighter-rouge">&lt;project&gt;.ioc</code>: Specific to STM32CubeIDE</li>
  <li><code class="language-plaintext highlighter-rouge">platformio.ini</code>: Specific to VSCode/PlatformIO</li>
</ul>

<h2 id="build-configurations">Build Configurations</h2>

<p>STM32CubeIDE requires that all library directories be explicitly included in the build.
To do this, right-click on a folder and select <strong>Add/Remove Include Paths.</strong> In contrast,
VSCode/PlatformIO uses the project directory defaults, so no additional configuration is needed.</p>

<p>You should now be able to build the project, download the binary to the target,
and start debugging on both sides. Whenever you make changes on one side,
you can use FreeFileSync to sync the source code and then switch to the other side.</p>

<h2 id="tips-and-tricks">Tips and Tricks</h2>

<h3 id="file-saving">File Saving</h3>

<p>In VSCode, I have auto-save enabled, which means that changes to the source code are automatically saved to disk.
In STM32CubeIDE, however, you need to click <strong>Save All</strong> to save changes.
If you make changes but haven’t saved them yet, FreeFileSync will not detect or sync these unsaved changes.</p>

<h3 id="rerun-the-mx-project-config-tool">Rerun the MX Project Config Tool</h3>

<p>1) Whenever you want to change the configuration of the STM32Cube project, you can rerun the CubeMX tool.
If you have placed your application code between the following markers:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* USER CODE BEGIN */</span>
<span class="cm">/* USER CODE END */</span>
</code></pre></div></div>

<p>CubeMX will keep that code untouched while making changes to the generated code.</p>

<p>2) I am a C++ user, and in order to invoke the C++ compiler, I renamed <code class="language-plaintext highlighter-rouge">main.c</code> into <code class="language-plaintext highlighter-rouge">main.cpp</code>.
However, I noticed that when modifying the project configuration in the STM32CubeIDE,
it will not modify the <code class="language-plaintext highlighter-rouge">main.cpp</code> file, but rather generate a <strong>new</strong> <code class="language-plaintext highlighter-rouge">main.c</code> file,
even if you ask it to generate a C++ project (the same is true for <code class="language-plaintext highlighter-rouge">stm32wlxx_it.cpp</code>).
It’s a bit inconvenient but the only solution is to rename <code class="language-plaintext highlighter-rouge">main.cpp</code> back to <code class="language-plaintext highlighter-rouge">main.c</code>,
then run the project config then rename back to <code class="language-plaintext highlighter-rouge">main.cpp</code>.</p>

<p>3) Sometimes I like to know what exactly has been modified by CubeMX,
and this is now easy by comparing the files on both IDEs before syncing them.</p>

<h2 id="conclusion">Conclusion</h2>

<p>In summary, managing a project with both PlatformIO in VSCode and STM32CubeIDE requires careful synchronization and configuration.
By maintaining separate project directories for each IDE and using FreeFileSync for synchronization,
you can leverage the strengths of both tools and efficiently handle source code updates across both environments.</p>

<h2 class="no_toc" id="stay-in-touch-with-us">Stay in touch with us</h2>

<p>Stay tuned to this blog or follow us on <a href="https://www.linkedin.com/company/platformio" target="_blank">LinkedIn</a> and Twitter <a href="https://twitter.com/PlatformIO_Org" target="_blank">@PlatformIO_Org</a> to keep up to date with the latest news, articles and tips!</p>]]></content><author><name>Pascal Roobrouck</name></author><category term="blog" /><category term="insights" /><summary type="html"><![CDATA[This article provides insights into setting up a dual-toolchain environment, synchronizing source code between projects, and addressing common challenges such as IDE-specific file handling]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://piolabs.com/assets/posts/2025-01-13-platformio-stm32cube-workflow/main.png" /><media:content medium="image" url="https://piolabs.com/assets/posts/2025-01-13-platformio-stm32cube-workflow/main.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>