S’envoyer avec MECRISP-Stellaris et Embello

dans le dernier épisode, j’ai préconisé un peu pour le jour des microcontrôleurs étant une plate-forme de développement encore viable, pas seulement pour l’industrie où elle voit normalement ces jours-ci, mais aussi pour les pirates informatiques . Je t’ai peut-être même trompé pour avoir quelques morceaux de matériel bon marché. Cette fois-ci, nous allons obtenir le système de mise en place sur ce matériel et exécuter le «monde Hello» obligatoire et mené clignotant. Mais nous allons également prendre un plongeon dans l’une des caractéristiques qui rendent très soignées sur microcontrôleurs: multitâche facile.

Travailler!

Matériel

MECRISP-Stellaris Forth se déroule sur un grand nombre de microcontrôleurs de bras, mais je me concentrerai ici sur les puces STM32F103 qui sont disponibles pour exceptionnellement peu d’argent sous la forme d’une copie générique de l’érable Mini, souvent appelée une “carte système minimale STM32F103 “Ou” pilule bleue “en raison du facteur de forme, et le fait qu’il y avait des rouges à vendre. Le microcontrôleur à bord peut fonctionner à 72 MHz, dispose de 20 Ko de RAM et de 64 ou 128 kb de flash. Il possède de nombreuses épingles, les numériques uniquement sont de 5 V tolérantes et disposent de tous les périphériques normaux du microcontrôleur. Ce n’est pas le plus efficace de la puissance et il n’a pas d’unité de point flottante ni d’un CAD, mais c’est une vieille conception accidentée disponible pour beaucoup moins d’argent qu’il ne doit l’être.

Programmateur connecté, puissance sur USB
Des merveilles similaires de travaux de production de masse pour le programmeur que vous aurez besoin d’initialement clignoter la puce. L’un des clones de la ST-Link V2 fonctionnera très bien. (Assez ironiquement, le matériel à l’intérieur du programmeur est presque identique à la cible.) Enfin, compte tenu de cela dans une coque interactive, vous aurez besoin d’une connexion série sur la carte STM32. Cela indique probablement un adaptateur USB / série.

Toute cette installation ne coûtera pas beaucoup plus cher que d’un repas de restauration rapide, et le programmeur et l’adaptateur USB / Serial sont des choses que vous voudrez avoir dans votre kit de toute façon, si vous ne le faites pas déjà.

Vous pouvez alimenter le tableau directement via les différents pins 3.3 et GND dispersés autour de la carte, ou via le port micro USB ou les broches 5V sur la carte cible. Ces deux dernières options passent à travers un régulateur de 3,3 V avant de se joindre aux 3,3 broches. Toutes les broches sont interconnectées, il est donc préférable que vous n’utilisiez qu’une seule alimentation à la fois.

Firmware: le système Forth

Allez chercher le paquet Super-Special Hackaday-édition de Makisp Forth de GitHub. Inclus dans le répertoire “ROM” est un système FAI qui fonctionnera pour les démos ici. J’ai chargé dans une base respectable des bibliothèques d’embello exceptionnelles de [JCW]. Afin de fournir des éléments comme une configuration GPIO simple, des fonctions de retard, etc. Il y a beaucoup de nombreuses bibliothèques disponibles et nous les examinerons la prochaine fois que nous en avons besoin.

La chose la plus cool à propos de l’utilisation d’un système Forth est que très peu de logiciels de support est nécessaire de quelque manière que ce soit – l’interprète d’avenir compilait son propre code et vous interagissez avec celui-ci sur le terminal de série. Tout se passe à l’intérieur du microcontrôleur. L’un obstacle, alors, vient sur la puce. Dans les vieux jours, cela devait être fait en basculant manuellement dans les octets manuellement et, en vigueur, est suffisamment petit qui la boorstage littéralement de cette façon est possible. Mais vous avez déjà obtenu ce programmateur de copeaux, non?

Les utilitaires [Texane] sont le moyen le plus simple d’obtenir sur votre puce. Téléchargez-les depuis GitHub et construisez-le vous-même ou essayez votre chance avec votre gestionnaire de paquetage de votre distributeur. (Les gens de Windows, vous n’êtes pas laissé non plus. Bien que ce binaire ne soit pas vu de mises à jour depuis un moment, ça va faire.)

Connectez-vous les fils de programmation de la mode évidente et émettez les commandes magiques ST-Flash Erase et ST-Flash Ecrivez MECRISP-Stellaris-Hackaday-Edition.bin 0x8000000. En cinq secondes, vous serez prêt à gronder.

GND – GND

Swlk – CLK

SWSIO – Dio

Avoir à obtenir un programmeur est un problème si vous n’en avez pas un, mais cela facilitera le reste de votre vie et que l’une est aussi fondamentale que de cliquer sur “payer” et d’attendre. Notre propre [Al Williams] (aucune relation) a un article récent sur l’utilisation du même logiciel de débogage de Code C ou Arduino avec GDB, il vaut donc la peine de la configurer.

Logiciel

Branchement série, alimenté par ordinateur portable
Placez le programmeur pour l’instant et connectez-vous au STM32 sur la série. Le taux de bauds par défaut doit être de 115 200. Si vous n’avez pas encore débranché de puissance, vous devrez peut-être appuyer sur le bouton de réinitialisation de la carte STM32. Si tout s’est bien passé, vous serez accueilli par un crâne familier et des clés croisées. MECRISP s’attend à une ligne de ligne à la fin des lignes. Si vous envoyez LF + CR, vous allez frapper avec succès le retour deux fois.

A9 TX – SERIAL RX

A10 RX – Serial TX

GND – GND

[JCW] ‘S Folie est un important émulateur de terminaux série multi-plateforme pour cette application. Ce qu’il fait que votre programme Terminal normal ne vous permet pas de rentrer à ressaisir une ligne de commande avec la flèche UP-flèche, ce qui facilite beaucoup les erreurs, beaucoup plus facile que de reproduire une commande longue. Ça aussiInclut automatiquement d’autres fichiers que j’ai utilisés substantiels dans la construction du binaire pour cet article. Vous n’avez pas besoin de courir Folie, mais je parie que vous l’aimerez.

Bonjour le monde

Maintenant c’est “Hello World” temps. Si vous êtes neuf pour le début, voici une introduction très sélective. Tapez 2 2 + et appuyez sur Entrée. Ça dit Ok .. c’est rassurant, non? Maintenant tapez. (Lisez «Dot») et il imprimera le résultat non surprenant. Dot est le premier de quelques sténographiés mondiaux au début que vous voudrez internaliser. Beaucoup de commandes avec un point impriment immédiatement leurs résultats. .S (DOT-ESS) imprime le contenu de la pile, par exemple. Deux beaucoup plus d’idiomes que nous verrons beaucoup sont @ pour avoir une variable ou la lecture d’une entrée et! pour définir une variable ou une sortie. Lisez-les comme “Get” et “Set” dans votre tête lors de la numérisation d’un code.

Ensuite, voyons comment écrire une fonction. : Démarre une définition de la fonction et; se termine. Donc: quatre 2 2 +; Définit une fonction qui ajoute deux et deux ensemble. (Et compile-le en temps réel!) Vous pouvez ensuite faire demi-tour et appeler cette fonction immédiatement. Quatre .s vous montrera que notre fonction a laissé la somme de deux et deux sur la pile. En ce sens, les fonctions en avant ne sont pas vraiment des fonctions. Ils ne prennent pas d’arguments explicites ni de retourner des valeurs explicites. Ils opèrent simplement sur toutes les données sur la pile et laissent les résultats là aussi. C’est pourquoi les fonctions sont appelées “mots”. Je vais m’en tenir à cette convention à partir de maintenant.

Ici, enfin, est “Hello World” :: Hw. “Bonjour, Monde!” CR; “Les chaînes sont un peu étranges, principalement à cause de la façon dont la langue est analysée – le compilateur lit jusqu’à un espace, puis exécute ce qu’il a trouvé, il doit donc y avoir un espace entre la chaîne d’impression commande (. “) et le premier caractère que vous souhaitez imprimer. La commande d’impression analyse jusqu’à ce qu’elle trouve une fermeture », cependant, vous n’avez donc pas besoin d’un espace supplémentaire là-bas. CR envoie un retour de chariot. Tapez HW à l’invite. Bonjour, World!

Voyants clignotants

Même si la saisie de texte série et la sortie sont si faciles en avant, clignotent une LED est le standard “Hello World” de microcontrôleurs, il est donc temps pour un GPIO. Étant donné que le système est déjà configuré pour cette carte de microcontrôleur particulière, le tournage d’une LED est aussi simple que de taper LED.ON à l’invite. Voulez-vous l’éteindre? LED.OFF. Le clignotement manuel deviendra vieillir assez rapidement, cependant, écrivons donc un mot de clignotement. : Blink LED.In 100 ms LED.Off 200 ms; fera l’affaire. Essayez Blink Blink Blink Blink. Voir le code de démonstration de mon clignotant pour l’élaboration. (Plus sur MS dans quelques milliers de millisecondes.)

Les détails de l’initialisation GPIO sont cachés dans Core / Hackaday / LED.FS et dans STM32F1 / IO.F de Embello respectivement. Creuser, vous verrez la procédure d’initialisation standard: la goupille particulière est définie comme une sortie en renversant certains bits dans les registres de contrôle périphérique de la STM32. [JCW] a défini un tas de ceux-ci, ce qui permet de définir une broche comme sortie, avec le pilote de tir-pression, aussi facile que PC13 OMODE-PP IO-MODE !. (Souviens-toi que “!” Indique définir la valeur dans une variable ou un registre.)

Pour configurer PIN PA7 pour l’entrée ADC: PA7 IMODE-ADC IO-MODE!. Test des boutons, à l’aide des résistances de pullup intégrées ou de pulldown: PA3 Imode-Tirez IO-Mode! puis réglez la sortie pour tirer vers le haut ou le bas en utilisant le vrai PA3 Io! ou PA3 iOS !. Vous pourrez ensuite lire l’état du bouton avec PA3 IO @ (“IO GET”) plus tard.

GPIO sur les puces STM32 est très flexible et si vous souhaitez obtenir au fond des options de configuration dans la fiche technique, vous pouvez définir tout cela assez facilement en utilisant le code IO.FS de [JCW]. Par exemple, Io.all imprime tous les registres GPIO et leurs valeurs, ce qui est une aide précieuse pour le débogage interactif. Cela dit, il y a une pièce ici pour une couche de matérielle-abstraction beaucoup plus conviviale, si vous souhaitez y contribuer.

Multitâche sur le rapide

Alors maintenant, nous avons un voyant de clignotant et une impression de port série “Hello World”. Pas un mauvais départ, et ces deux ont bon usage de l’interactivité de FARD: le voyant ne s’allume que lorsque vous tapez Blink. Une des vertus en chef de Forth, pour moi, est la facilité d’entretien entre des tests interactifs de mots, puis de déployer la fonctionnalité dans un système de travail. Une des raisons est que presque toutes les présentations soutiennent le multitâche coopérative de base. Voici ce que je veux dire.

Tout d’abord, boucons notre fonction de clignotement afin que nous n’ayons pas à taper autant. : bb begin blink again ; Crée une fonction, BB pour “Bad Blink”, qui fonctionnera pour toujours. Le problème avec “Run Forever” est en quatrième fois que vous ne revenez jamais à la ligne de commande de l’interprète sans appuyer physiquement sur le bouton de réinitialisation, puis tout ce que vous travailliez dans la RAM est perdu.

Au lieu de cela, clignons des yeux dans une boucle avec une sortie. : GB Commencez la clé de clignotement? jusqu’à ce que ; creates a function that will run our blink command until there’s some input from the keyboard — the return crucial is pressed. This particular looping construct is very beneficial for testing out functions that you’d like to run continuously, without hanging the system. keep it in mind.

Once we’ve tweaked our blink function to run just the way we want it, let’s create a background task so it can blink unattended.

task: blinktask
: clignoter&
blinktask activate
begin blink again
;
multitask
clignoter&

Briefly, the task: word creates some memory space for our blinking background task that we’re calling blinktask. The function blink& does the work in the background. blink& starts off by declaring that it will use the blinktask task context, and that it must start off running. then it goes into an limitless blinking loop from which it never leaves. multitask turns multitasking on, and blink& executes our task. Run it, and the LED blinks while you can still interact with the console. Sucré. type tasks and you’ll see that there are two active: one is our blinker and the other is the interactive interpreter.

But how does the blink task know when to yield to other simultaneous processes? In Forth, the word pause yields from the current context and moves on to the next, round-robin multitasking. The ms function, among others, consists of a pause command, so what looks like a blocking delay in a single-task setup ends up playing fantastically well with your other tasks.

The great thing about cooperative multitasking is that you control exactly when there’s going to be a context switch, which can help eliminate glitches that you’ll find in preemptive systems. The downside is that you’re responsible for remembering to pause your functions now and then, and you have to verify the timing yourself. Of course, this is a microcontroller, and you have the ARM’s quite rich internal interrupt controller to play with as well.

The real point of multitasking on micros in Forth is that it makes a great workflow for writing, testing, and deploying little daemons: functions that want to be “always on”. First, write the function that does the action once. Second, test it in a loop with an escape hatch. Third, once it’s working, remove the escape and make a background task for it. You can then turn it on and off using idle and wake, even from within other tasks. See Mecrisp’s multitask.txt, the source, for a lot more details.

Et après?

So far, we’ve set up Mecrisp-Stellaris, with additional libraries from Jeelabs’ Embello Forth framework, and run some quick demos. If this has piqued your interest, I’ll take you on a walkthrough of building some real software next time. There’s a lot a lot more to say about the way that Mecrisp handles the nuances of flash versus RAM, inputs and outputs, and the practice of interactive development. some of the really freaky aspects of working in Forth will raise their funny-shaped heads, and we’ll learn to love them anyway.

In the meantime, get your cheap STM32F103 boards flashed up with our binary, and get a little bit used to playing around in the Forth environment on the chip. Blink some LEDs. look around the Mecrisp-Stellaris glossary and the embello API documentation. Or just type list to see all the command at your disposal and start hacking away.

Leave a Reply

Your email address will not be published. Required fields are marked *