Table des matières:
- Étape 1: épingles et épingles… Pourquoi le code ne fonctionne pas ?
- Étape 2: "définissons" quelques épingles…
- Étape 3: PinMode ()… Comment utiliserez-vous vos épingles…
- Étape 4: AnalogWrite() Versus PwmWrite()… Sortie analogique en 2 saveurs
- Étape 5: Communication série STM32
- Étape 6: passer une valeur au microcontrôleur
- Étape 7: Et si je souhaite taper trois chiffres…. ou encore plus ??
Vidéo: Donc, vous chargez le chargeur de démarrage STM32duino dans votre "pilule bleue" Et maintenant?: 7 étapes
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:06
Si vous avez déjà lu mes instructables expliquant comment charger le chargeur de démarrage STM32duino ou toute autre documentation similaire, vous essayez de charger un exemple de code et… il se peut que rien ne se passe du tout.
Le problème est que beaucoup, sinon tous les exemples de STM32 "génériques" ne fonctionneront pas immédiatement. Des modifications mineures seront nécessaires pour faire fonctionner ensuite votre carte STM32 "Blue Pill".
Je vais sélectionner 4 exemples de code pour expliquer ce qui doit changer et pourquoi. Les codes sont: "BlinkWithoutDelay", "Fading", "Dimmer" et "AnalogInSerial".
Attention, je n'ai rien codé. Je viens de publier des modifications mineures dans les codes créés par:
David A. Mellis et modifié tardivement par Tom Igoe, Marti Bolivar et certains cas par Scott Fitzgerald
Tom Igoe et modifié tardivement par Bryan Newbold
Donc, je préfère garder les noms d'auteurs même dans les codes que je modifie, en gardant le crédit de création.
Étape 1: épingles et épingles… Pourquoi le code ne fonctionne pas ?
Jetons un coup d'œil à la broche STM32 "Blue Pill". Notez que les broches sont identifiées comme PA1 ou PC2… quelque chose comme ça.
Si vous regardez, par exemple, l'exemple de code « BlinkWithoutDelay », la broche est déclarée comme « 33 »… Pourquoi ?
Je soupçonne que c'est parce que M. Marti Bolivar a porté ce code pour la carte MAPLE.
Je pense que ce n'était pas son intention de laisser du code compatible avec les cartes "Blue Pill".
Les broches des mini-cartes d'érable et d'érable sont déclarées numériques, comme Arduino, bien qu'elles utilisent des nombres comme 33, 24 et certains comme celui-ci.
J'ai dit que le code ne fonctionnait pas ? Mon erreur. Le code est compilé sans erreur et téléchargé correctement sur "Blue Pill", donc, à mon avis, il fonctionne effectivement, mais nous ne nous attendons pas à utiliser une sortie GPIO. Peut-être même pas disponible.
Donc, peu de changements sont nécessaires dans le code pour qu'il fonctionne comme prévu.
Étape 2: "définissons" quelques épingles…
C'est une bonne pratique de code de déclarer les ressources comme des variables ou des constantes faciles à identifier ou à signifier. Cela vous permettra de coder plus facilement et de dépanner.
J'ai utilisé déclarer les broches Arduino comme ceci:
…
const int ledPin =13;
…"
Si vous m'aimez bien, vous vous demandez peut-être: « Comment puis-je déclarer des broches avec des noms comme PC13 ??? »
La réponse est: Utilisez l'instruction C "#define".
Ainsi, selon le brochage, PC13 est la broche que nous avons à bord de la LED dans "BluePill". Pour l'utiliser, je déclarerais comme ceci, juste après la définition des librairies (#include…) et avant toute autre chose:
…
#définir LedPin PC13
…"
Notez qu'il n'y a PAS de ";" terminaison de ligne, affectation NOR "=".
Comparez les deux codes. L'un est l'exemple d'origine chargé à partir de l'IDE. Le deuxième est celui que j'ai ajusté pour travailler avec "BluePill".
Je recommande fortement de déclarer toutes les broches que vous avez l'intention d'utiliser dans le code. Même ceux qui ont l'intention de l'utiliser comme entrée ADC (plus à ce sujet plus tard).
Cela vous facilitera la vie.
Étape 3: PinMode ()… Comment utiliserez-vous vos épingles…
Avant de continuer, comprenons la fonction PinMode().
Comme Arduino, les broches STM32 ont plusieurs fonctions. Le moyen le plus simple de sélectionner l'un ou l'autre est d'utiliser l'instruction pinMode().
Arduino n'a que 3 modes disponibles, INPUT, OUTPUT ou INPUT_PULLUP.
STM32, en revanche, a de nombreuses variantes de pinMode(). Elles sont:
SORTIE -Sortie numérique de base: lorsque la broche est HAUTE, la tension est maintenue à +3,3 V (Vcc) et lorsqu'elle est FAIBLE, elle est ramenée à la terre
OUTPUT_OPEN_DRAIN -En mode drain ouvert, la broche indique « faible » en acceptant le flux de courant vers la terre et « élevée » en fournissant une impédance accrue
INPUT_ANALOG -C'est un mode spécial pour quand la broche sera utilisée pour les lectures analogiques (pas numériques). Permet à la conversion ADC d'être effectuée sur la tension à la broche
INPUT_PULLUP -L'état de la broche dans ce mode est signalé de la même manière qu'avec INPUT, mais la tension de la broche est doucement « tirée » vers +3,3 v
INPUT_PULLDOWN -L'état de la broche dans ce mode est signalé de la même manière qu'avec INPUT, mais la tension de la broche est doucement « abaissée » vers 0v
INPUT_FLOATING -Synonyme de INPUT
PWM - Il s'agit d'un mode spécial lorsque la broche sera utilisée pour la sortie PWM (un cas particulier de sortie numérique)
PWM_OPEN_DRAIN -Comme PWM, sauf qu'au lieu d'alterner des cycles LOW et HIGH, la tension sur la broche consiste en des cycles alternés de LOW et de flottant (déconnecté)
(remarque: extrait de
Je viens d'ouvrir cette parenthèse car lorsque vous commencez à créer votre propre code, veillez à utiliser le pinMode() correct pour votre besoin.
Étape 4: AnalogWrite() Versus PwmWrite()… Sortie analogique en 2 saveurs
Avant d'utiliser les broches GPIO "Blue Pill", il est nécessaire de déclarer son comportement, c'est-à-dire comment cela fonctionnera. C'est exactement ce que fait la fonction pinMode().
Alors, concentrons-nous maintenant sur le réglage correct d'une sortie analogique. Il peut être déclaré en mode OUTPUT ou en mode PWM.
De la même manière, les valeurs analogiques peuvent être attribuées au GPIO de 2 manières: analogWrite() ou pwmWrite(), MAIS, analogWrite() NE fonctionnera que si pinMode()= OUTPUT. D'autre part, pwmWrite() NE FONCTIONNERA que si pinMode()=PWM.
Prenons PA0, par exemple: c'est un candidat de sortie analogique/pwm.
analogWrite(): ceci déclare de cette façon:
….
#define ledPin PA0
pinMode(ledPin, SORTIE);
analogWrite(ledPin, < nombre >);
……"
où le nombre doit être compris entre 0 et 255, comme Arduino. En fait, il est rétrocompatible avec Arduino.
pwmWrite(): déclarez de cette façon:
…
#define ledPin PA0
pinMode (ledPin, PWM);
pwmWrite(ledPin, < nombre.>);
…."
Où le nombre doit être compris entre 0 et 65535, une résolution bien supérieure à celle d'Arduino.
En images il est possible de comparer entre 2 codes. Vous pouvez également voir le code d'origine.
Étape 5: Communication série STM32
Voyons comment sont disposées les interfaces USART dans STM32. Oui, interfaces au pluriel…..
"Blue Pill" a 3 USART (RX/TX 1 ~ 3), et, si vous utilisez un bootloader vous permet d'utiliser l'USB, il n'est connecté à aucun d'entre eux.
Selon que vous utilisez ou non l'USB, vous devez déclarer le port série d'une manière ou d'une autre dans votre code.
Cas 1: Utilisation de l'USB:
De cette façon, les croquis sont téléchargés directement via USB. Pas besoin de déplacer le cavalier BOOT0 sur 1 position et de le remettre à 0.
Dans ce cas, chaque fois que vous déclarez "Série" sans index, cela signifie une communication via USB.
Ainsi, Serial1, signifie TX/RX 1 (broches PA9 et PA10); Serial2, signifie TX/RX 2 (broches PA2 et PA3) et Serial 3 signifie TX/RX 3 (broches PA10 et PA11).
C'est la façon dont nous travaillons. Je vais présenter des changements dans des exemples pour cette façon de coder.
Autre chose: "Serial USB" n'a pas besoin de s'initialiser. En d'autres termes, "…Serial.begin(15200);" n'est pas nécessaire.
Il est possible d'appeler n'importe quelle fonction Serial (Serial.read(), Serial.write(), etc) sans aucune initialisation.
Si, pour une raison quelconque, il est présent dans le code, le compilateur l'ignorera.
Cas 2: Utilisation d'un adaptateur série TTL vers USB:
De cette façon, le chargeur de démarrage ne prend pas en charge la communication USB STM32 native, vous avez donc besoin d'un adaptateur USB vers série connecté à TX/RX 1 (pin PA9 et PA10) pour télécharger des croquis.
Dans ce cas, chaque fois que "Serial" sans index est un code, signifie TX/RX1 (port utilisé pour télécharger le code). Ainsi de suite, Serial1 se réfère à TX/RX 2 (broches PA2 et PA3) et Serial2 se réfère à TX/RX 3 (broches PA10 et PA11). Aucun Serial3 disponible.
Étape 6: passer une valeur au microcontrôleur
L'exemple de gradateur est un moyen simple de montrer comment transmettre une valeur au microcontrôleur.
Il suppose de passer une valeur de 0 à 255 pour contrôler la luminosité des LED.
Cela ne fonctionnera PAS comme prévu dans Blue Pill en raison de:
- Pour utiliser la fonction pwmWrite(), pinMode() DOIT être déclaré en mode PWM.
- Vous n'obtiendrez jamais un nombre entier à 3 chiffres. La fonction Serial.read() ne capture que le contenu du tampon, qui est un "BYTE". si vous tapez "100" et appuyez sur "enter", seul le dernier "0" sera capturé à partir du tampon. Et sa valeur sera "48" (valeur ASCII décimale pour "0"). Si vous souhaitez émettre la valeur « 100 », il est nécessaire de taper « d ». Donc, il est correct de dire qu'il convertira une valeur décimale de symbole ASCII en luminosité LED, non ??…. Eh bien, une sorte de…
- Problème, mapper les valeurs directement à partir de la fonction Serial.read() est une action piège. Il est presque certain d'obtenir des valeurs inattendues. Une meilleure approche consiste à stocker le contenu du tampon dans une variable temporaire et à le mapper.
Comme je l'ai expliqué précédemment au point 2, le code que j'introduis des modifications permettra d'entrer un symbole ASCII et cela contrôlera la luminosité de la LED en fonction de sa valeur décimale ASCII… et "}" est possible le plus élevé (valeur 126). Les autres caractères ne sont pas imprimables, donc le terminal ne comprendra pas ou il est possible qu'ils soient un composé de caractère (comme "~" est une touche morte dans mon clavier et ne fonctionnera pas correctement). Cela signifie que ce caractère composé, lorsqu'il est entré dans le terminal, enverra le caractère lui-même et autre chose. Généralement non imprimable. Et est-ce que ce dernier code capturera. De plus, gardez à l'esprit que votre terminal, dans ce cas, ne doit PAS envoyer ni "Retour chariot" ni "Saut de ligne". Vous devez faire attention à cela pour que le code fonctionne correctement.
Si vous tombez, c'est un peu déroutant, ça devient pire…..
Étape 7: Et si je souhaite taper trois chiffres…. ou encore plus ??
Recevoir plusieurs caractères d'une communication série n'est pas une tâche simple.
Le tampon série est une pile d'octets FIFO de caractères. Chaque fois que la fonction Serial.read() appelle, le premier caractère envoyé est supprimé de la pile et stocké ailleurs. Généralement une variable char dans le code. Notez que, selon le matériel, il y a généralement un délai d'expiration pour la façon dont le tampon de journal peut conserver les informations.
Si vous avez l'intention d'entrer plus d'un chiffre via série, vous devrez "composer" une chaîne caractère par caractère, car ils entrent dans le tampon UART.
Cela signifie lire en boucle chaque caractère de tampon, stocker dans une variable temporaire, la charger en première position d'un tableau de chaînes, passer à la position suivante et recommencer, jusqu'à ce que… eh bien, cela dépend de l'application. Il y a 2 façons de terminer le cycle:
- En utilisant un caractère de "marque de fin", comme "retour chariot" ou "saut de ligne". Dès que le caractère "end Mark" est trouvé, la boucle se termine.
- Alternativement, le nombre de caractères dans la chaîne de chaînes peut être limité, de même que le nombre de cycles interactifs. Quand il atteint la limite, disons, 4, acquérir la routine se termine par lui-même.
Jetons un coup d'œil à un exemple simple pour savoir comment procéder:
- Définissez un caractère "fin", comme '\n' (cela signifie un caractère ASCII de saut de ligne).
- boucle pendant que Serial.available() est vrai
- le stockage de Serial.read() résulte en une variable char temporaire. Rappelez-vous: dès que Serial.read() « lit » réellement le tampon, il est propre et le caractère suivant s'y charge.
- incrémenter une variable chaîne avec ce caractère
- Si le dernier caractère est "end", quittez la boucle.
Habituellement, la routine pour obtenir un tableau de caractères série ressemble à une image.
Il était basé sur une vaste adaptation du code original de M. David A. Mellis.
N'hésitez pas à l'utiliser et à le tester. N'oubliez pas: les valeurs DOIVENT être saisies au format à 3 chiffres.
C'est pour l'instant. Je ne m'étendrai pas dans des détails de communication série supplémentaires. Il est trop complexe à couvrir ici et il mérite ses propres Intructables.
J'espère que cela vous aidera à utiliser des exemples dans Blue Pill et vous éclairera sur la façon dont le code est correct pour ce petit tableau.
Rendez-vous dans d'autres instructable.
Conseillé:
Graver le chargeur de démarrage dans la carte de clonage Arduino Nano 3.0 : 11 étapes
Graver le chargeur de démarrage dans la carte de clonage Arduino Nano 3.0 : a récemment acheté un clone Arduino Nano 3.0 d'AliExpress qui est venu sans chargeur de démarrage. Je suis sûr qu'il y a beaucoup d'autres personnes qui sont dans la même situation que moi, et qui ont peut-être un peu flippé au début ! Ne vous inquiétez pas, dans cet instructab
Alternative Arduino - Programmation de la pilule bleue STM32 via USB: 5 étapes
Alternative Arduino - Programmation de la pilule bleue STM32 via USB : vous et moi aimons tous les deux les cartes Arduino, de la plus petite Attiny85 à la plus grande MEGA2560. Cependant, si vous avez besoin de plus de vitesse, de plus d'entrées analogiques, de plus de précision, mais que vous ne voulez toujours pas passer de la programmation Arduino, il existe une solution élégante….Le b
Comment obtenir de la musique à partir de PRESQUE N'IMPORTE QUEL (Haha) site Web (tant que vous pouvez l'entendre, vous pouvez l'obtenir Ok très bien s'il est intégré dans Flash, vous ne pourrez peut-être pas) ÉDITÉ !!!!! Informations ajoutées : 4 étapes
Comment obtenir de la musique à partir de PRESQUE N'IMPORTE QUEL (Haha) site Web (tant que vous pouvez l'entendre, vous pouvez l'obtenir… Ok très bien s'il est intégré dans Flash, vous ne pourrez peut-être pas) ÉDITÉ !!!!! Informations supplémentaires : si jamais vous allez sur un site Web et qu'il joue une chanson que vous aimez et que vous voulez, voici l'instructable pour vous pas de ma faute si vous gâchez quelque chose (la seule façon dont cela se produira est si vous commencez à supprimer des éléments sans raison ) J'ai pu obtenir de la musique pour
Comment restaurer les dossiers ouverts lorsque vous vous reconnectez après vous être déconnecté : 5 étapes
Comment restaurer les dossiers ouverts lorsque vous vous reconnectez après vous être déconnecté : Bon, voici la situation, vous utilisez l'ordinateur avec beaucoup, beaucoup de vos dossiers ouverts… Ensuite, votre mère est rentrée à la maison plus tôt que prévu ! Vous savez parfaitement que si elle vous surprend en train d'utiliser l'ordinateur, alors que vous devriez être au lit car
Donc, vous voulez construire un robot géant. : 19 étapes (avec photos)
Donc, vous voulez construire un robot géant. : Vous dites que vous voulez construire un robot géant ? Quel est ton but? La domination du monde? Votre petite amie n'aura pas cette bière pour vous ? Quoi qu'il en soit, voici comment commencer à construire vous-même un robot. Le but de ce robot était d'être un accessoire de scène pour m