Débuter avec l'UART sur Zephyr avec HydraBus

15 janvier 2026 dans Embedded par Gerboise4 minutes

Un guide pratique pour configurer l'UART sur des broches personnalisées avec Zephyr et tester la communication avec HydraBus

Dans cet article, on va configurer la communication UART sur la carte STM32H573I-DK avec Zephyr RTOS, puis la tester avec une HydraBus.

C’est une mise en pratique de la documentation Débuter avec Zephyr. L’objectif : se familiariser avec Zephyr OS et remettre en service ma HydraBus qui dormait depuis trop longtemps.

Matériel nécessaire

  • STM32H573I-DK : carte de développement avec le MCU STM32H573
  • HydraBus : outil de hardware hacking pour l’analyse de protocoles
  • Câbles Dupont : pour connecter les broches UART3 à la HydraBus

Sur la STM32H573I-DK, l’UART3 est disponible sur le connecteur Arduino. Connexions :

  • UART3 TX → HydraBus RX (D1)
  • UART3 RX → HydraBus TX (D0)
  • GND → GND

Vérification de l’USART3 dans le Devicetree

Avant de créer le projet, confirmez que l’USART3 existe dans le devicetree de la carte :

west build -b stm32h573i_dk samples/hello_world
cat build/zephyr/zephyr.dts | grep -A 10 "usart3: arduino_serial"

Sortie :

usart3: arduino_serial: serial@40004800 {
    compatible = "st,stm32-usart",
                 "st,stm32-uart";
    reg = < 0x40004800 0x400 >;
    clocks = < &rcc 0x9c 0x40000 >;
    resets = < &rctl 0xe92 >;
    interrupts = < 0x3c 0x0 >;
    pinctrl-0 = < &usart3_tx_pb10 &usart3_rx_pb11 >;
    pinctrl-names = "default";
    current-speed = < 0x1c200 >;
    status = "okay";
};

L’USART3 est déjà défini avec le statut “okay” et mappé sur PB10 (TX) et PB11 (RX), qui correspondent aux broches D1 et D0 du connecteur Arduino.

Structure du projet Zephyr

Créez un nouveau projet avec cette structure :

uart_demo/
├── CMakeLists.txt
├── prj.conf
├── boards/
│   └── stm32h573i_dk.overlay
└── src/
    └── main.c

CMakeLists.txt

Le fichier CMake intègre votre application dans le système de build Zephyr :

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(uart_demo)
target_sources(app PRIVATE src/main.c)

prj.conf

Le fichier Kconfig active les drivers nécessaires à la communication UART :

CONFIG_SERIAL=y
  • CONFIG_SERIAL=y : active le sous-système série, indispensable pour utiliser l’UART. Sans cette option, le périphérique UART n’est pas disponible.

boards/stm32h573i_dk.overlay

L’overlay devicetree active l’USART3, qui est routé vers les broches du connecteur Arduino (D0/D1) sur la carte STM32H573I-DK :

&usart3 {
    status = "okay";
    current-speed = <115200>;
};

src/main.c

Le code initialise l’USART3 et envoie “ping” toutes les secondes, en utilisant l’API polling de Zephyr :

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/uart.h>

#define PING_INTERVAL_MS 1000

int main(void)
{
	const struct device *uart3 = DEVICE_DT_GET(DT_NODELABEL(usart3));

	if (!device_is_ready(uart3)) {
		printk("USART3 not ready\n");
		return -1;
	}

	printk("Starting ping on USART3\n");

	while (1) {
		const char *msg = "ping\r\n";
		for (int i = 0; msg[i] != '\0'; i++) {
			uart_poll_out(uart3, msg[i]);
		}
		k_msleep(PING_INTERVAL_MS);
	}

	return 0;
}

Ce programme envoie “ping” toutes les secondes sur l’UART3. Détail des fonctions et macros utilisées :

  • DT_NODELABEL(usart3) : retourne l’identifiant du nœud devicetree correspondant au label usart3.
  • DEVICE_DT_GET(node_id) : récupère un pointeur vers le périphérique à la compilation. C’est la méthode recommandée dans Zephyr pour accéder aux périphériques.
  • device_is_ready(dev) : vérifie que le périphérique est bien initialisé. À appeler systématiquement avant toute utilisation.
  • uart_poll_out(dev, c) : envoie un caractère en mode polling (bloquant jusqu’à la fin de la transmission).

Observer la communication avec HydraBus

Une fois le firmware flashé sur la STM32H573I-DK, vous pouvez observer la communication UART avec la HydraBus.

Trouver le port série de la HydraBus

Connectez la HydraBus à votre ordinateur via USB et identifiez le port série :

dmesg | grep tty

Cherchez une ligne mentionnant ttyACM :

cdc_acm 1-1:1.0: ttyACM0: USB ACM device

Se connecter à la HydraBus

Ouvrez un terminal série sur le port identifié :

minicom -D /dev/ttyACM0

Configurer le mode UART

Dans le terminal HydraBus, entrez en mode UART :

> uart
Device: UART1
Speed: 9600 bps
Parity: none
Stop bits: 1
uart1> show pins
TX: PA9
RX: PA10

Réglez le débit à 115200 pour correspondre à la configuration du firmware :

uart1> speed 115200
Speed: 115200 bps

Entrer en mode bridge

Pour surveiller passivement la communication UART, entrez en mode bridge. Cela connecte le RX UART de la HydraBus directement à votre terminal :

uart1> bridge

Les messages “ping” apparaissent maintenant toutes les secondes :

ping
ping
ping
...

Appuyez sur n’importe quelle touche pour quitter le mode bridge.

Conclusion

Zephyr simplifie le développement embarqué, même pour des protocoles bas niveau comme l’UART. Le fait de configurer les paramètres du périphérique dans le devicetree permet de porter le firmware entre différentes plateformes MCU en changeant simplement l’overlay. On écrit la logique applicative une fois, et on l’adapte à un nouveau matériel avec un minimum de modifications.

La HydraBus s’avère être un outil indispensable pour le prototypage et le test. Son shell interactif permet de valider rapidement les communications matérielles sans écrire de code de test dédié. Combinée à pyHydrabus, elle ouvre la voie à des scénarios de test automatisés.

Documentation associée

Références