Skyduino:~#
Articles
programmation, stm32, tutoriel

[STM32F4] Exemple bouton + led avec CoIDE

Bonjour tout le monde !

Aujourd’hui je vous propose un exemple simple (mais complet) de configuration de projet, pour compiler des programmes sur une carte « STM32F4 discovery » avec le logiciel CoIDE (de coocox).

Remarque : la version que j’utilise actuellement de CoIDE est la 1.4.2 (il ce peut qu’il y ai des changements dans les versions qui viendrons plus tard).

Étape 1, installation :

Pour programmer sur une carte STM32F4 discovery, il vous faut avoir les éléments de base de tout bon développeur :
– CoIDE (logiciel dérivé de eclipse), qui permet de coder tranquillement sur plateforme ARM :
http://www.coocox.org/CooCox_CoIDE.htm

– Yagarto, la toolchain complète avec compilateur C/C++ pour ARM Cortex :
http://www.yagarto.de/

– Les drivers ST-Link (onglet « design support », en bas de page) :
http://www.st.com/internet/evalboard/product/219866.jsp

– Le kit de développement officiel de ST :
http://www.st.com/internet/evalboard/product/252419.jsp

Je vous passe la phase d’installation de coIde, des drivers, de yagarto, etc … vous savez faire « suivant, suivant, suivant, … » tout seul 😉

Une fois CoIDE installait il faudra lui donner le chemin du répertoire contenant le compilateur, pour ce faire ouvrez CoIde, puis dans « project » -> « Set toolchain location » -> chemin vers le dossier d’installation de yagarto.

Étape 2, création d’un nouveau projet :

« project » -> « New » -> un nom : « stm32f4_blink_bp » (par exemple)
Important : Changez le chemin du workspace vers un dossier dont vous avez les droits en lecture / écriture (exemple « Mes documents »).

Ensuite dans les choix du « repository » :
Onglet « manufacters » : ST
Onglet « chip » : STM32F407VG
Onglet « components » : « CMSIS BOOT » (« M4 CMSIS CORE » devrait ce cocher automatiquement)

Étape 3, ajout des fichiers sources :

Plusieurs choix sont possible :
– mode féniasse : prendre l’archive toute prête que je vous ai laissé ici :
https://dl.dropbox.com/u/53604363/Blink_bp_stm32f4.zip

– mode DIY : suivre les instructions suivante :
1) Copiez le dossier « STM32F4xx_StdPeriph_Driver » du kit de développement de ST dans le dossier du projet
2) Dans la configuration du projet (« project » -> « configuration »)
– Include Path : ajoutez le sous dossier « inc » du dossier « STM32F4xx_StdPeriph_Driver » à la liste
– Define symbols : ajoutez USE_STDPERIPH_DRIVER et STM32F4XX à la liste
3) Dans la hiérarchie des fichiers du projet, dans le dossier « STM32F4xx_StdPeriph_Driver »:
– dans le sous dossier « inc » : sélectionnez tout les fichiers sauf misc.h, STM32F4xx_rcc.h et STM32F4xx_gpio.h
–> puis faire click droit « Exclude from build »
– dans le sous dossier « src » : sélectionnez tout les fichiers sauf misc.c, STM32F4xx_rcc.c et STM32F4xx_gpio.c
–> puis faire click droit « Exclude from build »

Ensuite éditez le fichier main.c avec le code suivant :

/* Define permettant d'utiliser le kit de dév de ST */
//#define USE_STDPERIPH_DRIVER
//#define STM32F4XX

/* Includes */
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

/* Prototypes des fonctions */
inline void Delay(__IO uint32_t nCount);

/* Point d'entrée du programme */
int main(void) {

	/* Structure permettant de stocker la configuration d'une ou plusieurs broches */
	GPIO_InitTypeDef GPIO_InitStructure;

	/* Mise en marche des horloge gérant les ports D (led) et A (bouton) */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // Led
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // Button

	/* Configuration de LED3, LED4, LED5, LED6 en sortie de type "pushpull" (mode classique) */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; // LED3, LED4, LED5, LED6
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Broches en sortie
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Mode PushPull
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // Fréquence de commutation maximum
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Pas de résistance de pull-up / pull-down
	GPIO_Init(GPIOD, &GPIO_InitStructure);

	/* Configuration du bouton "User" en entrée de type "pushpull" (mode classique) */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // Bouton "User"
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;// Broches en entrée
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Mode PushPull
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // Fréquence de commutation maximum
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Pas de résistance de pull-up / pull-down
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* Variable gérant le "spinner" */
	unsigned char spin = 1;

	/* Boucle infini */
	for (;;) {

		/* Lecture de l'état du bouton, si appuyé on entre dans le if */
		if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) {

			/* "Ecrit" les états des led en fonction du spinner (4 bits) */
			GPIO_WriteBit(GPIOD, GPIO_Pin_12, (spin & 1) ? 1 : 0); // LSB
			GPIO_WriteBit(GPIOD, GPIO_Pin_13, (spin & 2) ? 1 : 0); // 
			GPIO_WriteBit(GPIOD, GPIO_Pin_14, (spin & 4) ? 1 : 0); // 
			GPIO_WriteBit(GPIOD, GPIO_Pin_15, (spin & 8) ? 1 : 0); // MSB

			/* Delai (~1sec en gros) */
			Delay(0x3FFFFF);

			/* Rotation du "spinner" d'un cran */
			spin = (spin << 1) & 0x0f;
			
			/* Si le "spinner" a dépassé la valeur max : retour au début */
			if (spin == 0)
				spin = 1;
		}
	}
}

/* Fonction de delai (trés grossiére) */
void Delay(__IO uint32_t nCount) {
	while (nCount--)
		;
}

Étape 4, patch du « CORE CMSIS » :

Dans le fichier cmsis_boot/startup/startup_stm32f4xx.c :
– décommentez la ligne (vers le début du fichier) :

extern void SystemInit(void);    /*!< Setup the microcontroller system(CMSIS) */

– ajoutez cette ligne avant l’appel de la fonction main() :

SystemInit();

Étape 5, compilation :

Dans le menu « project » cliquez sur « Build », ou dans la barre d’outil cliquez le petit icône avec deux flèches bleu ver le bas.

Si aucune erreur ne surviens il devrait s’afficher : « BUILD SUCCESSFULL » dans la console.

Étape 6, programmation :

Note : Je peut débugger le programme en ram sans probléme, mais pour une raison inconnu il m’est impossible de debugger en flash … j’ai une erreur java de pointeur null …

Donc pour ceux qui voudraient (ou seraient obliger comme moi) programmer leur carte sans passer par le bouton « flash programm » de CoIDE :
1) Ouvrez « St link utility » (présent dans le dossier d’installation des drivers St link)
2) Ouvrez le fichier leNomDeVotreProjet.bin se trouvant dans le dossier Debug/bin du projet
3) Quand le logiciel vous demande si vous voulez programmer la carte faite « Yes »
4) Cliquez sur « Programm » et patientez
5) Ouvrez le menu « Target » -> « MCU core » puis faite « Halt » suivit de « Core Reset »
5) L’état du cpu devrait être passer en « Running » et l’appui sur le bouton de la carte devrait lancer l’effet de rotation des led.

Enjoy 🙂

Discussion

15 réflexions sur “[STM32F4] Exemple bouton + led avec CoIDE

  1. j’ai trouvé un erreur de compilation Warning[Pe188]: enumerated type mixed with another type .

    Publié par fatma | 16 juillet 2012, 12 h 56 min
    • >> j’ai trouvé un erreur de compilation Warning[Pe188]: enumerated type mixed with another type .

      C’est pas une erreur, c’est un warning, ça n’as pas d’incidence sur la compilation en elle même.
      Le code a été 100% testé, il ne devrait même pas y avoir de warning, regarde ce que dit le compilateur avant et aprés ce warning 😉

      Publié par skywodd | 16 juillet 2012, 14 h 35 min
  2. Salut Skywood!

    Ce qui ne me paraît pas très clair, là, c’est que outre l’étape 1 qui n’est à faire qu’une fois pour toute, il faut se taper tout ça juste pour envoyer un si petit code dans la bestiole? Si on programme un truc, est-ce que ça veut dire que juste pour changer un caractère du code, ça prend 10 minutes pour re-uploader le prog dans la carte? J’en demande certainement beaucoup, mais n’y-a-t’il pas une façon d’écrire un code dans une fenêtre avec un simple bouton qui compile et envoie le tout dans le µP d’un seul coup (un peu à la méthode arduino…)? Je me pencherais bien sur ce SMT32, mais là, avec ce que je viens de lire, ça ne me motive pas trop…

    Cinci

    Publié par Cinci | 23 septembre 2012, 15 h 23 min
    • >> il faut se taper tout ça juste pour envoyer un si petit code dans la bestiole?

      Depuis CoIDE 1.5.0 les STM32F4 sont supporté par le « repository » il suffit donc désormais de cocher les cases qui vont bien dans le menu pour inclure les fichiers des différents drivers.

      De même le debuggeur ST-Link a été documenté par ST, CoIDE le supporte de base désormais pour le debug/flash (plus besoin de l’outil ST-Link utility »)

      >> Si on programme un truc, est-ce que ça veut dire que juste pour changer un caractère du code, ça prend 10 minutes pour re-uploader le prog dans la carte?

      Une fois le projet créée et le code écrit il suffit de (re)faire build âpres chaque modif, ce qui prend moins d’une seconde 😉

      Pour la partie programmation, maintenant que St-Link est supporté par le debuggeur intégré il suffit de cliquer sur le bouton debug pour lancer la programmation.

      >> J’en demande certainement beaucoup, mais n’y-a-t’il pas une façon d’écrire un code dans une fenêtre avec un simple bouton qui compile et envoie le tout dans le µP d’un seul coup (un peu à la méthode arduino…)?

      Regarde du côté de Leaflabs, ils sont en train de porter leur ide dérivé d’arduino pour les STM32F4 mais il faudrait encore attendre un peu pour avoir une version stable 😉

      Publié par skywodd | 23 septembre 2012, 15 h 38 min
  3. Salut, est-il possible que tu détailles un peu plus l’utilité de l’étape 4 ? Patch ? Quelle est son utilité ? Est-ce que c’est un hack obscure pour que ça marche ? Merci.

    Publié par Absurdev | 20 octobre 2012, 21 h 19 min
    • Cela permet tout simplement d’avoir une application qui démarre 😉

      En fait systemInit() permet d’initialiser le hardware (comme son nom l’indique), sans cet appel de fonction la carte ne démarre pas, tout simplement.

      Publié par skywodd | 20 octobre 2012, 21 h 46 min
  4. Salut, j’ai un soucie quand je compile ça me mets une erreur et ça fait 2 bonnes heures que je flanche dessus:
    [cc] C:\Documents and Settings\Nebus\Mes documents\Projet M2\test1\stm32f4xx_stdperiph_driver\inc/stm32f4xx_rcc.h:31:23: fatal error: stm32f4xx.h: No such file or directory

    Ca vient du fait que j’ai pas fait « la hiérarchie des fichiers du projet » etape 3 parti 3?
    J’ai pas compris cette partie ^^
    Merci d’avoir pris le temps de me lire et de me repondre

    Publié par Kevin | 13 décembre 2012, 1 h 58 min
    • Ça vient effectivement de l’étape 3, qui justement permet d’éviter cette erreur.
      Le fichier stm32f4xx.h n’étant pas ajouté par coide il faut l’ajouter soi même.

      Ps: quel version de coide utilises tu ? (ce problème aurait du être réglé dans la dernière version de coide)

      Publié par skywodd | 13 décembre 2012, 22 h 01 min
  5. Bonjour, j’ai tenté d’installer CoIde mais j’ai un souci lors de la compilation. La voici :

    BUILD FAILED
    Could not launch C:\yagarto-20121222\arm-none-eabi-gcc: java.io.IOException: Cannot run program « C:\yagarto-20121222\arm-none-eabi-gcc » (in directory « D:\projetCoocox\Blink_bp_stm32f4\Blink_bp_stm32f4\Debug\obj »): CreateProcess error=2, Le fichier spécifié est introuvable
    Total time: 0 seconds

    Bon ça viens de yagarto mais je ne sais pas pourquoi. J’ai bien renseigné le path mais la je sais pas ou chercher.

    Merci.

    Publié par Arnold | 31 janvier 2013, 21 h 32 min
  6. besoin d’aide
    Je suis débutant avec la carte stm32f4_discovery.Je essayer le programme d’essais avec l’IDE ATOLLIC TRUE STUDIO et ça marche bien mais après quelque essais Windows ne peut plus détecter la carte et je remarqué que le led1 en haut à gauche de la carte cesse a s’allumer et elle s’allume que lorsque je maintien l’appui sur la touche reset.
    SVP est ce qui il ya une solution a ce problème et merci d’avance.

    Publié par hichem | 16 novembre 2013, 0 h 02 min
  7. merci pour ce tuto c’est top!!
    en revanche, j’ai pas compris (spin & 1) ? 1 : 0
    Svp qui peut m’expliquer
    merci 🙂

    Publié par imennaguez | 22 août 2014, 20 h 42 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.