Partie 2:

Génération de la fréquence de sortie 12.288Mhz sur mco1

Nous vous conseillons de lire la Partie 1 avant d’attaquer cette seconde partie. La partie 1 vous permettra de comprendre la definition des terminologies.

Pourquoi générer un signal d’horloge ?

Pour transmettre les trames audio, le codec nécessite un signal d’horloge pour son fonctionnement.

Dans cet article, nous aborderons le rôle de l’horloge, les différents types d’horloges présents sur la carte STM32MP257F-EV, ainsi que la méthode permettant de générer une fréquence de 12.288 MHz destinée au codec.

.

Définition : Horloge

L’horloge, appelée clock en anglais, est un dispositif électrique permettant de mesurer le temps. Elle est définie par la relation t = 1/f (où t représente le temps et f la fréquence). À partir d’une valeur temporelle, on peut ainsi déterminer la fréquence correspondante.

Dans les systèmes embarqués, il n’existe pas d’appareil dédié à la mesure du temps, mais plutôt des circuits électroniques capables de générer une fréquence. Ces circuits, appelés oscillateurs, produisent un signal électrique périodique. La fréquence de ce signal permet alors de déduire le temps, selon la formule t = 1/f.

L’horloge joue un rôle clé dans la synchronisation de plusieurs périphériques (I2C, SPI, UART, etc.) présents sur la carte, le pilotage des périphériques externes (audio, vidéo) et l’optimisation de la consommation énergétique.

Oscillateurs de la carte STM32MP257F-EV

La carte STM32MP257F-EV dispose de cinq oscillateurs, dont deux externes :

  1. Oscillateurs externes :

    • HSE (High-Speed External) : Plage de fréquences entre 16 et 48 MHz
      Le HSE est un oscillateur externe ajouté au microcontrôleur pour générer des fréquences avec une grande précision, supérieure à celle de l’oscillateur HSI (High-Speed Internal). C’est celui que nous utiliserons dans notre projet.

    • Sur cette carte, l’oscillateur externe utilisé est le NX1612SA, qui génère une fréquence de 40 MHz.

    • LSE pour un cristal de 32.768 kHz (RTC)

      Le LSE (Low-Speed External) est une horloge utilisée principalement pour la gestion des alarmes et du temps réel (RTC – Real-Time Clock). Sur cette carte, un oscillateur externe LSE de 32.768 kHz est employé.

  1. La carte intègre trois oscillateurs internes :

    1. HSI (High-Speed Internal) – ~64 MHz
      Le HSI est un oscillateur interne directement intégré au microcontrôleur. Il est utilisé comme horloge principale en raison de son temps de démarrage rapide, supérieur à celui de l’oscillateur à quartz HSE. Toutefois, même après étalonnage, sa fréquence reste moins précise qu’un oscillateur à quartz externe ou un résonateur céramique.

    2. MSI (Medium-Speed Internal) – ~16 MHz ou 4 MHz

    3. LSI (Low-Speed Internal) – ~32 kHz
      Cet oscillateur est principalement utilisé pour le RTC (Real-Time Clock).

    Le rôle du PLL (Phase-Locked Loop)

    Un outil appelé PLL (Phase-Locked Loop) permet d’augmenter une fréquence d’entrée relativement basse (comme celle des oscillateurs HSE ou HSI) pour générer une fréquence de sortie plus élevée. Cette fréquence peut alors être utilisée pour piloter divers sous-systèmes tels que :

    • Un afficheur

    • Un sous-système USB

    • Un processeur

    • Les horloges des bus AHB et APB

Exemple :

Avec une fréquence d’entrée de 40 MHz, l’utilisation de la PLL3 permet de générer une fréquence de 800 MHz, utilisée pour piloter un GPU (Graphics Processing Unit).

Configuration de la fréquence

Nous utiliserons STM32CubeIDE, un environnement de développement intégré (IDE) conçu pour les produits STM32. Basé sur l’interface Eclipse, il peut être installé via le lien correspondant.

Création du projet

Après avoir ouvert  STM32CubeIDE, nous créons un nouveau projet et nommons le dossier mco (Microcontroller Clock Output).

Nous sélectionnons « Start new STM32 Project », situé dans le premier onglet à gauche.

Sélectionnons « Board Selector », puis entrons la référence de notre carte d’évaluation STM32MP257F-EV1.

cliquons sur la carte qui apparaît et cliquons sur « next »

Attribuons le nom du projet « nodem-mco », puis cliquons sur « Finish » pour accepter les configurations par défaut.

Pour les projets de type « bare metal development », sélectionnons « Empty » (nous y reviendrons pour le développement à partir de zéro).

Ensuite, saisissons le chemin de notre SDK que nous avons installé.

Notre environnement est prêt. Nous allons commencer par configurer notre RCC. Pour cela, cliquez sur RCC et configurez les fréquences d’entrées.

Configuration de RCC

Entrée d’horloge

En déroulant le High-Speed Clock (HSE), nous pouvons choisir parmi trois types de sources utilisées par le HSE pour générer la fréquence.

  1. BYPASS Clock Source
  2. DIGBYPASS Clock Source
  3. Crystal/ceramic Resonator

Consultons la data sheet pour déterminer sur quelle source connecter le HSE de notre carte d’évaluation. La data sheet fournit le schéma suivant :

ChatGPT said:

Les pins OSC_IN et OSC_OUT sont les broches de notre microcontrôleur. La broche OSC_IN du digital ou analog external clock peut être directement connectée à un autre signal d’horloge externe, ou provenir d’un autre microcontrôleur externe, ou encore d’un circuit connecté à cette broche.

Examinons maintenant notre carte d’évaluation pour comprendre comment les pins OSC_IN et OSC_OUT sont connectées. Les deux broches sont reliées via un ‘LSE (32.768 kHz). Ce qui correspond au schéma Crystal/Ceramic ci-dessus.

Nous allons donc configurer le cristal comme source pour notre HSE.

ChatGPT said:

Sortie d’horloge

Deux pins permettent de sortir le signal d’horloge HSE : MCO1 et MCO2.

MCO (Microcontroller Clock Output) est une broche utilisée pour transmettre un signal d’horloge (HSE ou HSI) vers un périphérique externe. Si un périphérique externe nécessite un signal d’horloge pour fonctionner, nous pouvons acheminer HSI ou HSE vers l’une de ces broches dédiées (MCO1 ou MCO2).

Dans notre cas, nous dirigerons le signal d’horloge HSE vers la sortie MCO1.

Si nous regardons dans l’onglet « Clock Configuration », nous constatons que MCO1 n’est pas encore activé.

Nous allons l’activer dans le RCC, accessible via « Pinout & Configuration ». Il suffit de cocher la case Master Clock Output 1.

Vérifions qu’il soit activé dans l’onglet «clock configuration»

Effectivement, il est bien activé. Nous allons utiliser la PLL7 comme source d’entrée pour le flexclkgen et ajuster les valeurs du prescaler afin d’obtenir une fréquence de 12.288 MHz.

Nous obtenons une fréquence de 12.286937 MHz, qui est proche de celle dont nous avons besoin (12.288 MHz). Le calcul de la fréquence avec l’outil de flexclkgen ne permet pas d’atteindre exactement la valeur souhaitée.

Nous allons configurer ces valeurs dans le device tree.

Sur le microcontrôleur STM32MP25x, les horloges (flexgen) sont gérées par la partie sécurisée, appelée OP-TEE.

Nous demandons à devtool de rechercher la recette liée à optee en utilisant la commande suivante :

« devtool search optee ».

Nous allons utiliser la recette  optee-os-stm32mp qu’il vient de trouver car cette recette est faite pour cette carte d’évaluation

On fait un

$ devtool modify optee-os-stm32mp

Nous nous rendons ensuite dans le workspace pour effectuer les modifications des fréquences.

Après cela, nous effectuons le commit, puis mettons à jour notre recette avec la commande :

« devtool update ».

Exécutez la commande suivante :

devtool update-recipe optee-os-stm32mp -a ../layers/meta-nodem/

devtool va automatiquement créer un dossier « recipes-security » contenant la recette de surcharge optee-os-stm32mp_4.0.0.bbappend. Il générera également la recette de surcharge pour optee-os-stm32mp.

Ensuite, compilons la recette avec la commande suivante :

bitbake optee-os-stm32mp pour vérifier s’il y a des erreurs.

La compilation a été réalisée avec succès, et les patches ont été appliqués correctement.

Ajout de MCO dans le device tree

Examinons la datasheet pour déterminer à quel numéro de pin est connecté MCO1. D’après la datasheet, MCO est relié à la broche PF11 (pin F, numéro 11). La PF11 est une broche alternate, ce qui signifie qu’elle peut avoir plusieurs fonctions.

La broche PF11 peut être utilisée pour différentes fonctions, telles que MCO1, SPDIFRX1_IN0, SPI6_RDY, SAI2_SCK_A, MDF1_SDI6, UART8_RX, ou encore TIM2_CH4. Dans notre cas, nous allons l’utiliser pour MCO.

Nous la configurons dans le device tree en tant que MCO. Nous utiliserons l’include du device tree source de notre projet précédent (Partie 1) pour ajouter la broche MCO.

Nous compilons ensuite notre projet avec la commande suivante :

bitbake -k nodem-image

Flash et test :

Avant de flasher notre logiciel, nous allons afficher toutes les horloges présentes sur la carte. Pour cela, nous utilisons la commande :

cat /sys/kernel/debug/clk/clk_summary afin de visualiser toutes les horloges.

Nous allons examiner l’horloge reliée à notre MCO, qui est ck_flexgen_61. Nous vérifions ensuite son état. Actuellement, elle fonctionne à une fréquence de 150 000 000 Hz.

Flashons notre carte avec le nouveau logiciel compilé.

Une fois le flash terminé, nous vérifions la valeur de la fréquence.

ck_flexgen_61                       0       0        0        12286937

Nous avons configuré notre fréquence. Passons maintenant à l’observation avec l’oscilloscope. Connectons l’oscilloscope à la broche 7 sur les 40 pins.

On regarde la sortie.

Afin de pouvoir visualiser notre clock sur la sortie PF11, il faut connecté cette pin a l’USART2

et le résultat est le suivant

Dans cette section, nous avons :

  • Configuré la broche MCO1 dans le device tree

  • Activé la broche MCO1 dans STM32CubeIDE
  • Défini les différents types d’horloges présents sur la carte STP

  • Généré un signal d’horloge (clock)

  • Réalisé des tests

Dans le prochain article (Partie 3), nous aborderons le module ALSA. Nous verrons comment le codec utilise cette fréquence pour envoyer les trames audio.

Nous vous accompagnons dans la transparence dans  la réalisation des activités suivantes:

  • Développement du BSP (Board Support Package
    • La mise en place (Bootloader, personnalisation du noyau Linux, développement de pilotes de périphériques) adaptée à votre matériel, garantissant ainsi le bon fonctionnement de votre système.
  • Intégration logicielle avec yocto ou buildroot.
    • Création des distributions Linux embarquées, personnalisées basées sur Yocto ou Buildroot en mettant l’accent sur l’intégration, la qualité et le déploiement.
  • Développement Bare Metal, avec ou sans RTOS
    • Optimisation des performances et l’efficacité des systèmes basés sur les microcontrôleurs.
    • Développement temps réel avec FreeRTOS. La gestion de la planification des tâches, la communication entre les tâches et la gestion de la mémoire pour répondre à vos besoins de performances en temps réel.
    • L’intégration de périphériques et l’optimisation du code, garantissant une utilisation minimale des ressources.
0 réponses

Laisser un commentaire

Rejoindre la discussion?
N’hésitez pas à contribuer !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *