Armer avec un système d’exploitation | Hackaday

Nous voyons des tonnes de projets avec les fameuses cartes STM32 « Blue Pill ». Ils sont bon marché et abondants et ont beaucoup de fonctionnalités intéressantes, ou du moins ils l’étaient avant la pénurie de puces. J’ai récemment acheté une « pilule noire », qui est très similaire mais qui a un processeur encore plus puissant. Pour quelques dollars, vous obtenez un processeur ARM qui peut fonctionner à 100 MHz (mais avec USB, probablement 96 MHz). Il y a 512 Ko de mémoire flash et 128 Ko de RAM. Il y a un port USB de type C, et même un bouton et une LED à bord. La chose tient sur une planche à pain et vous pouvez la programmer avec un dongle STLink bon marché qui coûte environ 10 $.

Le module Blackpill sur une planche à pain.

Bien sûr, vous devez ensuite considérer le logiciel. Le STM32Cube demande beaucoup à configurer et à apprendre, mais il vous permet de faire à peu près tout ce que vous pouvez imaginer. Ensuite, il y a le plug-in STM32Duino qui vous permet de l’utiliser comme un Arduino costaud. Cela fonctionne et est assez facile à mettre en place. Cependant, il y a aussi Mbed. Le seul problème est que Mbed ne fonctionne pas dès la sortie de la boîte. Il s’avère cependant que ce n’est pas si difficile à mettre en place. Je vais vous montrer à quel point il est facile de faire avancer les choses et, la prochaine fois, je vais vous montrer un exemple pratique d’un périphérique USB qui utilise les fonctionnalités mBed RTOS.

Premiers pas

De toute évidence, vous allez avoir besoin d’une pilule noire. Il y a au moins deux choix, mais pour aussi bon marché qu’ils soient, il n’y a aucune raison de ne pas obtenir la version STM32F411 qui a plus de mémoire. Le facteur de forme DIP s’adaptera à n’importe quelle planche à pain que vous possédez et un câble USB C alimentera la carte, donc à moins que vous ne pilotiez beaucoup de circuits externes, vous n’avez probablement pas besoin d’une alimentation externe.

Contrairement à certaines cartes, cependant, le port USB ne vous aidera pas pour la programmation à moins que vous ne gravez dans un chargeur de démarrage. En théorie, la carte peut faire DFU si vous maintenez le bouton BOOT0 enfoncé pendant la réinitialisation. Cependant, ma carte n’entrait en mode DFU qu’occasionnellement. Lire Internet qui ressemble à un problème commun. L’astuce semble être de débrancher l’USB et de le rebrancher au lieu d’utiliser le bouton de réinitialisation. Appuyez sur BOOT0 tout en branchant la carte. Après quelques secondes, relâchez le bouton BOOT0. Cela le rend un peu plus fiable. Ensuite, vous avez besoin d’un programme flash DFU pour programmer un .bin fichier à écrire dans alt 0 du périphérique DFU à l’emplacement 0x08000000. Tout cela et vous n’obtenez toujours pas de débogage.

Heureusement, un dongle STLink v2 qui passe de l’USB à un connecteur à 10 broches est très peu coûteux – 10 $ ou moins. Cela vous permettra de faire de la programmation et du débogage. Cependant, il existe également une fonctionnalité de suivi que ces dongles ne prennent pas en charge.

Vous pouvez bien vous débrouiller sans tracer, mais il est pratique de pouvoir effectuer une sortie de type « printf » via une fonctionnalité appelée SWO (sortie filaire série) et de ne pas avoir à utiliser le port USB comme port série. Si vous voulez SWO, vous aurez soit besoin d’une version plus chère de STLink (avec le plus gros connecteur), soit il y a, bien sûr, un hack. Vous pouvez également utiliser d’autres sondes similaires comme la sonde Blackmagic. Dans certains cas, vous pouvez également utiliser le semi-hébergement, mais il est préférable d’obtenir la bonne sonde, de pirater la sortie SWO ou simplement d’utiliser le débogueur. Bien sûr, si vous configurez le port série USB – assez facile à faire – vous pouvez l’utiliser sans problème.

Le dongle STLink que j’ai utilisé a 10 broches. Malheureusement, tous les clones n’ont pas le même brochage. Les quatre broches du Blackpill, en commençant par la gauche en regardant le connecteur, sont : 3,3 V, SWDIO, SWCLK et Ground. Si cela ne vous dérange pas d’être alimenté par le port USB, vous n’avez besoin que des trois dernières broches.

Habituellement, ces adaptateurs clones ont un brochage sur le boîtier. Pour le mien, les trois fils dont j’avais besoin se trouvaient sur les broches 6, 7 et 8. Si vous tirez 3,3 V de l’appareil, soyez prudent. Tirer trop de courant ou court-circuiter la ligne électrique tuera le dongle.

Un autre problème avec les clones est qu’ils ont souvent un micrologiciel obsolète chargé. Vous pouvez obtenir le STM32CubeProgrammer officiel qui sait comment les mettre à jour. N’oubliez pas de débrancher l’appareil après la mise à jour et d’actualiser la liste des programmeurs après l’avoir rebranché.

Logiciel

Comme je l’ai mentionné, il existe de nombreuses options et de nombreux outils. J’aime généralement les outils Mbed. Lorsque nous avons examiné Mbed pour la première fois, c’était une sorte d’écosystème de type Arduino. L’IDE était en ligne, mais vous pouviez vous déconnecter avec quelques options. Cependant, depuis lors, il a grandi et dispose désormais d’une variété d’outils et même d’un système d’exploitation complet si vous le souhaitez. Il existe un moyen de sélectionner le mode « bare metal » si vous essayez de construire quelque chose de simple, mais avec quelque chose comme la Black Pill, vous avez beaucoup de mémoire et donc pousser beaucoup de code n’est pas vraiment un problème. Même sans le mode bare metal, l’éditeur de liens essaie de supprimer les éléments que vous n’utilisez pas, donc ce n’est pas si grave.

La mauvaise nouvelle, cependant, est que l’écosystème ne prend pas directement en charge la pilule noire. Il prend cependant en charge une carte Nucleo avec le même processeur. Cela fonctionnera et pour des tests simples, ce n’est pas mal. Bien sûr, les noms des broches sont incorrects, mais vous pouvez simplement spécifier les vrais noms comme PC_13 à la place de LED1. Cependant, la vraie mauvaise nouvelle est que la carte cible n’a pas de support USB. Si vous essayez d’utiliser des pilotes USB, vous vous arrêterez simplement parce que le système suppose que vous n’avez pas le matériel pour le gérer.

Il y a de bonnes et de mauvaises nouvelles. La bonne nouvelle est qu’il existe une configuration fournie par l’utilisateur pour la Black Pill. Il a une référence d’horloge plus stable, permet l’USB et a des définitions de broches correctes. La mauvaise nouvelle est que cela ne semble fonctionner que sur l’IDE Mbed exécuté localement. Ce n’est pas si mal puisque je voulais utiliser quelque chose de local de toute façon. Si vous utilisez un ensemble d’outils différent, vous pourriez vous retrouver seul pour définir les cibles. PlatformIO semble également fonctionner comme pour Blue Pill.

Allons-y!

Une fois que vous avez tout assemblé, il est assez facile de faire fonctionner un programme. La prochaine fois, je vous montrerai plus de plaisir avec l’USB, mais pour l’instant, faisons un simple clignotant LED avec une sortie sur un port série USB. Par exemple, vous pouvez exécuter l’exemple « Blinky » dans un émulateur en ligne. Le problème est que printf ne va nulle part utile sur notre conseil.

Aucun problème:

#include "mbed.h"
#include "USBSerial.h"

DigitalOut led(LED1);
USBSerial usbSerial(false); // don't wait for connection

int main() {
   usbSerial.connect();  // set up serial port
   while (1) {
     led = !led;
    usbSerial.printf("Blink! LED is now %dn", led.read());
    ThisThread::sleep_for(500ms);
    }
}

C’est aussi simple que cela. Configurez simplement un projet comme décrit dans la configuration de Black Pill. C’est:

  • Créez un nouveau projet dans Mbed IDE.
  • Cliquez avec le bouton droit sur le dossier racine du programme et dans la fenêtre contextuelle, sélectionnez Ajouter une bibliothèque…
  • Entrer https://os.mbed.com/users/hudakz/code/BLACKPILL_Custom_Target et cliquez sur le bouton Suivant.
  • Ouvrez la liste déroulante et sélectionnez par défaut, puis cliquez sur Terminer.
  • Ouvrez le dossier BLACKPILL_Custom_Target et faites glisser le dossier TARGET_BLACKPILL_F411CE vers le dossier racine du projet.
  • Faites glisser custom_targets.json du dossier BLACKPILL_Custom_Target vers le dossier racine.
  • Supprimez le dossier BLACKPILL_Custom_Target de votre projet.
  • Ouvrez la liste déroulante Cible et cliquez sur le bouton avec une icône « puce » dessus.
  • Ouvrez la liste déroulante des périphériques USB et sélectionnez votre programmeur STM32 ST-Link (ou le périphérique DFU si vous suivez cette voie).
  • Sélectionnez BLACKPILL_F411CE comme cible.
  • Cliquez sur le bouton Enregistrer tout.

Si vous utilisez STLink, vous pouvez simplement cliquer sur le bouton d’exécution ou sur le bouton de débogage pour commencer. Si vous avez sélectionné DFU, l’IDE vous dira où il a laissé le fichier .bin. C’est ce dont vous aurez besoin pour alimenter votre programmeur DFU. Si vous utilisez Linux, la ligne dfu-util ressemblera à :

dfu-util -d 0483:df11 -a 0 -s 0x80000000:leave -D blackpill-program.bin

À propos de l’exemple

Le constructeur par défaut pour USBSerial provoque le blocage du programme jusqu’à ce que vous ouvriez réellement le port série, ce qui peut ou non être un comportement que vous souhaitez. Cependant, avec la Black Pill et ma configuration, il n’énumère pas de manière fiable le port série en utilisant le constructeur par défaut de toute façon.

Dans le simulateur, ils utilisent le wait_ms fonction de pause, mais je le change pour le plus moderne ThisThread::sleep_for. La vérité est que le programme ci-dessus a un RTOS complet avec des tâches prioritaires planifiées et une variété de méthodes de synchronisation allant des boîtes aux lettres aux mutex. Il existe également des pilotes pour les périphériques USB de toutes sortes, les bus CAN, les systèmes de fichiers et bien plus encore. Nous n’utilisons aucune de ces choses en ce moment, mais elles sont là. Nous avons toujours un seul thread et pouvons travailler avec lui en utilisant des méthodes telles que sleep_for.

Impression ancienne ordinaire

Si vous préférez simplement avoir printf et les autres E/S de la console vont au port USB par défaut, vous pouvez ajouter le code suivant, en supposant que vous avez également le usbSerial objet visible par ce code.


namespace mbed
{
   FileHandle *mbed_override_console(int fd)
   {
   return &usbSerial;
   }
}


Ensuite, vous pouvez utiliser printf à la place de usbSerial.printf et le résultat sera le même. Il n’y a qu’un seul hic. Si vous utilisez la valeur par défaut USBSerial constructeur, votre programme se bloquera jusqu’à ce que le port USB se connecte. Mais si vous définissez le premier argument du constructeur sur false, cela ne se produira pas. Ce qui se passera, c’est lorsque votre programme tentera d’écrire une sortie et qu’il n’y aura rien stdio la bibliothèque décidera utilement que vous n’avez pas besoin d’essayer plus loin, donc rien n’apparaîtra. Pour résoudre ce problème, vous devez appeler périodiquement clearerr(stdout) ou sur toute autre poignée que vous pourriez utiliser. Il existe d’autres alternatives. Par exemple, vous pouvez éviter d’appeler des choses comme printf lorsque usbSerial::connected() renvoie faux. Ou appeler clearerr lorsque vous détectez que le port passe de non connecté à connecté. Si vous êtes intéressé, j’ai laissé un autre exemple sur GitHub pour vous aider à démarrer.

Prochaines étapes

L’IDE Mbed en mode débogueur

Vous pouvez facilement exécuter le code via le débogueur, ce qui est plutôt agréable. Bien sûr, il existe de nombreuses autres options de débogage car, à la base, il s’agit essentiellement d’un serveur gdb qui communique avec le matériel via la connexion STLink.

La prochaine fois, cependant, nous transformerons la Black Pill en un faux clavier USB et l’utiliserons pour envoyer des commandes de contrôle du volume à un PC qui correspondent au mouvement sur un potentiomètre connecté à une entrée analogique. En cours de route, nous allons créer des discussions et les faire coopérer.