Table des matières:

Donc, vous chargez le chargeur de démarrage STM32duino dans votre "pilule bleue" Et maintenant?: 7 étapes
Donc, vous chargez le chargeur de démarrage STM32duino dans votre "pilule bleue" Et maintenant?: 7 étapes

Vidéo: Donc, vous chargez le chargeur de démarrage STM32duino dans votre "pilule bleue" Et maintenant?: 7 étapes

Vidéo: Donc, vous chargez le chargeur de démarrage STM32duino dans votre
Vidéo: #153 STM32 clones - good value or cheap copy? Asian Alternative Components 2024, Novembre
Anonim
Ainsi, vous chargez le chargeur de démarrage STM32duino dans votre
Ainsi, vous chargez le chargeur de démarrage STM32duino dans votre
Ainsi, vous chargez le chargeur de démarrage STM32duino dans votre
Ainsi, vous chargez le chargeur de démarrage STM32duino dans votre

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 ?

Épingles et épingles…. Pourquoi le code ne fonctionne pas ?
É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…

Faisons
Faisons

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

AnalogWrite() Versus PwmWrite()… Sortie analogique en 2 saveurs
AnalogWrite() Versus PwmWrite()… Sortie analogique en 2 saveurs
AnalogWrite() Versus PwmWrite()… Sortie analogique en 2 saveurs
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

Communication série STM32
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

Passer une valeur au microcontrôleur
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:

  1. Pour utiliser la fonction pwmWrite(), pinMode() DOIT être déclaré en mode PWM.
  2. 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…
  3. 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 ??

Et si je voudrais taper trois chiffres…. ou encore plus ??
Et si je voudrais 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:

  1. 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.
  2. 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é: