<?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>WebServer STM32 - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/webserver-stm32/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Fri, 03 Oct 2025 21:08:26 +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>WebServer STM32 - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Construindo um Servidor Web Embarcado com STM32F429ZI e Azure RTOS NetX Duo</title>
		<link>https://mcu.tec.br/microcontroladores/construindo-um-servidor-web-embarcado-com-stm32f429zi-e-azure-rtos-netx-duo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=construindo-um-servidor-web-embarcado-com-stm32f429zi-e-azure-rtos-netx-duo</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 03 Oct 2025 21:08:21 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[STM32]]></category>
		<category><![CDATA[Azure RTOS]]></category>
		<category><![CDATA[DHCP STM32]]></category>
		<category><![CDATA[IoT com STM32]]></category>
		<category><![CDATA[LED controle web]]></category>
		<category><![CDATA[memória flash STM32]]></category>
		<category><![CDATA[microcontrolador ARM]]></category>
		<category><![CDATA[NetX Duo]]></category>
		<category><![CDATA[programação embarcada]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[servidor HTTP embarcado]]></category>
		<category><![CDATA[servidor web microcontrolador]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[STM32CubeProgrammer]]></category>
		<category><![CDATA[STM32F429ZI]]></category>
		<category><![CDATA[ThreadX]]></category>
		<category><![CDATA[WebServer STM32]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=844</guid>

					<description><![CDATA[<p>Aprenda passo a passo como transformar a placa STM32F429ZI em um servidor web embarcado utilizando o Azure RTOS NetX Duo. Este guia didático explica desde os conceitos básicos, como o funcionamento de um RTOS e de um servidor HTTP, até os detalhes práticos de gravação de arquivos na memória flash com o STM32CubeProgrammer. Ideal para iniciantes que desejam compreender como sistemas embarcados podem hospedar páginas HTML e interagir com navegadores, tornando-se soluções completas em IoT e automação.</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/construindo-um-servidor-web-embarcado-com-stm32f429zi-e-azure-rtos-netx-duo/">Construindo um Servidor Web Embarcado com STM32F429ZI e Azure RTOS NetX Duo</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h1 class="wp-block-heading">Introdução ao Projeto Nx_WebServer no STM32F429ZI</h1>



<p class="wp-block-paragraph">A aplicação <strong>Nx_WebServer</strong> é um exemplo prático que demonstra como construir um servidor web embarcado utilizando o <strong>Azure RTOS NetX Duo</strong> em conjunto com a placa <strong>STM32F429ZI-Nucleo</strong>. Esse exemplo é particularmente útil porque reúne, em um único projeto, conceitos fundamentais de sistemas embarcados modernos: uso de um <strong>RTOS</strong> (Sistema Operacional de Tempo Real), pilha de rede embarcada, sistema de arquivos em memória flash e a disponibilização de serviços através de um <strong>WebServer HTTP</strong>.</p>



<p class="wp-block-paragraph">Para um iniciante, pode ser difícil compreender como tudo isso se conecta, por isso este artigo tem como objetivo explicar, de forma <strong>didática e detalhada</strong>, cada uma das etapas e conceitos envolvidos. Além de mostrar como carregar e executar o exemplo, também apresentaremos os fundamentos do que é o <strong>NetX Duo</strong>, o papel de um <strong>servidor HTTP</strong> e por que ferramentas como o <strong>STM32CubeProgrammer</strong> devem ser usadas corretamente — inclusive pela linha de comando — para garantir 100% de sucesso na gravação do conteúdo.</p>



<p class="wp-block-paragraph">No decorrer do artigo, você aprenderá:</p>



<ul class="wp-block-list">
<li>O que é o <strong>Azure RTOS NetX Duo</strong> e por que ele é utilizado neste projeto.</li>



<li>Como funciona um <strong>servidor HTTP</strong> embarcado e qual a diferença entre páginas estáticas e dinâmicas.</li>



<li>O papel das <strong>threads</strong> criadas no exemplo (AppMainThread e AppWebServerThread).</li>



<li>A importância da correta preparação da memória flash, incluindo a gravação do arquivo de conteúdo web.</li>



<li>Como interpretar os comportamentos esperados e os sinais de erro durante a execução.</li>



<li>Dicas para iniciantes compreenderem como o RTOS gerencia recursos como memória, temporização e comunicação de rede.</li>
</ul>



<p class="wp-block-paragraph">A partir dessa visão, mesmo um leitor leigo poderá entender como uma simples placa de desenvolvimento pode se transformar em um <strong>servidor web funcional</strong>, capaz de exibir páginas HTML diretamente de sua memória interna e até mesmo interagir com o usuário, por exemplo, acionando o LED verde da placa através de um navegador.</p>



<h1 class="wp-block-heading">O que é o Azure RTOS NetX Duo e sua Função no Projeto</h1>



<p class="wp-block-paragraph">Para compreender o funcionamento do <strong>Nx_WebServer</strong>, é essencial primeiro entender o que é o <strong>Azure RTOS NetX Duo</strong>. Trata-se de uma <strong>pilha de protocolos de rede TCP/IP</strong> projetada especificamente para sistemas embarcados. Diferente de sistemas operacionais completos, como Linux ou Windows, em que a pilha de rede já faz parte do núcleo, no mundo dos microcontroladores é necessário integrar uma biblioteca que permita ao dispositivo se comunicar em redes Ethernet ou Wi-Fi.</p>



<p class="wp-block-paragraph">O NetX Duo é chamado de “Duo” porque implementa tanto o <strong>IPv4</strong> quanto o <strong>IPv6</strong>, garantindo compatibilidade com redes atuais e futuras. Ele é otimizado para rodar em dispositivos com recursos limitados, como microcontroladores STM32, oferecendo:</p>



<ul class="wp-block-list">
<li><strong>Baixo consumo de memória e processamento</strong></li>



<li><strong>Confiabilidade em tempo real</strong>, essencial em aplicações críticas</li>



<li><strong>Escalabilidade</strong>, permitindo adicionar ou remover recursos de acordo com a necessidade</li>
</ul>



<p class="wp-block-paragraph">Dentro do projeto Nx_WebServer, o NetX Duo é responsável por todo o gerenciamento da comunicação em rede. É ele quem:</p>



<ul class="wp-block-list">
<li>Cria e administra a instância de IP (<code>NX_IP</code>) usada pela placa.</li>



<li>Configura protocolos de suporte, como <strong>ARP</strong> (Address Resolution Protocol), <strong>ICMP</strong> (Internet Control Message Protocol), <strong>UDP</strong> e <strong>TCP</strong>.</li>



<li>Controla o <strong>cliente DHCP</strong>, que negocia automaticamente um endereço IP com o roteador ou servidor da rede local.</li>
</ul>



<p class="wp-block-paragraph">Em outras palavras, sem o NetX Duo, a placa STM32 não conseguiria sequer obter um endereço IP para se comunicar na rede. Ele funciona como a “cola” que conecta o hardware da placa ao mundo da Internet.</p>



<p class="wp-block-paragraph">Um aspecto importante é que o NetX Duo foi projetado para rodar em conjunto com o <strong>ThreadX</strong>, o RTOS (Real-Time Operating System) do qual falaremos mais adiante. Essa integração é fundamental porque permite que tarefas de rede sejam executadas de forma <strong>concorrente</strong>, sem travar outras funções do sistema. Por exemplo, enquanto o servidor HTTP responde a uma requisição de página, outras threads podem continuar monitorando sensores, gravando em memória ou atualizando o display.</p>



<p class="wp-block-paragraph">Em resumo:<br>O NetX Duo é o <strong>coração da conectividade de rede</strong> neste exemplo. Ele transforma o STM32 em um dispositivo capaz de se comportar como qualquer outro nó de rede, participando de trocas de pacotes, comunicação cliente-servidor e, especificamente, como <strong>servidor HTTP embarcado</strong>.</p>



<h1 class="wp-block-heading">O que é um Servidor HTTP Embarcado e Como Funciona no STM32</h1>



<p class="wp-block-paragraph">Um <strong>servidor HTTP</strong> é um programa capaz de responder a requisições feitas por um navegador (como Google Chrome, Firefox ou Edge). Quando digitamos um endereço como <code>http://192.168.0.10/index.html</code>, o navegador envia uma solicitação (request) ao servidor, que responde com o arquivo correspondente (response), normalmente uma página em formato <strong>HTML</strong>.</p>



<p class="wp-block-paragraph">No mundo dos computadores convencionais, esses servidores costumam ser softwares robustos como <strong>Apache</strong>, <strong>Nginx</strong> ou <strong>IIS</strong>, rodando em máquinas com sistemas operacionais completos. Porém, em sistemas embarcados como o <strong>STM32F429ZI</strong>, a situação é diferente: o servidor precisa ser <strong>leve, rápido e econômico em memória</strong>, ao mesmo tempo em que oferece funcionalidades básicas para interação com o usuário.</p>



<p class="wp-block-paragraph">O <strong>Nx_WebServer</strong> mostra exatamente isso: como transformar a placa STM32 em um servidor web simples, mas funcional. No exemplo:</p>



<ul class="wp-block-list">
<li>Os arquivos HTML, imagens ou scripts são gravados diretamente na <strong>memória flash</strong> do microcontrolador.</li>



<li>O servidor HTTP, criado com a biblioteca do <strong>NetX Duo</strong>, responde a requisições de navegadores conectados à mesma rede.</li>



<li>Páginas como <strong>index.html</strong> e <strong>dashboard.html</strong> podem ser acessadas digitando o IP da placa no navegador.</li>
</ul>



<h3 class="wp-block-heading">Páginas Estáticas e Dinâmicas</h3>



<p class="wp-block-paragraph">Um ponto importante é a diferença entre <strong>páginas estáticas</strong> e <strong>páginas dinâmicas</strong>:</p>



<ul class="wp-block-list">
<li><strong>Estáticas:</strong> São arquivos prontos, como <code>index.html</code>, que apenas exibem informações fixas (texto, imagens).</li>



<li><strong>Dinâmicas:</strong> São geradas ou modificadas em tempo real pelo servidor. No exemplo do Nx_WebServer, a página <strong>dashboard.html</strong> é dinâmica, porque permite <strong>interagir com a placa</strong> – o usuário pode, por exemplo, clicar em um botão para acender ou apagar o LED verde da Nucleo, e a ação é refletida imediatamente no hardware.</li>
</ul>



<h3 class="wp-block-heading">Threads no Servidor</h3>



<p class="wp-block-paragraph">O servidor HTTP embarcado funciona através de <strong>threads</strong> criadas pelo RTOS ThreadX:</p>



<ul class="wp-block-list">
<li>A <strong>AppMainThread</strong> inicia a rede, aguarda a obtenção de um endereço IP via DHCP e, quando tudo está pronto, libera a execução do servidor.</li>



<li>A <strong>AppWebServerThread</strong> é responsável por abrir o sistema de arquivos na flash e iniciar o servidor HTTP.</li>
</ul>



<p class="wp-block-paragraph">Essa separação é essencial porque permite que o sistema seja <strong>multitarefa</strong>, garantindo que cada função (rede, servidor, controle de LED, etc.) tenha o seu espaço de execução ordenado pelo RTOS.</p>



<h3 class="wp-block-heading">Benefício para o Usuário</h3>



<p class="wp-block-paragraph">Na prática, o que o usuário vê é simples:</p>



<ol class="wp-block-list">
<li>Conecta a placa à rede.</li>



<li>Descobre o endereço IP no terminal serial.</li>



<li>Digita esse IP no navegador.</li>



<li>Visualiza páginas hospedadas dentro do próprio microcontrolador.</li>
</ol>



<p class="wp-block-paragraph">Isso transforma o <strong>STM32F429ZI</strong> em um <strong>servidor web portátil e independente</strong>, sem precisar de um computador externo para entregar as páginas.</p>



<h1 class="wp-block-heading">O Papel das Threads AppMainThread e AppWebServerThread</h1>



<p class="wp-block-paragraph">O funcionamento do <strong>Nx_WebServer</strong> depende diretamente da coordenação entre duas threads principais criadas pelo <strong>ThreadX</strong>, o sistema operacional de tempo real que organiza a execução das tarefas. Essas threads são como “linhas de trabalho” independentes que, juntas, mantêm a aplicação em funcionamento estável e responsivo.</p>



<h3 class="wp-block-heading">AppMainThread – Inicialização e Rede</h3>



<p class="wp-block-paragraph">A primeira thread criada é a <strong>AppMainThread</strong>, responsável por preparar o ambiente de rede e dar início ao funcionamento do sistema. Ela é configurada para iniciar automaticamente assim que o kernel do ThreadX é carregado.</p>



<p class="wp-block-paragraph">Dentro dessa thread, as principais ações realizadas são:</p>



<ol class="wp-block-list">
<li><strong>Inicialização do cliente DHCP</strong> – permite que a placa obtenha automaticamente um endereço IP da rede local, evitando a necessidade de configurar manualmente.</li>



<li><strong>Aguardando resolução de IP</strong> – a thread permanece em espera até que o endereço IP seja corretamente atribuído. Esse passo é essencial, pois sem IP não há comunicação de rede possível.</li>



<li><strong>Ativação da AppWebServerThread</strong> – quando a rede está pronta, a AppMainThread “acorda” a thread do servidor web, garantindo que o HTTP Server só comece a funcionar quando a conectividade estiver estabelecida.</li>
</ol>



<p class="wp-block-paragraph">Em resumo, a <strong>AppMainThread</strong> é responsável pela fase de <strong>configuração e preparação da rede</strong>, funcionando como um “porteiro” que só libera o servidor quando tudo está em ordem.</p>



<h3 class="wp-block-heading">AppWebServerThread – O Servidor HTTP</h3>



<p class="wp-block-paragraph">A segunda thread, chamada <strong>AppWebServerThread</strong>, é criada mas não inicia de imediato. Ela depende da autorização da AppMainThread para começar, respeitando a ordem correta de inicialização.</p>



<p class="wp-block-paragraph">As funções principais dessa thread são:</p>



<ol class="wp-block-list">
<li><strong>Abrir o driver da memória flash</strong> – é nessa memória que os arquivos HTML e outros conteúdos foram gravados previamente, como veremos mais adiante.</li>



<li><strong>Iniciar o servidor HTTP</strong> – cria a instância do servidor e começa a escutar por requisições vindas dos navegadores.</li>



<li><strong>Processar requisições</strong> – cada vez que um cliente acessa uma página (<code>index.html</code>, <code>dashboard.html</code>, etc.), a requisição é passada para o <strong>webserver_request_notify_callback</strong>, que decide como responder.
<ul class="wp-block-list">
<li>Se o arquivo for estático (como <code>index.html</code>), o conteúdo é apenas enviado de volta.</li>



<li>Se for dinâmico (como no caso do controle do LED), a resposta é adaptada ao comando solicitado.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Assim, a <strong>AppWebServerThread</strong> é o coração da aplicação, transformando a placa em um <strong>servidor funcional</strong> que pode ser acessado de qualquer navegador da rede local.</p>



<h3 class="wp-block-heading">Coordenação entre as Threads</h3>



<p class="wp-block-paragraph">A separação em duas threads garante que a aplicação seja <strong>robusta e modular</strong>:</p>



<ul class="wp-block-list">
<li>Uma thread cuida da <strong>rede e inicialização</strong>.</li>



<li>A outra cuida do <strong>servidor HTTP</strong>.</li>
</ul>



<p class="wp-block-paragraph">Essa divisão evita erros comuns em sistemas embarcados, como tentar iniciar um serviço de rede antes de ter um endereço IP válido. Além disso, permite que cada parte do sistema seja ajustada ou expandida no futuro sem comprometer o funcionamento das demais.</p>



<h1 class="wp-block-heading">Preparando a Memória Flash com o STM32CubeProgrammer</h1>



<p class="wp-block-paragraph">Um dos pontos mais importantes para o funcionamento do <strong>Nx_WebServer</strong> é garantir que os arquivos web (páginas HTML, imagens e scripts) estejam gravados corretamente na memória flash do <strong>STM32F429ZI</strong>. Sem esse passo, mesmo que o servidor HTTP seja iniciado com sucesso, não haverá conteúdo para enviar ao navegador.</p>



<h3 class="wp-block-heading">O papel do STM32CubeProgrammer</h3>



<p class="wp-block-paragraph">O <strong>STM32CubeProgrammer</strong> é a ferramenta oficial da STMicroelectronics para gravação de firmwares, configuração de memória e depuração básica em microcontroladores STM32. Embora ele possua uma interface gráfica, no caso do <strong>Nx_WebServer</strong> a recomendação é utilizar a <strong>linha de comando</strong>.</p>



<p class="wp-block-paragraph">Isso porque a execução via <strong>CLI (Command Line Interface)</strong> garante:</p>



<ol class="wp-block-list">
<li><strong>Precisão absoluta no endereço de gravação</strong> – evita erros ao selecionar o ponto inicial da memória flash.</li>



<li><strong>Automação</strong> – o mesmo comando pode ser repetido sempre que necessário, sem depender de cliques manuais.</li>



<li><strong>Compatibilidade com tutoriais e exemplos</strong> – a própria ST fornece os comandos prontos para uso, facilitando a reprodução dos resultados.</li>
</ol>



<h3 class="wp-block-heading">O comando essencial</h3>



<p class="wp-block-paragraph">Para gravar o conteúdo web na memória flash, deve-se executar no terminal:</p>



<pre class="wp-block-code"><code>&lt;INSTALL_PATH&gt;STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe -c port=swd -w &lt;INSTALL_PATH&gt;web_content\web_demo.bin 0x08100000 -v
</code></pre>



<p class="wp-block-paragraph">Explicando cada parte:</p>



<ul class="wp-block-list">
<li><strong><code>&lt;INSTALL_PATH></code></strong> → caminho onde o STM32CubeProgrammer foi instalado.</li>



<li><strong><code>STM32_Programmer_CLI.exe</code></strong> → executável da versão de linha de comando.</li>



<li><strong><code>-c port=swd</code></strong> → indica que a conexão com a placa será feita via <strong>SWD (Serial Wire Debug)</strong>, o protocolo padrão para gravação em STM32.</li>



<li><strong><code>-w &lt;arquivo> &lt;endereço></code></strong> → grava o arquivo binário especificado no endereço de memória desejado.
<ul class="wp-block-list">
<li><code>&lt;arquivo></code> → no caso, <code>web_demo.bin</code>, que contém as páginas web.</li>



<li><code>&lt;endereço></code> → <code>0x08100000</code>, local da flash reservado para armazenar os arquivos web.</li>
</ul>
</li>



<li><strong><code>-v</code></strong> → ativa a verificação após a gravação, garantindo que o conteúdo foi escrito corretamente.</li>
</ul>



<h3 class="wp-block-heading">Importância de seguir o processo corretamente</h3>



<p class="wp-block-paragraph">Muitos erros relatados por iniciantes acontecem porque:</p>



<ul class="wp-block-list">
<li>O arquivo binário não foi gravado no endereço correto.</li>



<li>A gravação foi feita apenas pelo IDE, sem incluir os arquivos web.</li>



<li>Não houve a etapa de verificação após a gravação.</li>
</ul>



<p class="wp-block-paragraph">Por isso, insistimos: <strong>use sempre o STM32CubeProgrammer pela linha de comando</strong>, como mostrado acima, para garantir <strong>100% de sucesso</strong>.</p>



<p class="wp-block-paragraph">Ao final dessa etapa, a memória flash da placa conterá não apenas o firmware principal, mas também o sistema de arquivos com as páginas HTML. Isso permite que, ao digitar o IP da placa no navegador, o conteúdo seja carregado corretamente.</p>



<h1 class="wp-block-heading">Comportamentos Esperados e Sinais de Erro</h1>



<p class="wp-block-paragraph">Depois de gravar corretamente o firmware e o conteúdo web na memória flash do <strong>STM32F429ZI</strong>, é importante saber o que observar para confirmar que tudo está funcionando como deveria. O projeto <strong>Nx_WebServer</strong> foi projetado para dar ao usuário <strong>indicações claras de sucesso ou falha</strong>, tanto pelo terminal serial quanto pelos LEDs da placa.</p>



<h3 class="wp-block-heading">Comportamento de Sucesso</h3>



<p class="wp-block-paragraph">Quando o servidor HTTP é iniciado com sucesso, os seguintes sinais aparecem:</p>



<ol class="wp-block-list">
<li><strong>Endereço IP exibido no terminal</strong>
<ul class="wp-block-list">
<li>Assim que o DHCP atribui um IP válido à placa, o endereço é mostrado na saída serial.</li>



<li>Exemplo: <code>Board IP address: 192.168.0.105</code></li>



<li>Esse é o endereço que você deve digitar no navegador.</li>
</ul>
</li>



<li><strong>Páginas acessíveis via navegador</strong>
<ul class="wp-block-list">
<li>Ao abrir o navegador e digitar <code>http://&lt;IP>/index.html</code>, a <strong>página inicial</strong> deve ser carregada.</li>



<li>Ao acessar <code>http://&lt;IP>/dashboard.html</code>, você verá a <strong>página de controle</strong>.</li>
</ul>
</li>



<li><strong>Interação com a placa</strong>
<ul class="wp-block-list">
<li>Na página <strong>dashboard</strong>, é possível interagir com a placa, por exemplo, ligando ou desligando o LED verde.</li>



<li>Também são exibidas informações do <strong>ThreadX</strong> e do <strong>NetX Duo</strong>, demonstrando a integração entre o RTOS e a pilha de rede.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Esses três sinais confirmam que todo o sistema – firmware, pilha de rede, servidor HTTP e arquivos web – está funcionando corretamente.</p>



<h3 class="wp-block-heading">Comportamento de Erro</h3>



<p class="wp-block-paragraph">Caso algo não tenha sido configurado ou gravado corretamente, os sintomas mais comuns são:</p>



<ol class="wp-block-list">
<li><strong>LED verde apagado</strong>
<ul class="wp-block-list">
<li>Se o servidor HTTP não foi inicializado corretamente, o LED verde da placa permanece desligado.</li>



<li>Esse é o sinal mais direto de falha na execução.</li>
</ul>
</li>



<li><strong>Páginas não carregam no navegador</strong>
<ul class="wp-block-list">
<li>Se ao digitar o IP no navegador não houver resposta, pode significar:
<ul class="wp-block-list">
<li>O arquivo <code>web_demo.bin</code> não foi gravado no endereço correto (<code>0x08100000</code>).</li>



<li>O servidor HTTP não foi inicializado.</li>



<li>A rede não atribuiu um IP válido à placa (falha do DHCP).</li>
</ul>
</li>
</ul>
</li>



<li><strong>Mensagens de erro no terminal</strong>
<ul class="wp-block-list">
<li>Algumas falhas podem ser identificadas nas mensagens exibidas pela porta serial, como erro ao abrir a flash ou falha na inicialização do servidor.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">A importância dos testes iniciais</h3>



<p class="wp-block-paragraph">Esses sinais de sucesso ou falha servem como guia rápido para depuração. Se algo não estiver funcionando, a primeira verificação deve ser:</p>



<ul class="wp-block-list">
<li>O <strong>firmware</strong> foi carregado corretamente?</li>



<li>O <strong>arquivo web_demo.bin</strong> foi gravado no endereço exato?</li>



<li>A placa obteve um <strong>endereço IP válido</strong> da rede?</li>



<li>O <strong>LED verde</strong> indicou o estado esperado?</li>
</ul>



<p class="wp-block-paragraph">Com essas checagens simples, mesmo um usuário iniciante consegue identificar o que precisa ser corrigido.</p>



<h1 class="wp-block-heading">Ajustes e Dicas de Uso do ThreadX</h1>



<p class="wp-block-paragraph">O <strong>ThreadX</strong> é o sistema operacional de tempo real (RTOS) utilizado no projeto <strong>Nx_WebServer</strong>. Ele é responsável por organizar a execução das threads, gerenciar recursos de memória e garantir que as tarefas mais críticas recebam atenção no momento certo. Para que a aplicação funcione corretamente e seja expansível, é necessário conhecer alguns detalhes importantes sobre seu funcionamento.</p>



<h3 class="wp-block-heading">O Tempo Base do Sistema</h3>



<p class="wp-block-paragraph">O ThreadX utiliza o <strong>SysTick</strong> (um temporizador do processador ARM Cortex-M) como sua referência de tempo. Isso significa que:</p>



<ul class="wp-block-list">
<li>Por padrão, o ThreadX é configurado com <strong>100 ticks por segundo</strong>, ou seja, cada tick equivale a 10 ms.</li>



<li>Esse valor impacta diretamente chamadas de espera (<code>sleep</code>, <code>timeout</code>) dentro do sistema.</li>



<li>Caso o desenvolvedor deseje alterar essa taxa, é necessário modificar o arquivo <code>tx_user.h</code>, ajustando o valor <code>TX_TIMER_TICKS_PER_SECOND</code>.</li>
</ul>



<p class="wp-block-paragraph">É importante manter consistência: ao alterar esse parâmetro, deve-se também atualizar o arquivo de inicialização em assembly (<code>tx_initialize_low_level.s</code>), garantindo que o tempo do kernel e o tempo real estejam alinhados.</p>



<h3 class="wp-block-heading">Cuidados Durante a Inicialização</h3>



<p class="wp-block-paragraph">Durante o processo de inicialização do kernel, o ThreadX <strong>desabilita todas as interrupções</strong> para evitar comportamentos inesperados. Isso significa que chamadas a funções de hardware (como HAL ou BSP) <strong>não devem ser feitas</strong> diretamente dentro da função <code>tx_application_define()</code>.</p>



<p class="wp-block-paragraph">Essa função deve ser utilizada apenas para <strong>criar recursos do ThreadX</strong>, como:</p>



<ul class="wp-block-list">
<li>Threads</li>



<li>Semáforos</li>



<li>Filas de mensagens</li>



<li>Memórias pool</li>
</ul>



<p class="wp-block-paragraph">Qualquer chamada ao hardware deve ser feita dentro das <strong>threads de aplicação</strong>, depois que o sistema já está em execução.</p>



<h3 class="wp-block-heading">Memória Dinâmica e Linker Script</h3>



<p class="wp-block-paragraph">Outro ponto importante é a <strong>memória utilizada pelo ThreadX</strong>. Quando se opta por usar alocação dinâmica, o RTOS precisa receber um ponteiro para a primeira região de memória livre em RAM. Para isso, o arquivo de linkagem deve ser ajustado:</p>



<ul class="wp-block-list">
<li><strong>No STM32CubeIDE</strong>: adicionar uma nova seção no linker script (<code>.ld</code>), como no exemplo:</li>
</ul>



<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>._threadx_heap : 
{
  . = ALIGN(8); 
  __RAM_segment_used_end__ = .; 
  . = . + 64K; 
  . = ALIGN(8); 
} >RAM_D1 AT> RAM_D1</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: #ECEFF4">.</span><span style="color: #D8DEE9">_threadx_heap</span><span style="color: #D8DEE9FF"> : </span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ALIGN</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">__RAM_segment_used_end__</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> 64</span><span style="color: #D8DEE9">K</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ALIGN</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9">RAM_D1</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">AT</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RAM_D1</span></span></code></pre></div>



<p class="wp-block-paragraph">  Nesse caso, foi reservado um heap de <strong>64 KB</strong> para o ThreadX.</p>



<ul class="wp-block-list">
<li>O local dessa seção deve ficar entre <code>.bss</code> e <code>._user_heap_stack</code>, para evitar conflitos de memória.</li>



<li>O arquivo <code>tx_initialize_low_level.s</code> também deve ser modificado para habilitar o uso de memória dinâmica, ativando a flag <code>USE_DYNAMIC_MEMORY_ALLOCATION</code>.</li>
</ul>



<p class="wp-block-paragraph">Essas alterações garantem que o RTOS tenha uma área de memória segura para alocação de objetos e buffers durante a execução da aplicação.</p>



<h3 class="wp-block-heading">Por que isso é importante?</h3>



<p class="wp-block-paragraph">Sem os ajustes corretos, a aplicação pode apresentar falhas sutis, como:</p>



<ul class="wp-block-list">
<li>Travamentos aleatórios</li>



<li>Falta de memória para criar threads adicionais</li>



<li>Erros no uso de timers ou timeouts</li>
</ul>



<p class="wp-block-paragraph">Ao entender como o ThreadX organiza o tempo e a memória, o desenvolvedor ganha maior controle sobre a aplicação e evita problemas difíceis de rastrear.</p>



<h1 class="wp-block-heading">Ambiente de Hardware e Software Necessário</h1>



<p class="wp-block-paragraph">Para executar o projeto <strong>Nx_WebServer</strong> com sucesso, é fundamental preparar tanto o <strong>hardware</strong> quanto o <strong>software</strong> de forma adequada. Essa preparação garante que a aplicação rode sem problemas e que o usuário consiga acompanhar os logs e testar o servidor HTTP de forma prática.</p>



<h3 class="wp-block-heading">Hardware Utilizado</h3>



<p class="wp-block-paragraph">O exemplo foi desenvolvido e validado especificamente para a placa:</p>



<ul class="wp-block-list">
<li><strong>STM32F429ZI-Nucleo</strong> (referência MB1137 B-01).</li>
</ul>



<p class="wp-block-paragraph">Características relevantes dessa placa:</p>



<ul class="wp-block-list">
<li>Microcontrolador <strong>STM32F429ZI</strong> com núcleo ARM Cortex-M4.</li>



<li>Conector Ethernet disponível para integração em rede local.</li>



<li>LEDs e botões de usuário, que podem ser usados para testes interativos (ex.: acender o LED verde via navegador).</li>



<li>Interface <strong>ST-LINK</strong> integrada, que permite gravação e depuração sem a necessidade de ferramentas adicionais.</li>
</ul>



<p class="wp-block-paragraph">Embora o exemplo seja voltado para essa placa, ele pode ser adaptado a outros microcontroladores STM32 compatíveis, desde que possuam recursos de rede e memória flash suficientes.</p>



<h3 class="wp-block-heading">Comunicação Serial</h3>



<p class="wp-block-paragraph">Durante a execução, a placa envia informações pela interface <strong>USART3</strong>, que serve como um terminal de depuração. Para visualizar essas informações, é necessário conectar a placa a um computador via USB e abrir um terminal serial (como PuTTY, Tera Term ou o terminal do STM32CubeIDE).</p>



<p class="wp-block-paragraph">A configuração correta da porta serial é:</p>



<ul class="wp-block-list">
<li><strong>Baud Rate</strong>: 115200</li>



<li><strong>Word Length</strong>: 8 bits</li>



<li><strong>Stop Bit</strong>: 1</li>



<li><strong>Paridade</strong>: Nenhuma (None)</li>



<li><strong>Controle de fluxo</strong>: Nenhum</li>
</ul>



<p class="wp-block-paragraph">Esses parâmetros garantem que as mensagens (como o endereço IP atribuído pelo DHCP) sejam exibidas de forma legível.</p>



<h3 class="wp-block-heading">Software Necessário</h3>



<ol class="wp-block-list">
<li><strong>STM32CubeIDE</strong> ou outra ferramenta de compilação suportada.
<ul class="wp-block-list">
<li>Responsável por compilar e carregar o firmware do projeto.</li>
</ul>
</li>



<li><strong>STM32CubeProgrammer</strong>
<ul class="wp-block-list">
<li>Usado para gravar o arquivo de conteúdo web (<code>web_demo.bin</code>) na memória flash.</li>



<li>Recomenda-se utilizar a versão <strong>CLI (linha de comando)</strong>, como explicado na seção anterior.</li>
</ul>
</li>



<li><strong>Navegador Web</strong> (Chrome, Firefox, Edge ou outro).
<ul class="wp-block-list">
<li>Necessário para acessar as páginas hospedadas pelo microcontrolador.</li>
</ul>
</li>



<li><strong>Cliente de terminal serial</strong>
<ul class="wp-block-list">
<li>Permite monitorar mensagens da aplicação em tempo real.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Ambiente de Rede</h3>



<p class="wp-block-paragraph">A placa precisa estar conectada a uma rede local com acesso a um <strong>servidor DHCP</strong> (geralmente fornecido pelo roteador doméstico ou corporativo). Sem DHCP, será necessário configurar manualmente o endereço IP no código.</p>



<p class="wp-block-paragraph">Com esse ambiente devidamente configurado, o usuário terá todos os recursos para compilar, gravar e executar o projeto, podendo visualizar tanto o funcionamento interno pelo terminal quanto o acesso externo via navegador.</p>



<h1 class="wp-block-heading">Passo a Passo para Colocar a Aplicação em Funcionamento</h1>



<p class="wp-block-paragraph">Agora que já entendemos os conceitos fundamentais, os recursos do RTOS e a configuração de hardware e software, podemos partir para o <strong>guia prático</strong> de execução do projeto <strong>Nx_WebServer</strong>. A seguir está o passo a passo completo para que até um iniciante consiga reproduzir o funcionamento do servidor web embarcado.</p>



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



<h3 class="wp-block-heading">1. Preparar o Projeto</h3>



<p class="wp-block-paragraph">Abra sua IDE favorita (recomendado <strong>STM32CubeIDE</strong>) e carregue o projeto de exemplo do <strong>Nx_WebServer</strong>. Esse projeto já vem configurado para a placa <strong>STM32F429ZI-Nucleo</strong>, facilitando a compilação.</p>



<p class="wp-block-paragraph">Compile o código para gerar o binário do firmware principal.</p>



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



<h3 class="wp-block-heading">2. Gravar o Conteúdo Web na Flash</h3>



<p class="wp-block-paragraph">Além do firmware, é necessário gravar os arquivos web que serão servidos pelo microcontrolador. Esses arquivos estão reunidos em um binário chamado <code>web_demo.bin</code>.</p>



<p class="wp-block-paragraph">Use o <strong>STM32CubeProgrammer (CLI)</strong> e execute o seguinte comando no terminal:</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>&lt;INSTALL_PATH>STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe -c port=swd -w &lt;INSTALL_PATH>web_content\web_demo.bin 0x08100000 -v
</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">&lt;</span><span style="color: #8FBCBB">INSTALL_PATH</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe -c port=swd -w </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">INSTALL_PATH</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">web_content\web_demo.bin 0x08100000 -v</span></span>
<span class="line"></span></code></pre></div>



<ul class="wp-block-list">
<li>Esse comando grava o conteúdo na memória flash a partir do endereço <code>0x08100000</code>.</li>



<li>O parâmetro <code>-v</code> garante a verificação, confirmando que os dados foram gravados corretamente.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Atenção:</strong> Esse passo é obrigatório. Sem os arquivos web na flash, o servidor não terá páginas para enviar ao navegador.</p>
</blockquote>



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



<h3 class="wp-block-heading">3. Carregar o Firmware</h3>



<p class="wp-block-paragraph">Com o conteúdo web gravado, volte para a IDE e carregue o <strong>firmware do projeto Nx_WebServer</strong> na placa STM32F429ZI. Esse firmware contém toda a lógica do RTOS, do NetX Duo e do servidor HTTP.</p>



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



<h3 class="wp-block-heading">4. Conectar à Rede</h3>



<p class="wp-block-paragraph">Ligue a placa à rede local usando o cabo Ethernet. Certifique-se de que o roteador ou switch forneça endereços IP via <strong>DHCP</strong>.</p>



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



<h3 class="wp-block-heading">5. Monitorar a Porta Serial</h3>



<p class="wp-block-paragraph">Abra um terminal serial no computador, configurado da seguinte forma:</p>



<ul class="wp-block-list">
<li>Baud Rate: 115200</li>



<li>8 bits de dados, 1 stop bit, sem paridade, sem controle de fluxo.</li>
</ul>



<p class="wp-block-paragraph">Ao inicializar, a placa exibirá mensagens no terminal, incluindo o <strong>endereço IP atribuído</strong> pelo DHCP.</p>



<p class="wp-block-paragraph">Exemplo:</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>Board IP address: 192.168.0.105
</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">Board</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">IP</span><span style="color: #D8DEE9FF"> address</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">192.168</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0.105</span></span>
<span class="line"></span></code></pre></div>



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



<h3 class="wp-block-heading">6. Acessar pelo Navegador</h3>



<p class="wp-block-paragraph">No computador conectado à mesma rede, abra o navegador e digite o endereço IP informado no terminal:</p>



<ul class="wp-block-list">
<li>Para a página inicial: <code>http://&lt;IP>/index.html</code></li>



<li>Para a página de controle (dashboard): <code>http://&lt;IP>/dashboard.html</code></li>
</ul>



<p class="wp-block-paragraph">Se tudo estiver correto, as páginas serão exibidas.</p>



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



<h3 class="wp-block-heading">7. Interagir com o Sistema</h3>



<p class="wp-block-paragraph">Na página <strong>dashboard</strong>, você poderá interagir diretamente com a placa:</p>



<ul class="wp-block-list">
<li>Alternar o estado do <strong>LED verde</strong>.</li>



<li>Visualizar informações sobre o <strong>ThreadX</strong> e o <strong>NetX Duo</strong> em tempo real.</li>
</ul>



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



<h3 class="wp-block-heading">8. Verificar Sinais de Erro</h3>



<p class="wp-block-paragraph">Caso algo dê errado:</p>



<ul class="wp-block-list">
<li>Se o <strong>LED verde</strong> não acender, significa que o servidor HTTP não foi inicializado.</li>



<li>Se o navegador não carregar a página, confira se o arquivo <code>web_demo.bin</code> foi gravado corretamente no endereço indicado.</li>



<li>Se o terminal não mostrar um IP válido, verifique a conexão de rede e o DHCP.</li>
</ul>



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



<p class="wp-block-paragraph">Com esse passo a passo, a placa STM32F429ZI passa a funcionar como um <strong>servidor web completo</strong>, servindo páginas HTML e permitindo interação via navegador, tudo de forma embarcada.</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/microcontroladores/construindo-um-servidor-web-embarcado-com-stm32f429zi-e-azure-rtos-netx-duo/">Construindo um Servidor Web Embarcado com STM32F429ZI e Azure RTOS NetX Duo</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">844</post-id>	</item>
	</channel>
</rss>
