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.
Sur la STM32H573I-DK, l’UART3 est disponible sur le connecteur Arduino. Connexions :
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.
Créez un nouveau projet avec cette structure :
uart_demo/
├── CMakeLists.txt
├── prj.conf
├── boards/
│ └── stm32h573i_dk.overlay
└── src/
└── main.cLe 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)Le fichier Kconfig active les drivers nécessaires à la communication UART :
CONFIG_SERIAL=yCONFIG_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.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>;
};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).Une fois le firmware flashé sur la STM32H573I-DK, vous pouvez observer la communication UART avec la HydraBus.
Connectez la HydraBus à votre ordinateur via USB et identifiez le port série :
dmesg | grep ttyCherchez une ligne mentionnant ttyACM :
cdc_acm 1-1:1.0: ttyACM0: USB ACM deviceOuvrez un terminal série sur le port identifié :
minicom -D /dev/ttyACM0Dans le terminal HydraBus, entrez en mode UART :
> uart
Device: UART1
Speed: 9600 bps
Parity: none
Stop bits: 1
uart1> show pins
TX: PA9
RX: PA10Réglez le débit à 115200 pour correspondre à la configuration du firmware :
uart1> speed 115200
Speed: 115200 bpsPour surveiller passivement la communication UART, entrez en mode bridge. Cela connecte le RX UART de la HydraBus directement à votre terminal :
uart1> bridgeLes messages “ping” apparaissent maintenant toutes les secondes :
ping
ping
ping
...Appuyez sur n’importe quelle touche pour quitter le mode bridge.
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.