<?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>Periféricos - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/categorias/microcontroladores/stm32/perifericos/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 10 Dec 2025 16:46:34 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>Periféricos - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Usando o Sensor Interno de Temperatura do STM32F411</title>
		<link>https://mcu.tec.br/microcontroladores/stm32/usando-o-sensor-interno-de-temperatura-do-stm32f411/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usando-o-sensor-interno-de-temperatura-do-stm32f411</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 10 Dec 2025 16:46:30 +0000</pubDate>
				<category><![CDATA[Periféricos]]></category>
		<category><![CDATA[STM32]]></category>
		<category><![CDATA[ADC interno]]></category>
		<category><![CDATA[ADC1_IN16]]></category>
		<category><![CDATA[CubeMX]]></category>
		<category><![CDATA[HAL]]></category>
		<category><![CDATA[leitura de temperatura]]></category>
		<category><![CDATA[MCU.TEC.BR]]></category>
		<category><![CDATA[sensor interno de temperatura]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[STM32F411]]></category>
		<category><![CDATA[telemetria térmica]]></category>
		<category><![CDATA[temperatura interna MCU]]></category>
		<category><![CDATA[tutorial STM32]]></category>
		<category><![CDATA[UART]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=996</guid>

					<description><![CDATA[<p>Este artigo ensina passo a passo como ler a temperatura interna do microcontrolador STM32F411 utilizando o ADC e o sensor térmico embutido, configurados através do STM32CubeMX. Você aprenderá como habilitar o canal interno ADC1_IN16, ajustar corretamente o tempo de amostragem, aplicar as fórmulas oficiais da ST para converter o valor bruto do ADC em graus Celsius e enviar o resultado pela UART para monitoramento em terminal serial. O conteúdo é ideal para estudantes, profissionais e entusiastas de sistemas embarcados que desejam implementar telemetria térmica ou compreender melhor o funcionamento interno do STM32F4. O tutorial é claro, didático e totalmente aplicado.</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/stm32/usando-o-sensor-interno-de-temperatura-do-stm32f411/">Usando o Sensor Interno de Temperatura do STM32F411</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h3 class="wp-block-heading"><strong>Introdução ao Sensor Interno de Temperatura</strong></h3>



<p class="wp-block-paragraph">Os microcontroladores da família <strong>STM32F4</strong>, incluindo o <strong>STM32F411</strong>, possuem um sensor interno de temperatura capaz de medir a temperatura do chip (junction temperature). Esse recurso é extremamente útil em sistemas embarcados que exigem monitoramento térmico, proteção contra sobreaquecimento, calibração térmica de ADC ou simplesmente coleta de telemetria para diagnóstico.</p>



<p class="wp-block-paragraph">É importante destacar que este sensor não é pensado como um termômetro ambiental de alta precisão. Ele mede a temperatura interna do silício e sua calibração depende de constantes fornecidas pela ST no banco de dados do próprio microcontrolador. Ainda assim, quando configurado corretamente, oferece leituras estáveis e suficientemente precisas para aplicações de controle interno.</p>



<p class="wp-block-paragraph">Neste artigo, vamos desenvolver um projeto completo para <strong>ler a temperatura interna do STM32F411</strong>, usando o <strong>STM32CubeMX</strong> para gerar a configuração base, o <strong>HAL ADC</strong> para realizar a aquisição e, por fim, exibiremos a temperatura em <strong>graus Celsius</strong> através da <strong>porta serial (UART)</strong> padrão.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading"><strong>Configurando o ADC e o Sensor de Temperatura no STM32CubeMX</strong></h1>



<p class="wp-block-paragraph">A configuração do sensor interno de temperatura no <strong>STM32F411</strong> começa pela ativação correta do <strong>ADC1</strong>, que é o periférico responsável por ler o canal dedicado ao sensor térmico. O CubeMX torna esse processo mais intuitivo ao apresentar as opções de forma gráfica, porém alguns detalhes técnicos são essenciais para garantir uma leitura precisa.</p>



<p class="wp-block-paragraph">O sensor de temperatura do STM32 está ligado ao canal <strong>ADC1_IN16</strong> (temperature sensor chanel), um canal especial que não se conecta a nenhum pino físico do microcontrolador. Para habilitá-lo, abra o CubeMX, crie um novo projeto selecionando a placa ou o microcontrolador STM32F411, e navegue até a aba de configuração dos ADCs. É necessário habilitar o ADC1 e marcar o canal interno correspondente ao sensor térmico. Além disso, como esse canal depende da estabilidade de referência interna, é imprescindível ativar o <strong>Temperature Sensor</strong> dentro das opções internas do ADC.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="793" height="697" src="https://mcu.tec.br/wp-content/uploads/2025/12/image-27.png" alt="" class="wp-image-997" srcset="https://mcu.tec.br/wp-content/uploads/2025/12/image-27.png 793w, https://mcu.tec.br/wp-content/uploads/2025/12/image-27-300x264.png 300w, https://mcu.tec.br/wp-content/uploads/2025/12/image-27-768x675.png 768w" sizes="(max-width: 793px) 100vw, 793px" /></figure>



<p class="wp-block-paragraph">Ainda no CubeMX, habiliter o <strong>continuous conversion mode</strong>, caso você deseje atualização contínua de temperatura, ou manter o modo simples de conversão por software, ideal para monitoramento periódico.</p>


<div class="wp-block-image">
<figure class="alignright size-full is-resized"><img decoding="async" width="525" height="241" src="https://mcu.tec.br/wp-content/uploads/2025/12/image-28.png" alt="" class="wp-image-998" style="width:427px;height:auto" srcset="https://mcu.tec.br/wp-content/uploads/2025/12/image-28.png 525w, https://mcu.tec.br/wp-content/uploads/2025/12/image-28-300x138.png 300w" sizes="(max-width: 525px) 100vw, 525px" /></figure>
</div>


<p class="wp-block-paragraph">Depois da configuração do ADC, configure uma <strong>UART</strong> (geralmente USART2) para permitir o envio das leituras para o computador. Defina velocidade, pinos e parâmetros tradicionais de comunicação. Por fim, gere o código automaticamente via CubeMX. O projeto estará pronto para receber a lógica de cálculo da temperatura e impressão via UART. Veja como fazer no artigo: <a href="https://mcu.tec.br/microcontroladores/stm32/como-ler-e-escrever-dados-pela-uart-no-stm32f411re-guia-completo-com-stm32cubemx/" title="Como Ler e Escrever Dados pela UART no STM32F411RE: Guia Completo com STM32CubeMX">Como Ler e Escrever Dados pela UART no STM32F411RE: Guia Completo com STM32CubeMX</a> </p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading"><strong>Seção 3 — Cálculo da Temperatura em Graus Celsius e Código em C (HAL)</strong></h1>



<p class="wp-block-paragraph">Com o projeto gerado pelo CubeMX, o próximo passo é transformar o valor bruto do ADC em uma leitura de temperatura em graus Celsius. O STM32F411 fornece constantes de calibração na memória do sistema que permitem calcular a temperatura interna com boa precisão. A fórmula geral utilizada pela ST é:</p>



<p class="wp-block-paragraph">\[<br>T(°C) = \left(\frac{V_{\text{sense}} &#8211; V_{25}}{\text{Avg_Slope}}\right) + 25<br>\]



<p class="wp-block-paragraph">Onde:</p>



<ul class="wp-block-list">
<li><strong>Vsense</strong> é a tensão lida no canal do sensor de temperatura.</li>



<li><strong>V25</strong> é o valor de Vsense quando o chip está a 25°C (valor fornecido pela ST, geralmente 0,76V).</li>



<li><strong>Avg_Slope</strong> é a inclinação média da curva do sensor (típico 2,5 mV/°C).</li>
</ul>



<p class="wp-block-paragraph">Como o ADC trabalha por amostragem digital, calcula-se Vsense usando:</p>



<p class="wp-block-paragraph">\[<br>V_{\text{sense}} = \frac{\text{ADC_Value} \times V_{\text{ref}}}{4095}<br>\]



<p class="wp-block-paragraph">Em que:</p>



<ul class="wp-block-list">
<li><strong>ADC_Value</strong> é o valor lido do ADC.</li>



<li><strong>Vref</strong> é a tensão de referência do ADC, tipicamente 3,3V.</li>



<li><strong>4095</strong> corresponde à resolução de 12 bits do ADC.</li>
</ul>



<p class="wp-block-paragraph">Após esse cálculo, basta aplicar a fórmula principal para obter a temperatura real. No firmware, essa operação deve ocorrer sempre após uma conversão válida do ADC.</p>



<p class="wp-block-paragraph">A seguir apresento um exemplo completo em C usando HAL, incluindo a aquisição do ADC e a impressão da temperatura via UART:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;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>#include "main.h"
#include &lt;stdio.h>

extern ADC_HandleTypeDef hadc1;
extern UART_HandleTypeDef huart2;

float read_internal_temperature(void) {
    uint32_t raw = 0;
    float Vsense, temperature;

    // Inicia a conversão ADC
    HAL_ADC_Start(&amp;hadc1);
    HAL_ADC_PollForConversion(&amp;hadc1, HAL_MAX_DELAY);
    raw = HAL_ADC_GetValue(&amp;hadc1);

    // Converte leitura para tensão
    Vsense = (raw * 3.3f) / 4095.0f;

    // Aplica fórmula da ST
    const float V25 = 0.76f;
    const float Avg_Slope = 0.0025f; // 2.5 mV/°C

    temperature = ((Vsense - V25) / Avg_Slope) + 25.0f;

    return temperature;
}

void print_temperature(void) {
    char buffer&#91;64&#93;;
    float temp = read_internal_temperature();

    snprintf(buffer, sizeof(buffer), "Temperatura Interna: %.2f C\r\n", temp);
    HAL_UART_Transmit(&amp;huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}
</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="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">main.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdio</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">extern</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ADC_HandleTypeDef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hadc1</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">extern</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">UART_HandleTypeDef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">huart2</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">read_internal_temperature</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">raw</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Vsense</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temperature</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Inicia a conversão ADC</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">HAL_ADC_Start</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">hadc1</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">HAL_ADC_PollForConversion</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">hadc1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HAL_MAX_DELAY</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">raw</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">HAL_ADC_GetValue</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">hadc1</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Converte leitura para tensão</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">Vsense</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">raw</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> 3</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">3</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> 4095</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Aplica fórmula da ST</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> V25 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">76</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> Avg_Slope </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0025</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// 2.5 mV/°C</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">temperature</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> ((</span><span style="color: #D8DEE9">Vsense</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">V25</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Avg_Slope</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> 25</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temperature</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">print_temperature</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buffer</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">64</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">read_internal_temperature</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">snprintf</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">buffer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">buffer</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperatura Interna: %.2f C</span><span style="color: #EBCB8B">\r\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temp</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">HAL_UART_Transmit</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">huart2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">uint8_t</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">buffer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">strlen</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">buffer</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HAL_MAX_DELAY</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Com essa função, basta chamá-la dentro do <code>while(1)</code> de sua aplicação:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;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>while (1) {
    print_temperature();
    HAL_Delay(1000); // 1 segundo entre leituras
}
</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="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">print_temperature</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">HAL_Delay</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">1000</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// 1 segundo entre leituras</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse código fornece a temperatura interna do microcontrolador e a envia pela UART configurada no CubeMX, permitindo visualização direta no terminal serial do computador.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading"><strong>Exibindo a Temperatura na Porta Serial e Testando o Sistema</strong></h1>



<p class="wp-block-paragraph">Com o ADC e a UART configurados no CubeMX e o código de leitura implementado, o próximo passo é garantir que a <strong>temperatura interna</strong> seja exibida corretamente na <strong>saída serial padrão</strong> (por exemplo, <code>USART2</code>, ligada ao conversor USB–Serial da sua placa de desenvolvimento).</p>



<p class="wp-block-paragraph">No CubeMX, normalmente a UART usada como “console” é a <strong>USART2</strong>, configurada como <strong>Asynchronous</strong>, com parâmetros típicos: <strong>115200 bps</strong>, 8 bits de dados, 1 stop bit, sem paridade e sem controle de fluxo. Esses ajustes devem ser reproduzidos no software terminal do PC (PuTTY, minicom, screen, TeraTerm etc.). Certifique-se também de selecionar a <strong>porta COM</strong> correta (no Linux, algo como <code>/dev/ttyUSB0</code> ou <code>/dev/ttyACM0</code>).</p>



<p class="wp-block-paragraph">No firmware, ao chamar periodicamente a função <code>print_temperature()</code> dentro do laço principal, a cada segundo (ou intervalo definido por você) será enviada uma linha de texto pelo UART com a leitura atual. Ao abrir o terminal no computador, você deverá ver algo como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" 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;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;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>Temperatura Interna: 32.45 C
Temperatura Interna: 32.62 C
Temperatura Interna: 32.80 C
...
</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="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Temperatura</span><span style="color: #D8DEE9FF"> Interna</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">32.45</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">C</span></span>
<span class="line"><span style="color: #D8DEE9">Temperatura</span><span style="color: #D8DEE9FF"> Interna</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">32.62</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">C</span></span>
<span class="line"><span style="color: #D8DEE9">Temperatura</span><span style="color: #D8DEE9FF"> Interna</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">32.80</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">C</span></span>
<span class="line"><span style="color: #81A1C1">...</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">É normal que a temperatura interna seja superior à temperatura ambiente, pois o próprio núcleo do microcontrolador se aquece com a execução do código. Para testar o comportamento, você pode tocar o dedo sobre o encapsulamento do microcontrolador ou usar uma fonte de calor moderada (como a aproximação da mão ou um leve fluxo de ar quente) e observar a variação gradual dos valores.</p>



<p class="wp-block-paragraph">Caso não apareça nada no terminal, verifique:</p>



<ul class="wp-block-list">
<li>Se a <code>HAL_UART_Transmit</code> está usando o mesmo <code>UART_HandleTypeDef</code> configurado no CubeMX.</li>



<li>Se o <code>SystemClock_Config()</code> está correto (clock interferindo no baud rate).</li>



<li>Se o cabo USB está funcionando e a porta serial foi reconhecida pelo sistema operacional.</li>



<li>Se a função de leitura do ADC está sendo chamada corretamente e o projeto não está preso em interrupções ou em <code>Error_Handler()</code>.</li>
</ul>



<p class="wp-block-paragraph">Uma vez validada a comunicação, você passa a ter uma <strong>telemetria térmica básica</strong> do STM32F411, que pode ser integrada a outras rotinas, logs ou mecanismos de proteção térmica.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading"><strong>Seção 5 — Boas Práticas, Conclusão e Materiais de SEO</strong></h1>



<p class="wp-block-paragraph">O sensor interno de temperatura do STM32F411 é uma ferramenta valiosa para monitoramento térmico de sistemas embarcados. Apesar de não substituir sensores externos de alta precisão, oferece uma forma simples e eficiente de acompanhar variações internas, auxiliar em algoritmos de proteção, calibração térmica ou levantamento de diagnóstico. Uma boa prática importante é sempre considerar que a leitura térmica interna sofre influências da carga de processamento, clock, periféricos ativos e dissipação geral do encapsulamento. Por isso, quando o objetivo for avaliação absoluta de temperatura, recomenda-se aplicar curvas de calibração próprias ou ajustes empíricos baseados em testes de bancada.</p>



<p class="wp-block-paragraph">Outro ponto relevante é a escolha de tempos adequados de amostragem no ADC. O sensor térmico da ST exige tempos de conversão maiores do que canais analógicos comuns devido à natureza interna do sinal. Utilizar tempos muito curtos pode introduzir ruído ou leituras inconsistentes. Além disso, lembre-se de que o cálculo da temperatura depende de valores típicos fornecidos no datasheet. Alguns microcontroladores possuem valores de calibração únicos gravados em memória, o que pode melhorar ainda mais a precisão se utilizados corretamente.</p>



<p class="wp-block-paragraph">O envio da leitura pela UART, como apresentado no artigo, permite integrar o microcontrolador a sistemas de log, análise ou monitoramento remoto. Isso é particularmente útil em laboratórios, projetos educacionais e sistemas mais complexos, como servidores embarcados, drones, sensores industriais e robôs autônomos. Ao dominar essa técnica, você abre caminho para implementar lógica adaptativa baseada em temperatura — como redução de clock, acionamento de ventilação, alarmes e muito mais.</p>



<p class="wp-block-paragraph">Com essas práticas, o desenvolvedor ganha autonomia e visão clara do comportamento térmico interno do STM32F411. Esse conhecimento fortalece a segurança e a confiabilidade dos sistemas embarcados, alinhando-se aos padrões profissionais do mercado e às necessidades de projetos robustos.</p><p>The post <a href="https://mcu.tec.br/microcontroladores/stm32/usando-o-sensor-interno-de-temperatura-do-stm32f411/">Usando o Sensor Interno de Temperatura do STM32F411</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">996</post-id>	</item>
	</channel>
</rss>
