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 :
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
Quelques liens :
Voici quelques sites où vous pourrez trouver des informations à propos de ces cartes :
- Wiki : http://wiki.stm32duino.com/index.php?title=Blue_Pill
- Pinout : http://reblag.dk/wordpress/wp-content/uploads/2016/07/The-Generic-STM32F103-Pinout-Diagram.pdf
- Site de ST : http://www.st.com/en/microcontrollers/stm32-32-bit-arm-cortex-mcus.html?querycriteria=productId=SC1169
- Projet à base de STM : https://www.hackster...ic-probe-e701d4
- Forum : http://www.stm32duino.com/
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)
Etape 2 : Modifiez l'emplacement de boot0 sur 1 et appuyez sur le bouton RESET :
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 COM3Si tout s'est bien passé, vous devriez obtenir ceci :
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 :
Etape 9 : Déconnectez le serial adapter et connectez la carte au PC via le port microUSB:
Etape 10 : Créez un sketch vide :
void setup() { } void loop() { }Puis entrez les paramètres de votre carte dans "Outils" :
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]
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]
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é :
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.
#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 :
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