TP complet Vitis : piloter les LED par UART
Créer une plateforme, un domaine standalone et une application Cortex-A53 pour commander les quatre LED de la ZCU104 depuis le terminal série.
Ce TP relie le terminal UART aux quatre LED utilisateur de la ZCU104. Vous construisez une application standalone, la chargez par JTAG et vérifiez deux modes d'affichage.
+ et - déplacent le centre d'un motif à luminosité variable. 0 à 3 sélectionnent le mode fixe et inversent le bit correspondant de son image mémorisée.
Préparer le matériel et le XSA
Le parcours utilise Vitis 2022.2 et psu_cortexa53_0. Les menus correspondent à cette version ; les versions récentes peuvent organiser différemment plateformes et applications.
Construisez d'abord le système décrit dans le cours Vivado : PS ZCU104, UART PS, AXI GPIO de quatre sorties reliées aux LED, horloge, reset et contraintes de carte. Exportez votre matériel avec bitstream sous le nom fpt_zcu104_base.xsa. Ce nom est celui choisi pour le TP ; il ne désigne pas une archive livrée automatiquement avec le cours.
| Élément | Valeur utilisée dans ce TP |
|---|---|
| Carte | ZCU104 |
| Connexion | USB JTAG et USB UART |
| Mode de boot | JTAG |
| Position de SW6 | ON, ON, ON, ON |
| Processeur | psu_cortexa53_0 |
| Système | standalone |
| Description matérielle | fpt_zcu104_base.xsa |
| Débit série | 115200 bauds |
| GPIO des LED | XPAR_FPT_LED_BANK_DEVICE_ID |
| Adresse observée dans le BSP fourni | 0xA0010000 |
La base 0xA0010000 est un choix de ce design. Assignez-la dans l'Address Editor si vous reprenez ce plan ; le programme utilise le symbole BSP, pas une adresse codée en dur. Vérifiez le routage des quatre bits vers les LED.
Créer la plateforme
Lancez Vitis et choisissez un workspace vide :
C:\zynq-workspaces\workspace_zynq_led
Dans Create New, choisissez Platform Project, nommez-le zynq_led_platform puis sélectionnez Create a new platform from hardware (XSA). Importez votre export et renseignez :
| Champ | Valeur |
|---|---|
| Operating system | standalone |
| Processor | psu_cortexa53_0 |
| Boot components | Création du FSBL pour le processeur cible |
Après Finish, vérifiez la présence du domaine standalone sur Cortex-A53 numéro 0. S'il manque, relisez le composant ciblé et le XSA.
Créer l'application
Dans Application Project, choisissez cette plateforme :
| Champ | Valeur |
|---|---|
| Application project name | zynq_led_app |
| System project | Create New |
| System project name | zynq_led_system |
| Processor | psu_cortexa53_0 |
| Domain | Domaine standalone de la plateforme |
| Template | Empty Application (C) |
L'application doit être liée au BSP du domaine. Ouvrez xparameters.h et recherchez l'instance GPIO. Pour le plan retenu, les définitions ressemblent à :
#define XPAR_FPT_LED_BANK_BASEADDR 0xA0010000U
#define XPAR_FPT_LED_BANK_HIGHADDR 0xA001FFFFU
#define XPAR_FPT_LED_BANK_DEVICE_ID 1UL'identifiant peut changer après modification matérielle ; utilisez toujours le symbole généré. Vérifiez STDIN_BASEADDRESS, ici 0xFF000000 pour l'UART PS retenu. Le débit configuré doit correspondre au terminal UART.
Ajouter le programme C
Créez src/main.c dans zynq_led_app. Cette version vérifie l'initialisation GPIO et lit l'UART sans bloquer le rafraîchissement :
#include "platform.h"
#include "xgpio.h"
#include "xparameters.h"
#include "xstatus.h"
#include "xuartps_hw.h"
#include "xil_printf.h"
#define LED_CHANNEL 1U
#define LED_COUNT 4U
#define PWM_STEPS 32U
typedef enum {
DISPLAY_HOLD,
DISPLAY_FADE
} DisplayMode;
static XGpio user_leds;
static const u32 brightness_masks[LED_COUNT] = {
0xFFFFFFFFU,
0x55555555U,
0x11111111U,
0x01010101U
};
static
init_platform() appelle la préparation définie dans platform.c ; elle ne remplace pas initialize_led_output(). Le canal GPIO est configuré en sortie avec des bits de direction à zéro.
cleanup_platform() sert au chemin d'erreur. La boucle principale étant infinie, un nettoyage placé après elle ne serait pas exécuté.
DISPLAY_FADE utilise 32 phases PWM logicielles. Les quatre masques donnent des rapports d'activité de 100 %, 50 %, 25 % et 12,5 %, selon la distance au centre. DISPLAY_HOLD conserve une image binaire distincte, initialement éteinte ; les chiffres en inversent les bits. Revenir au fade puis au mode fixe retrouve cette image mémorisée.
Construire puis préparer la carte
Enregistrez et lancez Build Project en configuration Debug :
text data bss dec hex filename
... ... ... ... ... zynq_led_app.elf
Build FinishedUn symbole GPIO absent demande de vérifier le nom de l'instance, le XSA et la régénération du BSP. Pour une erreur UART, contrôlez xuartps_hw.h et STDIN_BASEADDRESS. Relancez explicitement le build après correction.
Carte éteinte, connectez USB JTAG et UART. Placez SW6 sur ON, ON, ON, ON pour JTAG, puis alimentez. Repérez le port série du PS parmi les ports proposés. Le guide ZCU104 UG1267 confirme les modes de boot et les connexions.
Charger et ouvrir la console
Dans Run As > Run Configurations, créez une configuration Single Application Debug. Dans Target Setup, vérifiez initialisation PS, bitstream et Program FPGA ou Program Device, puis lancez Run pour charger l'ELF.
Ouvrez Vitis Serial Terminal depuis Window > Show View > Xilinx. Créez la connexion au bon port avec 115200 bauds, 8 bits, sans parité, un bit de stop et sans contrôle de flux. Les paramètres PS doivent être identiques.
Zynq LED console ready
Use +, -, or a digit from 0 to 3Vérifier les commandes
| Commande | Résultat attendu |
|---|---|
+ | Le centre du motif se déplace vers la LED suivante |
- | Le centre du motif se déplace vers la LED précédente |
0 | La LED 0 change d'état |
1 | La LED 1 change d'état |
2 | La LED 2 change d'état |
3 | La LED 3 change d'état |
x | Le terminal affiche Unsupported command |
Le centre reste borné à 0..3 : un déplacement supplémentaire à une extrémité ne le fait pas reboucler. Les chiffres modifient l'image fixe mémorisée ; ils ne figent pas un instant du PWM.
Console vide : vérifiez port, débit, mode JTAG et chargement. Console active mais LED éteintes : vérifiez symbole GPIO, bitstream, canal, adresse et contraintes. Un ordre de LED inattendu demande de comparer bits logiques et brochage physique.
La boucle short_pause dépend du processeur et de l'optimisation. Ajuster sa borne change la vitesse PWM, sans fournir une base de temps précise. Les impressions UART peuvent aussi perturber cette vitesse ; pour un affichage stable, utilisez un timer ou une PWM matérielle.
Prolonger le TP
Remplacez la temporisation par un timer, ajoutez une commande c d'extinction et ? pour afficher le mode. Mesurez le rafraîchissement à l'ILA, puis séparez console, sortie LED et main en fichiers distincts en conservant le comportement.
Tester mes connaissances - Quiz du chapitre