Aller au contenu






* * * * * 3 votes

Débuter avec la STM32 (F103)

Posté par Jekert, dans STM32 12 mars 2017 · 60 083 visite(s)

STM32 STM32F103C8T6 Blue Pills bootloader
[Attention : Cet article a été écrit pour Windows 8, il se peut que certains passages ne fonctionnent plus sous une version plus récente !]
 
Aujourd'hui on va voir comment installer une STM32F103 (carte compatible Arduino avec quelques avantages, voir "caractéristiques"), l'utiliser avec Arduino IDE et le port microUSB ainsi que quelques exemples basiques de montages.
Caractéristiques :
Pour débuter, j'ai choisi la carte STM32F103C8T6 (Cortex-M3 72Mhz) que vous pourrez trouver facilement sur internet :

SAM_3305.JPG

Mémoire flash : 64ko ou 128ko (Arduino UNO : 32ko)
Mémoire SRAM : 20ko (Arduino UNO : 2ko)
Vin : 2,0-3.6V
Résolution des entrées : 4096 (Arduino UNO : 1025)
Fréquence de travail : 72Mhz (Arduino UNO : 16Mhz)
Tension de sortie : 3V3 (Arduino UNO : 5V)
 
Pré-requis :
Avant de commencer, une petite liste des choses nécessaire pour continuer :
  • 1 carte STM32F103C8T6 (Blue Pills)
  • 1 adaptateur Série (pour charger le bootloader)
  • 1 câble micro-USB
  • + de quoi souder
Il est possible que vous ayez à remplacer une résistance montée en surface (nommée R10, a remplacé par une résistance de 1.5k Ohm) placée sous la carte qui pose certains problèmes lors du téléversement de programme par le port micro-USB. De mon coté, j'ai changé la résistance sur l'une des cartes et laissé celle d'origine sur l'autre pour voir la différence (au final, les 2 ont fonctionné), donc le meilleur moyen de savoir, c'est d'essayer d'abord avec celle d'origine puis si vous rencontrez des problèmes, liés à la reconnaissance du port USB et que vous n'arrivez pas à le résoudre, de la modifiée.

SAM_3311.png

SAM_3312.JPG

 
Quelques liens :
Voici quelques sites où vous pourrez trouver des informations à propos de ces cartes : 
Utiliser le port USB pour téléverser ses programme avec Arduino IDE :
La plupart des cartes viennent sans bootloader, il va donc vous falloir suivre un certain nombre d'étapes décrites ci-dessous. J'ai essayé plusieurs techniques avant d'écrire celles-ci donc si vous rencontrez le moindre problème, n'hésitez pas à le signaler dans les commentaires :)
Etape 1 : Après avoir souder les broches, connectez le serial adapter comme indiqué ci-dessous et trouvez son port COM avec Arduino IDE ou le gestionnaire de Périphériques (COM3 dans mon cas)
Serial       STM32
3V3    --> 3,3
GND   --> GND (noté G)
RX      --> A10 (compatible 5V)
TX      --> A9   (compatible 5V)

SAM_3314.JPG

Etape 2 : Modifiez l'emplacement de boot0 sur 1 et appuyez sur le bouton RESET :





SAM_3315.JPG

Etape 3 : Téléchargez cette archive : https://github.com/r...e/Arduino_STM32
Etape 4 : Décompressez-la dans votre dossier Documents->Arduino->Hardware (créez-le si il n'existe pas).
Etape 5 : Dans le fichier décompressé, allez dans Arduino_STM32->drivers->win et lancez le fichier install_drivers
Etape 5.5: Ajouter les cortex m3 avec le gestionnaire de cartes
Etape 6 : Puis collez ce fichierdans hardware/Arduino_STM32/tool/win et lancez un terminal (fichier->ouvrir l'invité de commande, sous win8) dans ce dossier.
Etape 7 : Entrez cette commande (modifiez le COM si besoin) :
stm32flash.exe -w generic_boot20_pc13.bin COM3
Si tout s'est bien passé, vous devriez obtenir ceci :

ss (2017-03-11 at 10.43.36).png

Si c'est le cas, replacez BOOT0 sur 0 et appuyez sur RESET.
 
Etape 8 : Ouvrez Arduino IDE et téléchargez les paquets pour l'Arduino Due et Zero (en cherchant dans le gestionnaire de carte, accessible comme indiqué ci-dessous) et redémarrez Arduino IDE :

ss+(2017-03-11+at+10.45.46).png

 
Etape 9 : Déconnectez le serial adapter et connectez la carte au PC via le port microUSB:

SAM_3316.JPG

 
Etape 10 : Créez un sketch vide :
void setup() { 
}

void loop() {  
}
Puis entrez les paramètres de votre carte dans "Outils" :

ss+(2017-03-11+at+10.51.10).png

Etape 11 : Téléversez le programme sans choisir de port COM et en ayant préalablement appuyé sur le bouton RESET
 
Et voilà, votre ordinateur devrait avoir commencé l'installation automatique des pilotes, et le port Série devrait apparaitre sous peu dans la liste de l'Arduino IDE ! :)
 
Quelques bases pour continuer :
Une liste des différentes librairies utilisables est décrite iciet une liste de projet à base de ces cartes est disponible ici.
 
Et enfin, quelques exemples de bases :
 
Blink sur la breadboard :
Pour cet exemple j'ai simplement connecté en série une résistance de 220 Ohm et une led entre le pin PA0 et le GND (noté G) :






[PA0]----[220 Ohm]----|>|----[G]

SAM_3317.JPG

Et le programme utilisé :
#define LED PA0

void setup() { 
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(1000);
  digitalWrite(LED, LOW);
  delay(1000);
}
Utiliser un bouton :
Pas plus compliqué, il suffit d'ajouter un bouton, de connecter un coté au 3.3V et l'autre à PA1 (sans oublier de connecter ce coté avec une résistance de 10k Ohm au GND) :





[3V3]----[Bouton]----[PA1]

                                               |--[10k Ohm]----[G]

SAM_3318.JPG

 

Et le programme utilisé :
#define LED PA0
#define BOUTON PA1

void setup() { 
  pinMode(LED, OUTPUT);
  pinMode(BOUTON, INPUT);
}

void loop() {
  if( digitalRead(BOUTON) == HIGH)
  {
    digitalWrite(LED, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}
Ajouter un potentiomètre et une communication Série :
Pour cela, un simple potentiomètre dont la patte centrale est connecté à PA2 et les 2 autres à G et 3,3 doit être ajouté :





SAM_3319.JPG

Pour allumer ou éteindre la led avec ce programme, il vous suffit d'envoyer un 1 ou un 0 dans le moniteur Série.
#define LED PA0
#define BOUTON PA1
#define POTENTIOMETRE PA2

void setup() { 
  pinMode(LED, OUTPUT);
  pinMode(BOUTON, INPUT);
  pinMode(POTENTIOMETRE, INPUT);

  Serial.begin(9600);
}

void loop() {
  Serial.print("Bouton : "); Serial.print(digitalRead(BOUTON));
  Serial.print(" | Potentiometre : "); Serial.println(analogRead(POTENTIOMETRE));
  if (Serial.available() > 0)
  {
    if (Serial.readString() == "1")
    {
      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
  }
}
Et on remarque que l'on obtient une valeur entre 0 et 4095 sur l'entrée connectée au potentiomètre, ce qui nous permettra d'avoir une plus grande précision que sur l'Arduino UNO.
 
Utiliser un servomoteur :
Vu que l'on a déjà un potentiomètre, essayons d'y ajouter un servomoteur (même si ils sont alimentés en 5V, les SG90 acceptent un signal PWM de 3.3V) dont le pin dédié au signal est connecté à PA3, 5V sur le 5V et GND sur le G.

SAM_3320.JPG

#include <Servo.h>

#define LED PA0
#define BOUTON PA1
#define POTENTIOMETRE PA2
#define PIN_SERVO PA3

Servo servo;

void setup() { 
  pinMode(LED, OUTPUT);
  pinMode(BOUTON, INPUT);
  pinMode(POTENTIOMETRE, INPUT);
  servo.attach(PIN_SERVO);

  Serial.begin(9600);
}

void loop() {
  Serial.print("Bouton : "); Serial.print(digitalRead(BOUTON));
  Serial.print(" | Potentiometre : "); Serial.println(analogRead(POTENTIOMETRE));

  servo.write( map(analogRead(POTENTIOMETRE), 0, 4095, 0, 180) ); //Conversion en degrès
  
  if (Serial.available() > 0)
  {
    if (Serial.readString() == "1")
    {
      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(LED, LOW);
    }
  }
}
Comparaison avec Arduino Nano :
Pour finir ce billet je voulais partager cette vidéo qui montre la différence de vitesse d'exécution d'un programme entre une Arduino Nano et une STM32 :





 
 
 
 

Image(s) jointe(s)






Bonjour,
Merci pour cette description fort bien documentée.
Malgré tout, je rencontre quelques difficultés dans votre procédure...

- je n'ai pas accès au port (il est grisé dans l'IDE Arduino)
- à l'étape 6, le lien du fichier renvoie une erreur 404

J'arrive à téléverser via le ST-Link V2 sans problème, par contre dans ce mode (j'ignore si c'est lié), je ne peux pas utiliser le moniteur série car j'ai une erreur "La carte sur COM5 n'est pas disponible".
J'essaie donc d'installer le bootloader mais en vain..
J'ai essayé avec le "demonstrator gui (STM32 flasher)" mais également sans succès.
Je tente de faire fonctionner un TFT 3.5' 8 bits avec la STM32 mais jusqu'à maintenant c'est sans résultat..! Il fonctionne parfaitement avec la Mega.
Si vous pouvez m'éclairer..
Merci d'avance
Gérard
 

  • Signaler

Bonjour,
Merci pour cette description fort bien documentée.
Malgré tout, je rencontre quelques difficultés dans votre procédure...
- je n'ai pas accès au port (il est grisé dans l'IDE Arduino)
- à l'étape 6, le lien du fichier renvoie une erreur 404
J'arrive à téléverser via le ST-Link V2 sans problème, par contre dans ce mode (j'ignore si c'est lié), je ne peux pas utiliser le moniteur série car j'ai une erreur "La carte sur COM5 n'est pas disponible".
J'essaie donc d'installer le bootloader mais en vain..
J'ai essayé avec le "demonstrator gui (STM32 flasher)" mais également sans succès.
Je tente de faire fonctionner un TFT 3.5' 8 bits avec la STM32 mais jusqu'à maintenant c'est sans résultat..! Il fonctionne parfaitement avec la Mega.
Si vous pouvez m'éclairer..
Merci d'avance
Gérard

Bonjour,
-Il me semble qu'avec ces étapes, tant que le bootloader et les drivers ne sont pas installés, vous ne pouvez accéder au port Série par le micro USB. Concernant le ST-Link V2 je viens de regarder rapidement sur internet, certains disent qu'en fonction du modele du st link celui-ci ne fourni pas de communication série mais que le port micro usb de la carte devrait le faire.
-Pour le fichier manquant, je l'ai hébergé temporairement ici :
https://mega.nz/#!FW...4kk_9Tkz5RUfkkc
Ainsi que le dossier que j'ai mis dans hardware au cas où d'autres choses ai changé depuis :
https://mega.nz/#!dT...Svz4LHLYUybww84
Je précise que j'ai testé ce billet sur Windows 8.

  • Signaler

Ma photo

Progression

État du prochain billet :

5%

 

État du prochain chapitre de l'ouvrage:

85%

 

Rechercher dans le blog

utilisateur(s) actif(s)

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)

Derniers visiteurs

Derniers commentaires