Un examen plus approfondi des E / S programmables (PIO) Raspberry Pi RP2040

Pico PIO State Machine


La popularité de la carte Raspberry Pico alimentée par le microcontrôleur RP2040 a incité chaque lecteur à vouloir en savoir plus sur la carte et la puce. Nous allons donc parler aujourd'hui des E / S programmables du RP2040, une caractéristique qui le différencie de la plupart des autres cartes microcontrôleurs.

Les deux blocs PIO ou appelons cela les interfaces matérielles du RP2040 ont chacun quatre machines à états. Ces deux blocs PIO peuvent exécuter simultanément des programmes pour manipuler des GPIO et transférer des données brutes. Maintenant, que font ces machines d'état? Eh bien, les machines à états PIO exécutent les programmes extraits de diverses sources. Parfois, les programmes sont extraits de la bibliothèque PIO (UART, SPI ou I2C) ou du logiciel utilisateur.

Pourquoi des E / S programmables?

Toutes les cartes sont généralement livrées avec un support matériel pour les protocoles de communications numériques tels que I2C, SPI et UART. Cependant, si vous prévoyez d'utiliser plus de ces interfaces que ce qui est disponible sur la carte, vous pouvez utiliser les E / S programmables fournies dans le microcontrôleur RP2040.

Eh bien, cela a plus de capacités que ce à quoi on peut penser. Supposons que vous souhaitiez sortir une vidéo DPI ou «communiquer avec un périphérique série trouvé sur AliExpress» est désormais possible avec les E / S programmables. Comme son nom l’indique, les E / S «programmables» indiquent clairement qu’elles peuvent être programmées directement pour prendre en charge plusieurs interfaces, notamment l’interface de la carte SD, la sortie VGA et le transfert de données plus rapide. Attendez! Nous avons la partie la plus excitante de l’article à venir – «Comment programmer ces E / S programmables pour vous faciliter la tâche».

Comment démarrer avec la programmation RP2040 PIO?

Le Pico SDK (Software Development Kit) fournit les en-têtes, les bibliothèques et le système de construction nécessaires pour écrire des programmes pour les appareils basés sur RP2040 tels que Raspberry Pi Pico en langage d'assemblage C, C ++ ou Arm

Si vous envisagez d'utiliser Python pour coder, vous n'avez besoin que d'un éditeur approprié (par exemple, Thonny) et de MicroPython installés sur la carte de développement. Mais dans le cas de C / C ++, vous avez besoin d'un fichier CMake qui indique au Pico SDK comment transformer le fichier C en une application binaire pour une carte microcontrôleur RP2040, comme expliqué dans notre récent tutoriel MicroPython et C pour Raspberry Pi Pico.

L'assembleur PIO analyse un fichier source PIO et génère la version assemblée prête à être incluse dans une application RP2040. Cela inclut les applications C et C ++ construites avec le SDK Pico et les programmes Python s'exécutant sur le port MicroPython RP2040.

Pour commencer à programmer la machine à états pour votre application PIO, il existe trois composants pour le programme basé sur C / C ++.

  • Un programme PIO
  • Logiciel basé sur le langage C pour exécuter le spectacle
  • Un fichier CMake décrivant comment ces deux éléments sont combinés dans une image de programme à charger sur une carte de développement RP2040.

Instructions de montage PIO

Maintenant, quand il s'agit de programmer ces interfaces IO, il y a neuf instructions d'assemblage «JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ et SET». Bien que la plupart des gens puissent être intéressés par la programmation des interfaces PIO avec le langage C / C ++ ou Python, examinons certaines des instructions du langage d'assemblage utilisées pour les interfaces IO.

  • JMP: Cette instruction «jump» peut être une instruction conditionnelle ou non conditionnelle. En cela, il transfère le flux d'exécution en modifiant le registre du pointeur d'instruction. En termes simples, avec l'instruction «jmp», le flux d'exécution va vers une autre partie du code.
  • WAIT: Cette instruction bloque l'exécution du code. Chaque instruction prend un cycle à moins qu'elle ne soit bloquée (en utilisant les instructions WAIT).
  • OUT: Cette instruction décale les données du registre à décalage de sortie vers d'autres destinations, 1… 32 bits à la fois.
  • PULL: Cette instruction fait apparaître les mots de 32 bits de TX FIFO dans le registre à décalage de sortie.
  • IN: Cette instruction décale de 1 à 32 bits à la fois dans le registre.
  • PUSH: Cette instruction pour écrire le contenu ISR dans la FIFO RX.

Plus d'informations sur les instructions du langage d'assemblage sont disponibles dans le Fiche technique RP2040.

Exemple de programmation RP2040 PIO en C / C ++ et MicroPython

Pour vous faciliter la tâche, nous examinerons le programme de Bonjour le monde qui fait clignoter la LED intégrée à l’aide des E / S programmables et des données 32 bits de la FIFO TX (instructions PULL).

Le programme en C / C ++ ressemble à ceci:

Le code C / C ++ ci-dessus fait clignoter la LED avec un cycle complet de 1 seconde. La LED est programmée de telle manière qu'elle sera allumée pendant 500 ms, puis éteinte pendant 500 ms. Mais, avant que les machines à états puissent exécuter le programme, nous devons charger le programme dans cette mémoire d'instructions. "La fonction pio_add_program () trouve de l'espace libre pour notre programme dans la mémoire d'instructions d'un PIO donné et le charge." Avec cela, nous configurons la machine à états pour envoyer ses données à la LED intégrée.

Le code d'assembly du fichier .pio illustré ci-dessous contient toutes les fonctions d'assistance C pour définir le code C / C ++.

En dehors de ceux-ci, vous avez également besoin d'un fichier CMake qui décrit comment les fichiers .pio et .c sont intégrés dans un binaire adapté au chargement sur votre carte de développement Raspberry Pi Pico.

Il n’existe pas d’échantillon équivalent écrit avec MicroPython, mais nous pouvons voir un code PIO MicroPython plus simple utilisé pour faire clignoter le voyant intégré:

Il n’existe pas de fichier .pio distinct dans ce cas, et MicroPython et le code d’assemblage sont placés dans le fichier .py.

Notez que même si PIO peut être programmé avec MicroPython, la documentation du SDK Python indique qu'il est actuellement instable / en cours de travail, donc C / C ++ est recommandé.

Il peut y avoir de nombreuses modifications au code en ajoutant la couleur que vous souhaitez afficher à l'aide du format hexadécimal en RVB. Cependant, il existe de nombreux exemples réels tels que PWM, UART ou même interfacer les NeoPixels. Pour ceux qui sont intéressés, vous pouvez trouver de nombreux exemples de programmation PIO dans les référentiels GitHub pour C et Exemples MicroPython.

Conclusion

Les E / S programmables RP2040 ont la capacité d'exécuter simultanément des programmes pour prendre en charge des interfaces telles que la sortie VGA et un transfert de données plus rapide. Vous pouvez consulter le chapitre 3 de la documentation du SDK pour C / C ++ et Python pour en savoir plus sur les E / S programmables RP2040.



Source link

Laisser un commentaire

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