<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Firmware Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/tag/firmware/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Thu, 23 Jul 2026 15:35:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>Firmware Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Nucleo UART Tutorial</title>
		<link>https://static.dmcinfo.com/blog/24705/nucleo-uart-tutorial/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Mon, 13 Feb 2017 13:06:32 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Firmware]]></category>
		<category><![CDATA[STM32]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/24705/nucleo-uart-tutorial-2/</guid>

					<description><![CDATA[<p>Introduction This tutorial covers the creation of a simple embedded project from the ground up that allows an ST Nucleo development board to talk to your PC using UART serial communication. It is used at DMC to introduce new engineers or engineers who primarily work in other service areas to embedded project work and covers [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/24705/nucleo-uart-tutorial/">Nucleo UART Tutorial</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="h-introduction" class="wp-block-heading"><br>
Introduction</h2>



<p class="wp-block-paragraph">This tutorial covers the creation of a simple embedded project from the ground up that allows an ST Nucleo development board to talk to your PC using UART serial communication. It is used at DMC to introduce new engineers or engineers who primarily work in other service areas to embedded project work and covers a range of topics, skills, and tools commonly used in <a href="/services/embedded-development-and-embedded-programming">DMC Embedded projects</a> including:</p>



<ul class="wp-block-list">
<li>An Eclipse-based IDE (TrueSTUDIO)</li>



<li>Wiring hardware</li>



<li>Configuring MCU peripherals (UART in particular)</li>



<li>Reading schematics and documentation</li>



<li>CubeMX software</li>



<li>A serial communication viewer (RealTerm)</li>
</ul>



<h2 id="h-hardware" class="wp-block-heading">Hardware</h2>



<p class="wp-block-paragraph">The following hardware is required:</p>



<ul class="wp-block-list">
<li>USB to TTL UART Converter</li>



<li>(3) Female to Female Jumper Wires</li>



<li>STM32 Nucleo Development Board*</li>



<li>USB Mini B Cable</li>
</ul>



<p class="wp-block-paragraph"><br>
<em>USB to TTL UART converter</em><br>
&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Female-to-Female-Jumper-Wires-1.jpg" alt="Photo of Female to Female Jumper Wires"/></figure>



<p class="wp-block-paragraph"><em>Female to Female Jumper Wires</em></p>



<p class="wp-block-paragraph"><em><br>
STM32 Nucleo Development Board* and USB Mini B Cable</em></p>



<p class="wp-block-paragraph">*Note the board type! You might have an -F103RB, or an -F303RE, or something else! If your development board is not labeled, the chip name is engraved on the chip in the center.</p>



<h2 id="h-software" class="wp-block-heading">Software</h2>



<p class="wp-block-paragraph">Install the following software:</p>



<ul class="wp-block-list">
<li><a href="http://www.st.com/en/development-tools/stm32cubemx.html?icmp=stm32cubemx_pron_pr-stm32cubef2_apr2014&amp;sc=stm32cube-pr2" target="_blank">CubeMX</a></li>



<li><a href="http://atollic.com/resources/downloads/" target="_blank">TrueSTUDIO</a> (choose the free, stable release)</li>



<li><a href="https://sourceforge.net/projects/realterm/" target="_blank">Realterm</a></li>
</ul>



<h2 id="h-documentation" class="wp-block-heading">Documentation</h2>



<p class="wp-block-paragraph">Download the following documentation:</p>



<ul class="wp-block-list">
<li><a href="http://www.st.com/content/ccc/resource/technical/document/user_manual/a6/79/73/ae/6e/1c/44/14/DM00122016.pdf/files/DM00122016.pdf/jcr:content/translations/en.DM00122016.pdf" target="_blank">HAL layer API Documentation</a></li>



<li><a href="http://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf" target="_blank">Nucleo Board Pinout</a></li>
</ul>



<h2 id="h-template-project" class="wp-block-heading">Template Project</h2>



<ol class="wp-block-list">
<li>To generate the template project, open CubeMX and click <strong>New Project</strong>.<br>
 <br>
 In the Board Selector tab, look for the Nucleo board with the Vendor, Type of Board, and MCU Series dropdowns.<br>
 &nbsp;</li>



<li>Select <strong>Nucleo64</strong> from the Type of Board dropdown (yes, it’s a 32-bit microcontroller that is named Nucleo64). Open the MCU series dropdown and select <strong>STM32F1 if you have an F103RB</strong>, or select <strong>STM32F3</strong> <strong>if you have the 303RE</strong>.<br>
 &nbsp;</li>



<li>Finally, select the board that pertains to your model from the Boards List, and hit <strong>OK</strong>.<br>
 <br>
 <br>
 <em>New Project Menu</em><br>
 <br>
 You should see a nice graphical interface appear, which we will use to set up our pins.<br>
 &nbsp;
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/New-Project-Menu-Screenshot-1.jpg" alt="Screenshot of the New Project menu in CubeMX"/></figure>
</li>



<li>We are going to use USART1, so click on the <strong>+ </strong>to the left of the name to open it up, and set it to<strong> Asynchronous&nbsp;</strong>Mode.<br>
 <br>
 
 
 
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Asynchronous-Mode-Screenshot-1.jpg" alt="Screenshot of setting the USART1 to Asynchronous Mode"/></figure>



<p class="wp-block-paragraph"><br>
 You’ll see that the graphic of the chip in the center will change&nbsp;and two pins on the right will change color to green (gray means that the pin is not configured to anything). By default, port A pin 10 is RX and port A pin 9 is TX.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Chip-Graphic-Screenshot-1.jpg" alt="Screenshot of graphic of the chip in the center "/></figure>
</li>



<li>Navigate to <strong>Project -&gt; Generate Code</strong>. Give your project a name, pick a Project Location for your project, and select <strong>TrueSTUDIO</strong> from the Toolchain/IDE dropdown menu.<br>
 <br>
 
 
 
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Project-Settings-Menu-Screenshot-1.jpg" alt="Screenshot of naming the project in the Project tab of the Project Settings Menu. "/></figure>



<p class="wp-block-paragraph"><em>Project Settings Menu</em></p>
</li>



<li>In the Code Generator tab, select <strong>Generate peripheral initialization as a pair of ‘.c/.h’ files per IP</strong>.<br>
 <br>
 
 
 
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Project-Settings-Menu-Code-Generator-Screenshot-1.jpg" alt="Screenshot of selecting &quot;Generate peripheral initialization as a pair of ‘.c/.h’ files per IP&quot;"/></figure>



<p class="wp-block-paragraph"><em>Project Settings Menu</em></p>
</li>



<li>Hit <strong>Open Project</strong> at the popup prompt&nbsp;and your project should open up in TrueSTUDIO.<br>
 &nbsp;</li>



<li>You may get a popup explaining you need a firmware package. If so,<strong> </strong>click <strong>Yes</strong> to download it and wait for it to finish.<br>
 <br>
 
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Project-Manager-Settings-Screenshot-1.jpg" alt="Screenshot of firmware package download confirmation."/></figure>
</li>
</ol>



<h2 id="h-writing-the-program" class="wp-block-heading">Writing the Program</h2>



<p class="wp-block-paragraph"><strong>1.</strong> Open the newly generated <strong>TrueSTUDIO project</strong>.<br><br>CubeMX has generated a very simple project with some basic settings for you.</p>



<p class="wp-block-paragraph">. In the<strong> Src</strong> folder, open <strong>gpio.c</strong>.<br><br><strong>2.</strong> You’ll see a configuration for the USER pushbutton pin which is labeled B1 on the development board, but this is NOT port B, pin 1 on the chip. You’ll also see our UART TX and RX pins and LED 2.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();

/* Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(B1_GPIO_Port, &amp;GPIO_InitStruct);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">GPIO_InitTypeDef GPIO_InitStruct;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/* GPIO Ports Clock Enable */</span></span>
<span class="line"><span style="color: #DCDCAA">__HAL_RCC_GPIOC_CLK_ENABLE</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #DCDCAA">__HAL_RCC_GPIOD_CLK_ENABLE</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #DCDCAA">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #DCDCAA">__HAL_RCC_GPIOB_CLK_ENABLE</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/* Configure GPIO pin : B1_Pin */</span></span>
<span class="line"><span style="color: #D4D4D4">GPIO_InitStruct.Pin = B1_Pin;</span></span>
<span class="line"><span style="color: #D4D4D4">GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;</span></span>
<span class="line"><span style="color: #D4D4D4">GPIO_InitStruct.Pull = GPIO_NOPULL;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">HAL_GPIO_Init</span><span style="color: #D4D4D4">(B1_GPIO_Port, &amp;</span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>3.</strong> To view our UART configuration, open the <strong>usart.c</strong> file and look for the <strong>MX_USART1_UART_Init</strong> function.<br><br>Our UART is configured with a baud of 115200, 8 bits per word with 1 stop bit, no parity, and some other features. Remember this for later. We’ll need to configure the same settings on the PC side.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void MX_USART1_UART_Init(void)
{
    huart1.Instance = USART1;

    huart1.Init.BaudRate     = 115200;
    huart1.Init.WordLength   = UART_WORDLENGTH_8B;
    huart1.Init.StopBits     = UART_STOPBITS_1;
    huart1.Init.Parity       = UART_PARITY_NONE;
    huart1.Init.Mode         = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    HAL_UART_Init(&amp;huart1);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">MX_USART1_UART_Init</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">void</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Instance</span><span style="color: #D4D4D4"> = USART1;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">BaudRate</span><span style="color: #D4D4D4">     = </span><span style="color: #B5CEA8">115200</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">WordLength</span><span style="color: #D4D4D4">   = UART_WORDLENGTH_8B;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">StopBits</span><span style="color: #D4D4D4">     = UART_STOPBITS_1;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Parity</span><span style="color: #D4D4D4">       = UART_PARITY_NONE;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Mode</span><span style="color: #D4D4D4">         = UART_MODE_TX_RX;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">HwFlowCtl</span><span style="color: #D4D4D4">    = UART_HWCONTROL_NONE;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">huart1</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Init</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">OverSampling</span><span style="color: #D4D4D4"> = UART_OVERSAMPLING_16;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">HAL_UART_Init</span><span style="color: #D4D4D4">(&amp;huart1);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>4.</strong> Navigate to the<strong> main.c</strong> file and scroll down to the <strong>main()</strong> function.<br><br>CubeMX automatically wrote in our initializations for us and an infinite while loop that currently does nothing.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>int main(void)
{
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration */

    /* Reset of all peripherals,
       initialize Flash interface and SysTick */
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    /* USER CODE BEGIN 2 */

    /* USER CODE END 2 */

    /* Infinite loop */
    while (1)
    {
        /* USER CODE BEGIN 3 */

        /* USER CODE END 3 */
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">void</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #6A9955">    /* USER CODE BEGIN 1 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* USER CODE END 1 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* MCU Configuration */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* Reset of all peripherals,</span></span>
<span class="line"><span style="color: #6A9955">       initialize Flash interface and SysTick */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">HAL_Init</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* Configure the system clock */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SystemClock_Config</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* Initialize all configured peripherals */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">MX_GPIO_Init</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">MX_USART1_UART_Init</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* USER CODE BEGIN 2 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* USER CODE END 2 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* Infinite loop */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #6A9955">        /* USER CODE BEGIN 3 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">        /* USER CODE END 3 */</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>5.</strong> Open the <strong>STM32F3 HAL datasheet</strong> that you downloaded and find the <strong>GPIO Generic Driver</strong> chapter. Scroll down to the list of functions, and find the description for <strong>HAL_GPIO_ReadPin </strong>which takes the port and pin of interest and returns its state.<br> <br> <img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/HAL_GPIO_ReadPin-description-1.jpg" alt=""><br>  </p>



<p class="wp-block-paragraph"><strong>6.</strong> Locate the <strong>UART Generic</strong> chapter and find the function for transmitting for UART in blocking mode, <strong>HAL_UART_Transmit</strong>. The function takes the address of a UART handle, a pointer to the data buffer, the size of the data buffer, and a timeout.<br> <br> CubeMX named the handle husart and filled out its attributes in usart.c.<br> <br> <img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/HAL_UART_Transmit_IT-1.jpg" alt=""><br>  </p>



<p class="wp-block-paragraph"><strong>7.</strong> Pass this handle in to <strong>HAL_UART_Transmit</strong>. For the timeout, you can pick any value you want. 10,000 ticks should be sufficient.<br>  </p>



<p class="wp-block-paragraph"><strong>8.</strong> Try to use these two functions to write code in your main function so that whenever the pushbutton is pressed, a “hello world” message will be transmitted through UART. When you think you’ve got working code, go on to the next step to compile it.<br> <br> Below is an example implementation, but feel free to use your own. HAL_UART_Transmit requires a UART handle that is private to usart.c, so I wrote a public function, UART_TransmitHelloWorld(), that uses HAL_UART_Transmit to send the message over.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>int main(void)
{
    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();
    MX_USART1_UART_Init();

    while (1)
    {
        if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin))
        {
            UART_TransmitHelloWorld();
        }
    }
}

void UART_TransmitHelloWorld(void)
{
    char message[] = "hello world\r\n";

    HAL_UART_Transmit(
        &amp;huart1,
        (uint8_t *)message,
        strlen(message),
        1000
    );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">void</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">HAL_Init</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SystemClock_Config</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">MX_GPIO_Init</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">MX_USART1_UART_Init</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #DCDCAA">HAL_GPIO_ReadPin</span><span style="color: #D4D4D4">(B1_GPIO_Port, B1_Pin))</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">UART_TransmitHelloWorld</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UART_TransmitHelloWorld</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">void</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">char</span><span style="color: #D4D4D4"> message</span><span style="color: #569CD6">[]</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;hello world</span><span style="color: #D7BA7D">\r\n</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">HAL_UART_Transmit</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        &amp;huart1,</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #569CD6">uint8_t</span><span style="color: #D4D4D4"> *)message,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">strlen</span><span style="color: #D4D4D4">(message),</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">1000</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<ol class="wp-block-list"></ol>



<h2 id="h-compile-your-code" class="wp-block-heading">Compile Your Code</h2>



<p class="wp-block-paragraph">Although what we want to do seems simple and should only take a few lines of code, you’ll need to understand how pointers, addressing, and file scope works in the C language to implement this.</p>



<p class="wp-block-paragraph"><strong>1.</strong> Click on the<strong> Build Button</strong> to build your project.<br> <img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Compile-Code-Hit-Build-1.jpg" alt=""><br> <br> If you are able to build successfully, you’ll have no errors on your console at the bottom.<br> <img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Build-Code-Error-Output-1.jpg" alt=""></p>



<p class="wp-block-paragraph"><strong>2.</strong> Locate any errors in the <strong>Problems</strong> tab. You’ll be able to double click on the error to get to the line the compiler is complaining about (this works on most, but not all, error messages). Go to the next step once you have a successfully compiling project.</p>



<ol class="wp-block-list"></ol>



<h2 id="h-wire-things-up-plug-things-in" class="wp-block-heading">Wire Things Up, Plug Things In</h2>



<p class="wp-block-paragraph">Now we need to wire up the Nucleo Board to the PC.</p>



<p class="wp-block-paragraph">UART communication requires a TX pin, an RX pin, and a ground pin,&nbsp;but where are these pins on the Nucleo board?</p>



<p class="wp-block-paragraph">If you recall, with CubeMX, we had set port A pin 10 as RX and port A pin 9 as TX. You can also find these settings in the <strong>HAL_UART_MspInit()</strong> function in the automatically generated <strong>usart.c</strong> file to verify that this is indeed the case.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>GPIO_InitTypeDef GPIO_InitStruct;

if (huart->Instance == USART1)
{
    /* USER CODE BEGIN USART1_MspInit 0 */

    /* USER CODE END USART1_MspInit 0 */

    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    /**
     * USART1 GPIO Configuration
     * PA9  ------> USART1_TX
     * PA10 ------> USART1_RX
     */

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &amp;GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &amp;GPIO_InitStruct);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">GPIO_InitTypeDef GPIO_InitStruct;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (huart-&gt;Instance == USART1)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #6A9955">    /* USER CODE BEGIN USART1_MspInit 0 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* USER CODE END USART1_MspInit 0 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /* Peripheral clock enable */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">__HAL_RCC_USART1_CLK_ENABLE</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /**</span></span>
<span class="line"><span style="color: #6A9955">     * USART1 GPIO Configuration</span></span>
<span class="line"><span style="color: #6A9955">     * PA9  ------&gt; USART1_TX</span></span>
<span class="line"><span style="color: #6A9955">     * PA10 ------&gt; USART1_RX</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Pin</span><span style="color: #D4D4D4"> = GPIO_PIN_9;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Mode</span><span style="color: #D4D4D4"> = GPIO_MODE_AF_PP;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Speed</span><span style="color: #D4D4D4"> = GPIO_SPEED_FREQ_HIGH;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">HAL_GPIO_Init</span><span style="color: #D4D4D4">(GPIOA, &amp;GPIO_InitStruct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Pin</span><span style="color: #D4D4D4"> = GPIO_PIN_10;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Mode</span><span style="color: #D4D4D4"> = GPIO_MODE_INPUT;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GPIO_InitStruct</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Pull</span><span style="color: #D4D4D4"> = GPIO_NOPULL;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">HAL_GPIO_Init</span><span style="color: #D4D4D4">(GPIOA, &amp;GPIO_InitStruct);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">So, where are these pins on the board?</p>



<ol class="wp-block-list">
<li>Open up the <strong>Nucleo pinout document</strong> that you downloaded earlier. Scroll down to the pinout of your Nucleo board to see how the header pins connect to the microcontroller.<br>
 <br>
 &nbsp;<img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-13-Nucleo-Pinout-1.jpg"><br>
 &nbsp;</li>



<li>Connect <strong>TX</strong> on the<strong> Nucleo (A9)</strong> to <strong>RX</strong> on the <strong>USB-to-UART converter</strong>.
 
 
<p class="wp-block-paragraph"><p style="text-align: center;">Nucleo TX -&gt; USB-to-UART RX</p></p>
</li>



<li>Connect <strong>RX </strong>on the <strong>Nucleo (A10)</strong> to <strong>TX</strong> on the <strong>USB-to-serial converter</strong>. &nbsp;
 
 
<p class="wp-block-paragraph"><p style="text-align: center;">Nucleo RX -&gt; USB-to-UART TX</p></p>
</li>



<li>Also, connect the <strong>ground pin</strong> on the <strong>USB-to-UART converter</strong> to any <strong>ground pin</strong> on the <strong>Nucleo board</strong>.<br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/USB-to-TTL-UART-connected-to-Nucleo-1.jpg"><br>
 The transmitter (TX) of the Nucleo goes into the receiver (RX) of the USB-to-UART dongle. The same reasoning applies to the RX of the Nucleo.<br>
 &nbsp;</li>



<li>Finally, plug in the Nucleo board to your PC’s USB, and plug in the USB-to-UART converter to your PC as well.<br>
 <br>
 It should look something like this:<br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Nucleo-Board-to-PC-USB-and-USB-to-UART-converter-to-PC_1-1.jpg"></li>
</ol>



<h2 id="h-realterm" class="wp-block-heading">Realterm</h2>



<ol class="wp-block-list">
<li>Open up <strong>Device Manager</strong> and look in the <strong>Ports</strong> tab. Find the <strong>COM </strong>port that your USB-to-UART converter is connected to. Mine is COM3. Yours may be different. Remember this <strong>COM </strong>port.<br>
 &nbsp;<br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Device-Manager-2.jpg">
 
 
<p class="wp-block-paragraph">Realterm is a program that will allow your computer to send and receive serial communication through your PC’s ports.</p>
</li>



<li>Open up <strong>Realterm</strong>. In the Port tab, select <strong>115200 baud</strong>.
 
 
<p class="wp-block-paragraph">Recall that we configured the Nucleo board’s baud to be 115200, and that the baud must match between the Nucleo board and the PC.</p>
</li>



<li>Select the <strong>COM </strong>port your USB-to-UART converter is connected to in the Port dropdown.<br>
 &nbsp;<br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/COM-Port-selection-1.jpg"><br>
 <br>
 Notice that most of the other settings we would need to configure are, by default, matching the Nucleo’s UART configuration (8 bit of data, 1 stop bit, no parity), so we shouldn’t need to adjust those.
 
 
<p class="wp-block-paragraph">Now let’s upload our program to the Nucleo board.</p>
</li>



<li>Go back to the <strong>TrueSTUDIO project</strong> and click the <strong>Debug </strong>button at the top.<br>
 <br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/TrueSTUDIO-Debug-1.jpg">
 
 
<p class="wp-block-paragraph">TrueSTUDIO will go into the Debug mode and should automatically create a breakpoint at the top of main().</p>
</li>



<li>Click the <strong>Resume </strong>button to proceed past the breakpoint.<br>
 <br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/TrueSTUDIO-Breakpoint-1.jpg"><br>
 &nbsp;</li>



<li>Go back to your <strong>Realterm </strong>window.<br>
 <br>
 Depending on how you wrote your code, a number of things may be happening. Nothing might be happening, or a bunch of messages might be spamming the window.<br>
 &nbsp;</li>



<li>Hit the blue <strong>USER </strong>pushbutton on the Nucleo and see if anything changes.<br>
 <br>
 &nbsp;<img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/RealTerm-Hello-Worlds-1.jpg"><br>
 &nbsp;</li>



<li>Go back to the project and change the code in the<strong> main()</strong> function so that the hello world message only pops up once if you push the blue USER pushbutton.<br>
 <br>
 &nbsp;<img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/RealTerm-One-Hello-World-1.jpg"><br>
 <br>
 The terminate button in the Debug window will allow you to exit Debug mode so that you can recompile your code.<br>
 <br>
 <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/TrueSTUDIO-Stop-Debug-1.jpg"></li>
</ol>



<p class="wp-block-paragraph">If you’ve got that working, then congrats! You’ve successfully completed your own small embedded systems project from the ground up.</p>



<p class="wp-block-paragraph">Check out this&nbsp;<a href="https://static.dmcinfo.com/latest-thinking/blog/id/9536/categoryid/5/nucleo-uart-tutorial-mbed-style">Nucleo UART Tutorial mbed-Style</a>&nbsp;for a hands-on introduction to embed that makes use of this same project.</p>



<p class="wp-block-paragraph">Learn more about&nbsp;<a href="/services/embedded-development-and-embedded-programming">DMC&#8217;s Custom Software and Hardware Services</a>&nbsp;or <a href="https://static.dmcinfo.com/contact">Contact Us</a> to start building a solution.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/24705/nucleo-uart-tutorial/">Nucleo UART Tutorial</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
