jeudi 29 décembre 2022

STM32 BLUE PILL vs ARDUINO NANO

 


STM32 BLUE PILL vs ARDUINO NANO


Bonjour, aujourd'hui nous allons examiner de plus près la carte BLUE PILL, équipée d'un microcontrôleur STM32F103C8T6.

J'avais déjà parlé de cette carte ici :

STM32 et ARDUINO

A mon sens, la BLUE PILL est une carte très avantageuse par rapport à l'ARDUINO NANO.

Ce tableau décrit les possibilités du STM32F103C8T6 48 pins. D'autres modèles plus puissants intègrent plus de mémoire FLASH, plus de périphériques, etc.

FonctionARDUINO NANOBLUE PILL
Broches3040
Processeur8 bits32 bits
Alimentation du microcontrôleur5V2V - 3.6V
Horloge16MHz72MHz
Mémoire FLASH32Ko64Ko
Mémoire RAM2Ko20Ko
Mémoire EEPROM1Ko4Ko (1)
GPIOs22 (6 PWM)32 (15 PWM) (2)
UARTs13
I2C12
SPI12
CAN01
USB01
JTAG01
ADC1 ADC 10 bits2 ADC 12 bits

(1) l'EEPROM est émulée en mémoire FLASH, comme sur un ESP32.

(2) les GPIOs sont tolérantes au 5V, il n'y a donc pas lieu d'ajouter des protections particulières.

Les 20Ko de RAM sont un avantage certain. Lorsque je développe du logiciel sur une NANO, je suis plus souvent confronté à un manque d'espace en RAM (données) qu'à un manque d'espace en FLASH (programme).

Egalement, la présence de 3 UARTs dispense d'utiliser des objets du genre SoftwareSerial, peu performants, lorsque l'on désire intégrer des périphériques du genre modem, BlueTooth, DfPlayer.

Le prix de la BLUE PILL est sensiblement équivalent à celui de l'ARDUINO NANO sur AliExpress. C'est dire si j'envisage sérieusement de l'utiliser en lieu et place de l'ARDUINO NANO dans mes projets.

Nous allons tout d'abord étudier la carte, et surtout sa mise en oeuvre.

1. La librairie STM32DUINO

Si l'on veut travailler avec la même facilité qu'avec l'ARDUINO, il faut installer un gestionnaire de cartes supplémentaire, comme pour un ESP32. Pour cela, dans l'IDE ARDUINO, il faut ouvrir les préférences (menu Fichiers / Préférences) et ajouter l'URL suivante (URL de gestionnaire de cartes supplémentaires).

https://github.com/stm32duino/BoardManagerFiles/raw/master/package_stmicroelectronics_index.json

Si ce champ comporte déjà une ou plusieurs URLs, il faudra utiliser un séparateur, qui est la virgule.

2. Les connecteurs

2.1. Le connecteur USB

Ce connecteur est bien relié aux GPIOs PA11 et PA12, comme prévu dans la datasheet. On pourrait penser que l'on peut l'utiliser comme le port USB de l'ARDUINO NANO (chargement du code, moniteur série), mais il n'en est rien.

En effet, pour que l'USB soit utilisable pour le chargement du code, il faudrait qu'il soit initialisé par un bootloader. Or il n'y a pas de bootloader prévu pour cette carte. Le chargement est bien réalisé par un bootloader mais il est interne au microcontrôleur, et utilise l'UART1 (PA9 & PA10).

Certains ont cependant écrit un bootloader : https://how2electronics.com/stm32-bootloader-programming-usb/

2.2. UART1 : PA9 et PA10

Ces deux broches permettent le chargement du code. Il faut sélectionner les bonnes options dans le menu Outils :
  • Type de carte : Generic STM32F1 series
  • Board part number : BluePill F103C8
  • Upload Method : STM32CubeProgrammer (Serial)

Ensuite le raccordement de la carte est simple. Il requiert un convertisseur USB / Série : 

Il faut bien entendu utiliser un modèle de convertisseur adapté au 3.3V, comme celui-ci, qui est équipé d'un cavalier permettant de choisir entre 5V et 3.3V :

FT232RL 5V/3.3V

Remarque : si la carte est alimentée par le connecteur USB ou la broche 5V, le fil rouge est inutile.

Avant le chargement il faut déplacer le cavalier boot0 de la carte BLUE PILL sur 1. Avant chaque chargement du code il faudra appuyer sur le bouton RESET.

Si l'on veut que la carte démarre directement l'application, il faudra replacer le cavalier boot0 sur 0.

2.3. Le connecteur SWD

Le connecteur à 4 broches en bout de carte peut être relié à un boîtier ST-LINK, afin de charger le code : 




Le câblage se fait avec 4 fils seulement : 3.3V, GND, SWDIO, SWDCLK.

La vitesse de chargement est supérieure à celle de la liaison série, et il n'y a pas besoin d'appuyer sur le bouton RESET.

Il faut sélectionner les bonnes options dans le menu Outils :
  • Type de carte : Generic STM32F1 series
  • Board part number : BluePill F103C8
  • Upload Method : STM32CubeProgrammer (SWD)

Le boîtier ST-LINK a un autre avantage : il peut permettre de deboguer son application à l'aide d'un debugger, GDB par exemple.

2.3. Moniteur série

Que l'on utilise l'une ou l'autre méthode de chargement, le moniteur série (Serial) utilise l'UART1, donc PA9 et PA10. L'utilisation d'un boîtier ST-LINK ne dispense donc pas de l'achat d'un convertisseur USB / Série si l'on veut afficher des informations sur le moniteur série.

2.4. Alimentation

La carte peut être alimentée de plusieurs manières : 

  • par le connecteur USB, en 5V. La broche 5V, dans ce cas, fournira cette même tension
  • par la broche 5V de la carte
  • par la broche 3.3V de la carte
  • par le convertisseur USB / série. On connectera la broche VCC à la broche 3.3V de la carte
  • par le boîtier ST-LINK. On connectera la broche VCC à la broche 3.3V de la carte

Si la carte est alimentée par l'USB ou la broche 5V, le 3.3V nécessaire au STM32 est fourni par un régulateur RICHTEK RT9193, un bon régulateur LDO, capable de fournie 300mA. Son courant de repos est de 90µA.

Contrairement à une carte ARDUINO il n'y a aucune protection par diode entre le 5V USB et la broche 5V. Cela veut dire que si l'on alimente la carte par la broche 5V, et que l'USB est branché, le 5V de la carte est directement relié au 5V USB. Il peut y avoir danger si les deux tensions sont vraiment différentes.

3. L'ADC

Par rapport à l'ADC de l'ARDUINO, celui de la BLUE-PILL est assez différent :

  • la tension de référence est de 3.3V, la tension d'alimentation du microcontrôleur
  • la résolution est supérieure : 12 bits, donc 4096 points, au lieu de 1024
  • le temps d'échantillonnage est nettement inférieur
  • la broche AREF n'existe pas, sauf sur de plus grosses cartes

3.1. Résolution

La résolution d'un ATMEGA328P est de 10 bits, contre 12 bits pour le STM32, ce qui produira des mesures 4 fois plus précises.

3.2. Temps d'échantillonnage

Le temps d'échantillonnage du STM32 est largement inférieur à celui d'un ATMEGA328P :
  • 740000 samples/s au maximum pour le STM32F401, assez proche du STM32F103C8T6
  • 38470 samples/s pour l'ATMEGA 328P en poussant l'horloge de l'ADC au maximum
On constate aisément que la vitesse d'acquisition sera nettement supérieure avec un STM32.

4. Exercice

Je propose de construire un petit voltmètre, équipé d'un afficheur 4 digits à 7 segments du genre TM1637.

4.1. Schéma

Le schéma est réalisé à l'aide de KICAD :

Le montage est alimenté par le connecteur USB, car le TM1637 a besoin de 5V pour pouvoir fonctionner.

Le chargement du code peut se faire via le connecteur SERIAL ou par le connecteur SWD en bout de carte.

L'entrée à mesurer peut recevoir une tension variable entre 0V et 3.3V (un simple potentiomètre suffit).

Si l'on désire mesurer des tensions plus importantes, il suffit d'utiliser un pont diviseur à résistances :

U2 = U * R2 / (R2+R1)

4.2. L'IDE ARDUINO

Il faut bien entendu installer le package STM32DUINO, si ce n'est pas déjà fait.

Ensuite il faudra installer la librairie suivante :

TM1637 : https://github.com/RobTillaart/TM1637_RT

Celle-ci est installable depuis l'IDE ARDUINO.

Pour récupérer le projet voir plus bas :  4.3. Téléchargements.

4.3. Le code

Le code ressemble beaucoup à ce que l'on pourrait écrire si la carte était une NANO, aux définitions des GPIOs près : 

bluepill-voltmeter.ino

Le croquis utilise 21332 octets (32%) de l'espace de stockage de programmes. Le maximum est de 65536 octets.

Les variables globales utilisent 852 octets (4%) de mémoire dynamique, ce qui laisse 19628 octets pour les variables locales. Le maximum est de 20480 octets.

Comme on peut le constater, le code occupe un espace bien supérieur au même code compilé pour l'ARDUINO NANO : 

Le croquis utilise 4896 octets (15%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.

Les variables globales utilisent 331 octets (16%) de mémoire dynamique, ce qui laisse 1717 octets pour les variables locales. Le maximum est de 2048 octets.

Ceci est dû au fait que le STM32F103C8T6 est un microcontrôleur 32 bits, mais probablement aussi à la librairie STM32DUINO.

Mais, qu'il s'agisse de mémoire FLASH ou RAM, la quantité restante est supérieure à celle qu'offre la NANO : 

  • FLASH : 44204 octets
  • RAM : 19628 octets
Nous serons donc beaucoup plus à l'aise pour développer de grosses applications, ou utiliser des librairies de taille conséquente.

4.4. Téléchargements

Pour télécharger le projet : https://bitbucket.org/henri_bachetti/bluepill-voltmeter.git

Cette page donne toutes les informations nécessaires :

https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html

5. Photos


En haut : le convertisseur USB / Série.

A gauche : la BLUE PILL.

A droite : L'afficheur TM1637.

Au milieu : le petit potentiomètre bleu permettant d'ajuster la tension à mesurer.

Le multimètre affiche 3.034V, alors que le montage affiche 3.014V.

Ceci est dû au fait que je n'ai pas mesuré la tension de 3.3V produite par la carte. Or elle vaut 3.33V, contre 3.31V dans le code. En corrigeant cette petite erreur, tout rentre dans l'ordre.

A ce sujet, il faut rappeler que le STM32F103C8T6 possède bien une broche AVDD, permettant de fixer la tension de référence analogique. Mais sur la BLUE PILL, cette broche est reliée au 3.3V. Pour faire des mesures précises, il convient donc de mesurer cette tension avec un multimètre suffisamment précis.

6. Conclusion

Ces cartes, une fois bien prises en main, ont un potentiel comparable à celui de l'ARDUINO NANO, et même largement supérieur si l'on veut profiter des possibilités supplémentaires : 

  • grande quantité de mémoire
  • plusieurs liaisons série
  • double bus I2C, SPI
  • etc.


Cordialement

Henri


Aucun commentaire:

Enregistrer un commentaire