Programmer un STM32F103C8

Bonjour à toutes et à tous,

Pour m’amuser, je me suis commandé un circuit à base de STM32.
J’ai trouvé ce site indiquant une méthode pour le programmer.

On me demande de télécharger cette archive, et une fois décompressée, de lancer le fichier “install_drivers”.

C’est là que mes ennuis commencent : je suis sous Windows XP et, quand je lance ce fichier, mon PC me dit que ce programme n’est pas une application Win32 valide …

Je pense que c’est un problème d’archive valide pour cet environnement et si tel est le cas, je ne sais pas comment trouver la bonne archive.

Peut-être avez-vous des liens avec une méthode qui marcherait dans mon cas.

Je me sens un peu (beaucoup) comme un gros nul sur ce coup. Si vous avez des idées pour m’aider …

Merci d’avance.

Pierre

Bonjour,
as-tu utilisé “install_drivers.bat” dans “driver/win/”?
Essai d’exécuter “install_xXX.exe” dans “driver/win/win_xp_legacy/maple-xxx/” en mode Administrateur

Ce que tu veux faire c'est programmer un STM32 comme un arduino.
Il y a un site" stmduino", initié sur ce forum par Roger Clark ,site devenu indépendant maintenant, qui "porte" les fonctions arduino sur différents modèles de micro STM32 dont le F103C8T6. Ce site fourni aussi les booloaders.

De la même façon qu'au départ un micro avr se programme sans bootloader en utilisant le bus ISP, un micro d'architecture ARM se programme aussi sans bootloader avec le bus SWD.

Avec les micro ST il faut un ST-Link.
St-link c'est deux choses :

  1. le programmeur physique sous forme de "bâtonnet"
  2. un logiciel.

Sous windows le logiciel existe sous forme déjà compilée. Si Windows te dit que le logiciel n'est pas validé c'est tout simplement que ST refuse d'engraisser Microsoft pour des âneries.

Sous Linux j'utilise le logiciel ST-Link en ligne de commande pour transférer le programme dans le microcontrôleur.
Je pense que sous Windows un utilitaire graphique existe.

Autre solution les cartes Nucleo.
Une carte nucleo (entre 15 et 25€) comprend deux parties séparées par un pointillé comme pour le papier ***** et les pointillés ont le même rôle : découper selon le pointillé.
Voir la doc des cartes nucleo sur le site de ST.

  1. la partie principale est la carte micro elle même.
  2. la partie sécable est un programmeur ST-Link qui se connecte sur l'USB d'un coté et de l'autre fourni un connecteur aveci GND, 3,3V, SCK, SDIO.

L'USB du micro du programmeur est reconnue par l'OS comme un disque mémoire.
Le chargement du programme se fait par glisser/déposer du fichier HEX.

J'obtiens le fichier HEX en utilisant le projet MBed --> même principe qu'arduino mais sans le foutoir arduino, il faut dire qu'Mbed est plus professionnel.
Tu y trouvera un forum, mais loin d'être aussi convivial qu'ici.
Si des versions existent en espagnol et quelques autres langues il n'en existe pas encore en français.
Le projet est très riche en diverses bibliothèques. os.mbed.com/components/

L'API est géré en couche

  1. la couche ARM
  2. la couche fabricant (Atmel, NXP, ST, etc)
  3. par fabricant la couche référence du micro

Dans la série F103xxxxxx St n'a créé un configurateur que pour le modèle F103RBT6 qui contient 128k de flash au lieu de 64 pour le F103 C8T6.
Un intervenant à créé un modèle adapté au 64k du F103C8T6.
https://os.mbed.com/users/hudakz/code/STM32F103C8T6_Hello/

Une autre carte dite "Mapple" utilise le F103RBT6, elle est très légèrement plus chère.

La programmation sous Mbed se fait dans les nuages, pour ceux qui sont allergique au travail en ligne il est possible de créer sa proche chaine de compilation avec eclipse ou équivalent, je dois avouer que je n'ai pas bien compris.

MBed met à ta disposition un compte personnel mercurial, équivalent de github, qui peut être privé ou public.
Le lien précédent pointe dans la partie publique du créateur du modèle.

L'API Mbed même si elle me parait plus aboutie que celle arduino (derrière il y a les ingénieurs logiciel ARM, NXP, ST-Micro, Renesas, etc) reste assez générale et pour un projet "aux petits oignons" il faudra en sortir comme pour arduino.

Avantage du F103 : C'est un ARM, 32 bits, Fmax = 72 MHz, son prix et ses 50 à 60 % d'entrées 5V tolérantes qui évitent l'usage d'adaptation de niveaux.
Inconvénient : C'est aussi un ARM --> difficile de savoir s'il est gravé à 18 ou 24 ou X nm mais il est surement gravé plus fin qu'un avr de Fmax seulement 20MHz. --> il est donc plus fragile --> j'ai testé et je confirme.
A moins de 2€ ce n'est pas un problème financier, c'est juste frustrant de "péter" une sortie.

Scoob:
Bonjour,
as-tu utilisé "install_drivers.bat" dans "driver/win/"?
Essai d’exécuter "install_xXX.exe" dans "driver/win/win_xp_legacy/maple-xxx/" en mode Administrateur

J'ai essayé avec tous les fichiers *.exe du répertoire"driver/win" : chacun m'indique qu'il n'est pas un fichier win32 valide.

Cordialement.

Pierre

Merci "68tjs" pour tout le mal que tu t'es donné pour toutes ces explications. Je ne souhaite pas me disperser avec diverses applications.

J'ai trouvé cette application (Flash Loader Demonstrator) pour, à ce que je crois, charge le bootloader dans mon STM32F103C8T6P1.

J'ai eu les écrans de cette page et j'ai obtenu au final "Download operation finished succesfully".

J'ai aussi mis à jour mon IDE à la version 1.8.5 ce qui fait que si je compile un sketch avec ma carte STM32F103C8T6P1 comme destination, cela se passe bien.

Pour autant, lorsque je connecte ma carte à mon PC (windows XP) via le µUSB, l'IDE ne trouve pas le port COM9 que l'application Flash Loader Demonstrator a utilisé.

Et donc, je suis bloqué, je ne sais plus trop quoi faire.

Si vous avez des idées.

Cordialement.

Pierre

Bonjour,

Faites le saut chez Cypress !

Ce fabricant m'a définitivement convaincu de ne plus utiliser de microcontrôleur ST, Microchip est du genre.

Ils sont difficiles à mettre en oeuvre, il faut constamment se taper une datasheet d'une centaines de pages et puis après avoir passé 5 minutes à trouver LA page il vous faut encore 10 minutes pour la déchiffrée.

Tu compile après avoir utilisé 10 soft différents et beh non tu t'es trompé de macro et rebelote !

Je ne souhaite pas me disperser avec diverses applications.

Je comprend mais la solution dont je parles est directement gérée par ARM et ST-Micro.
Ces gens là ne cherchent pas à vendre des cartes.
ST cherche à vendre des boîtiers micro contrôleur, peut importe qui les lui achète, ARM cherche à ce que ses clients (ST, NXP, etc) vendent le maximum de boîtiers pour pouvoir toucher le maximum de dividendes des licences.

Est-ce que les solutions dont tu parles ont le même niveau d'implication dans la durée ?

Ces autres solutions dépendent souvent d'une personne. Que ce passe-t-il si les circonstances de la vie font que cette personne n'a plus de temps disponible ( généralement mise en couple , un ou deux enfants et plus une minute à soi).

Une question : est-ce que ce programme place le bootloader dans le micro-contrôleur ?

Je ne peux pas te le dire c'est un programme Windows et moi je ne connais pas Windows.
J'ai choisi de me dispenser d'utiliser un bootloader qui n'est aucunement une imposition.

68tjs:
… J’ai choisi de me dispenser d’utiliser un bootloader qui n’est aucunement une imposition.

Si j’ai bien compris, tu utilises ST-Link : le matériel (je m’en suis commandé un hier en prévoyance des problèmes à venir) et le logiciel.

C’est via cet ensemble que tu programmes le STM32 sans avoir besoin d’un bootloader ?

Cordialement.

Pierre

pepe:
... D'après tous les commentaires que j'ai pu lire, la mise en œuvre de la liaison USB sur ce type de carte n'est pas une sinécure. ...

Merci pour ces informations.

Ce que je ne comprends pas est que l'application ST reconnait bien mon micro puisqu'il y charge le bootloader, mais après, quand je branche mon micro au PC via la liaison µUSB, l'IDE Arduino ne le trouve pas ? Est-ce que c'est un problème de driver spécial que je n'aurais pas installé ?

Cordialement.

Pierre

Salut

Dans l'archive dont tu parles, je suppose que les drivers que tu ne parviens pas à installer sont ceux permettant de dialoguer sur le port USB de la carte, et donc de dialoguer avec ton IDE ARDUINO.
Que tu ne puisses pas les installer est assez bloquant, car même si tu parviens à installer le bootloader ARDUINO par le convertisseur série, tu ne pourras pas aller plus loin.

Ton premier lien décrit une méthode de chargement par la ligne série du STM32. Côté PC, le logiciel stm32flash.exe te permet d'envoyer le binaire au bootloader du STM32. Je parle bien du bootloader interne du STM32 (hard-coded).
Dans cette première étape, tu as besoin d'un convertisseur série et des drivers Windows adaptés au convertisseur série que tu possèdes.
Suis simplement la méthode décrite dans ton premier post. Si tu as déjà utilisé un convertisseur série sous Windows, tes drivers sont déjà installés. Dans le cas contraire, installes ceux qui correspondent au convertisseur série que tu utilises (CH340, FTDI, etc.).

Donc pour résumer, tu peux parfaitement charger le booloader ARDUINO, mais en l'absence de drivers ST installables sur ton Windows, tu ne pourras pas aller plus loin, c'est à dire charger ton sketch.

SOLUTION: mettre Windows XP à la poubelle. Remplacer par Windows 7 minimum, ou mieux : LINUX.
Si ton PC est un P4, il supportera éventuellement une LUBUNTU.

XP à notre époque ... on croit rêver.

@+

Ce que je ne comprends pas est que l'application ST reconnait bien mon micro puisqu'il y charge le bootloader, mais après, quand je branche mon micro au PC via la liaison µUSB, l'IDE Arduino ne le trouve pas ? Est-ce que c'est un problème de driver spécial que je n'aurais pas installé ?

Tout à fait, le driver livré dans l'archive, celui que tu ne parviens pas à installer.
Comme tu peux le constater ICI, le stm32f103c8 possède un port USB. Je parle du processeur lui-même, pas seulement de la carte.
D'après ce que je comprends, tu as donc déjà chargé le bootloader ARDUINO par le convertisseur série ?
Pas besoin de ST-LINK donc.

@+

Finalement, les drivers que je n'arrivais pas à installer pour cause de pas "windows32 compatible", j'ai réussi à les installer via le panneau de configuration. Mon IDE Arduino voit bien mon STM32 sur COM16 (Maple mini).

Pour autant, je n'arrive pas à télécharger un sketch. Si je me mets en mode upload : "serial", j'obtiens :

stm32flash 0.4

http://stm32flash.googlecode.com/

Failed to init device.
Using Parser : Raw BINARY
Interface serial_w32: 115200 8E1

Si je me mets en mode upload : "STM32duino bootloader", j'obtiens :

maple_loader v0.1
Resetting to bootloader via DTR pulse
Reset via USB Serial Failed! Did you select the right serial port?
Assuming the board is in perpetual bootloader mode and continuing to attempt dfu programming...

Searching for DFU device [1EAF:0003]...
dfu-util - (C) 2007-2008 by OpenMoko Inc.
This program is Free Software and has ABSOLUTELY NO WARRANTY


Couldn't find the DFU device: [1EAF:0003]

hbachetti:
... XP à notre époque ... on croit rêver. ...

Est-ce que le problème vient bien de Windows XP ? Quand j'entends les problèmes qu'ont pas mal de personnes avec des versions plus récentes de Windows, je me dis que je suis relativement pénard avec mon XP. :wink:

Si vous avez des idées ...

Cordialement.

Pierre

Il existe maintenant une bibliothèque MBed F103C8T6 qui gère l'USB.
Je ne l'ai pas testé.

Quand j'ai besoin de faire des sorties par l'interface série je passe par un adaptateur USB/UART.
Le STM32 ayant une interface UART 5V tolérant l'opération est simple.

Cette solution n'est pas glorieuse mais elle fonctionne.
La solution module USB/Uart externe convient parfaitement a mon besoin qui est de tracer des informations de mise au point.
Il faut aussi se rappeler que la carte Léonardo dont le micro possède aussi une USB incorporée n'est pas d'un abord facile non plus. elle n'a pas eu un grand succès.

On lit que le "stick" ST-Link permet de faire du débogage avec OpenOCD.

ChPr:
Finalement, les drivers que je n'arrivais pas à installer pour cause de pas "windows32 compatible", j'ai réussi à les installer via le panneau de configuration. Mon IDE Arduino voit bien mon STM32 sur COM16 (Maple mini).

bonsoir Chpr
Il s'agit d'un module comme celui-là ?

Perso ,
Je n'ai pas vraiment approfondi , mais à part l’utiliser au travers d"un FTDI , je n'ai jamais "encore" reussi à uploader au travers d'un bootloader reconnu par l"IDE ARDUINO"

Oui, Artouste, c’est bien ce type de module que j’ai. J’ai bien réussi à charger le bootloader dans ce circuit, mais maintenant, je suis bloqué car, bien que l’IDE voit mon port COM, le téléversement ne fonctionne pas via le µUSB.

Si ce que tu appelles FTDI est le circuit en photo ci-joint, comment t’en sers-tu (connexions et logiciel) pour téléverser un sketch sur le STM32 ?

Cordialement.

Pierre

ChPr:
Oui, Artouste, c'est bien ce type de module que j'ai. J'ai bien réussi à charger le bootloader dans ce circuit, mais maintenant, je suis bloqué car, bien que l'IDE voit mon port COM, le téléversement ne fonctionne pas via le µUSB.

J'ai utilisé un module "FTDI" comme celui ci

Je regarderais "mes notes" demain

Salut.
Dans la vie professionnelle je suis développeur embarqué surtout ARM7, CORTEX et STM32 en tous genres.

ChPr tu as vraiment un bol monstre. J'ai une carte STM32F103C8T6 !!!

Donc je me suis mis à l'ouvrage tôt ce matin et voici le résultat.

J'ai essayé de programmer le bootloader generic_boot20_pc13.bin avec stm32flash

Wrote address 0x08008b00 (99.47%) Error: WRITE address and length must be 4 byte aligned
Failed to write memory at address 0x08008b00

Mal barré :confused:

Deuxième méthode : uploader avec le convertisseur série
Le convertisseur est branché comme indiqué sur la page de ton lien.
3V3 : 3,3
GND : GND (noté G sur la carte)
RX : A10
TX : A9
#### EDIT : il faut inverser RX et TX ####
Le cavalier BOOT0 sur 1, comme sur la photo.

Un petit sketch :

#define LED PA0

void setup() { 
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(1000);
  digitalWrite(LED, LOW);
  delay(1000);
  Serial.println("OK");
}

Dans l'IDE ARDUINO je choisi Outils/Upload method : Serial
J'appuie sur le bouton RESET.
Je clique sur téléverser.

stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 230400 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory

Wrote address 0x08000100 (3.30%) 
Wrote address 0x08000200 (6.61%) 
Wrote address 0x08000300 (9.91%) 
Wrote address 0x08000400 (13.22%) 
Wrote address 0x08000500 (16.52%) 
Wrote address 0x08000600 (19.82%) 
Wrote address 0x08000700 (23.13%) 
Wrote address 0x08000800 (26.43%) 
Wrote address 0x08000900 (29.74%) 
Wrote address 0x08000a00 (33.04%) 
Wrote address 0x08000b00 (36.34%) 
Wrote address 0x08000c00 (39.65%) 
Wrote address 0x08000d00 (42.95%) 
Wrote address 0x08000e00 (46.26%) 
Wrote address 0x08000f00 (49.56%) 
Wrote address 0x08001000 (52.87%) 
Wrote address 0x08001100 (56.17%) 
Wrote address 0x08001200 (59.47%) 
Wrote address 0x08001300 (62.78%) 
Wrote address 0x08001400 (66.08%) 
Wrote address 0x08001500 (69.39%) 
Wrote address 0x08001600 (72.69%) 
Wrote address 0x08001700 (75.99%) 
Wrote address 0x08001800 (79.30%) 
Wrote address 0x08001900 (82.60%) 
Wrote address 0x08001a00 (85.91%) 
Wrote address 0x08001b00 (89.21%) 
Wrote address 0x08001c00 (92.51%) 
Wrote address 0x08001d00 (95.82%) 
Wrote address 0x08001e00 (99.12%) 
Wrote address 0x08001e44 (100.00%) Done.

Starting execution at address 0x08000000... done.

LA LED CLIGNOTE :slight_smile:

Bon ça marche. J'aurais tout de même préféré faire l'upload par l'USB.
Le terminal fonctionne aussi.

Pendant le développement de l'application il est possible de laisser le cavalier BOOT0 sur 1 et téléverser / exécuter dans la foulée.
Avec BOOT0 sur 1, le STM32 démarre son propre booloader. Il attend les caractères sur sa ligne série, écrit ce qui arrive en FLASH et lance l'application.
Par contre pour la version finale, il faudra remettre le cavalier sur 0. Dans ce cas, le STM32 démarre directement l'application.

Conclusion : sans le bootloader ARDUINO, ça roule. L'application est écrite en FLASH à l'adresse où devrait se situer celui-ci.
Certains développeurs se passent fort bien du bootloader sur leurs cartes ARDUINO. Ils chargent leur application avec un boîtier AVRISP ou USBasp, etc. Cela permet d'économiser l'espace occupé par le bootloader.

Ce qu'il faut bien comprendre, c'est que sur un STM32, il y a déjà un bootloader, celui de ST MICROELECTRONICS. Celui-ci est même capable de charger une application par I2C et SPI !!!
Le bootloader ARDUINO, on peut parfaitement s'en passer.

ChPr si tu as réussi à charger un bootloader ARDUINO dans le STM32, il n'y a aucune raison que tu ne puisses pas charger ton sketch à la place par le même moyen. Tu utilises le même convertisseur série, l'IDE ARDUINO en choisissant Outils/Upload method : Serial et ça va rouler.

Concernant le développement STM32 en général, on peut objecter que l'on peut développer avec les librairies ST. Franchement pas terrible. Il y a aussi MBED, bien mieux.
Dans ce cas, on utilise un compilateur GCC ou ARM et l'utilisation d'un ST-LINK ou JLINK permet en plus du chargement en FLASH ... de profiter du DEBUGGER, gdb ou autre. Les IDE KEIL ou à base d'ECLIPSE permettent de travailler bien plus confortablement qu'avec l'IDE ARDUINO.

Mais dans ce cas, on ne bénéficie pas de toutes les bibliothèques ARDUINO et c'est franchement dommage.

L'intérêt de cette manip est de bénéficier de la puissance de feu extraordinaire des STM32 en développant des applications comme sur un ARDUINO, avec le capital fantastique des librairies ARDUINO.

Prochaine manip : essayer cette petite carte STM32F407VET6
Support NRF24L01 embarqué, pile pour le RTC et plein de bonnes choses.

J'espère vous avoir aidé. J'ai commencé à 4H du mat. Bonne nuit, je vais me recoucher.
@+

hbachetti:
... ChPr tu as vraiment un bol monstre. J'ai une carte STM32F103C8T6 !!!

Donc je me suis mis à l'ouvrage tôt ce matin et voici le résultat. ...

Là, j'avoue que c'est vrai :sunglasses: Je vais t-être reconnaissant de ta nuit blanche partielle

hbachetti:
... Deuxième méthode : uploader avec le convertisseur série
Le convertisseur est branché comme indiqué sur la page de ton lien.
3V3 : 3,3
GND : GND (noté G sur la carte)
RX : A10
TX : A9
Le cavalier BOOT0 sur 1, comme sur la photo.

Je ne sais pas comment tu as fait, mais les connexions RX et TX qui fonctionnent chez moi sont inverses de ce que donne ce lien. Voir celui-ci.

hbachetti:
Un petit sketch :
...

Dans l'IDE ARDUINO je choisi Outils/Upload method : Serial
J'appuie sur le bouton RESET.
Je clique sur téléverser
...
LA LED CLIGNOTE :slight_smile:

Bon ça marche. J'aurais tout de même préféré faire l'upload par l'USB.
Le terminal fonctionne aussi.

Chez moi, cela fonctionne aussi ainsi que le terminal : super :sunglasses:

hbachetti:
... J'aurais tout de même préféré faire l'upload par l'USB. ...

Moi aussi, c'est ce que je visais. Mais apparemment, ça ne veut pas le faire.

hbachetti:
... J'aurais tout de même préféré faire l'upload par l'USB.

Pendant le développement de l'application il est possible de laisser le cavalier BOOT0 sur 1 et téléverser / exécuter dans la foulée.
Avec BOOT0 sur 1, le STM32 démarre son propre booloader. Il attend les caractères sur sa ligne série, écrit ce qui arrive en FLASH et lance l'application.
Par contre pour la version finale, il faudra remettre le cavalier sur 0. Dans ce cas, le STM32 démarre directement l'application. ...

Effectivement, pour que le sketch tourne en autonome, après avoir débranché et rebranché le module, il faut replacer le cavalier BOOT en 0.

hbachetti:
... ChPr si tu as réussi à charger un bootloader ARDUINO dans le STM32, il n'y a aucune raison que tu ne puisses pas charger ton sketch à la place par le même moyen. Tu utilises le même convertisseur série, l'IDE ARDUINO en choisissant Outils/Upload method : Serial et ça va rouler. ...

Oui, ça a roulé, et je t'en remercie beaucoup.

Pour autant, j'aimerais bien comprendre pourquoi cela ne veut pas fonctionner avec le port µUSB, comme je l'ai expliqué plus haut.

Cordialement.

Pierre