STM32F4 DISCOVERY : Compiler les démos avec CooCox IDE et Code Sourcery

Installation  de l’environnement :

Eric ayant déjà fait une introduction de la carte STM32F4 Discovery, je vais donc rentrer dans le vif du sujet directement.

Il vous faudra récupérer les logiciels suivants :

  • CooIDE, environnement de développement libre, à télécharger ICI
  • Sourcery Codebench Lite pour ARM EABI de Mentor, à télécharger ICI
  • Le logiciel STLink, qui contient les pilotes pour l’interface USB, à télécharger ICI
  • Le correctif pour le logiciel STLink, car il ne fonctionne pas avec les cartes dont le masque de processeur est en révision Z, à télécharger ICI
  • L’archive du firmware de démonstration de la carte : ICI

Installer  tout d’abord CooIDE (qui sera en c:\CooCox\CooIDE),  puis créer un répertoire c:\CooCox\CooIDE\gcc et installer Sourery codebench en précisant que le répertoire de destination est celui que vous avez créé.

Lors du premier lancement de CooIDE, il faudra renseigner l’endroit ou se trouve le compilateur, à savoir c:\CooCox\CooIDE\gcc.

Ensuite, il vous faudra cliquer sur

Création d’un nouveau projet

  • Dans le menu Project, faire  « New »
  • Le nommer (exemple : AudioUSB)
  • Step 1:  Select Manufacturers: Cliquer sur  ST
  • Step 2:  Select Chip : STM32F407VG
  • Step 3 select components
    • Cliquer sur  l’icône « Refresh Component list » et attendre la fin du téléchargement des mises à jour
    • Cliquer sur la case à cocher CMSIS Boot
    • La case à cocher « M4 CMSIS CORE » se cochera automatiquement

Votre projet devrait ressembler à ceci :

Importation des sources

Dans l’archive du firmware de démonstration de la carte, prendre les répertoires suivants (avec l’explorer) et les drag & dropper dans l’ide (dans l’arbre de projet) :

  • STM32F4-Discovery_FW_V1.1.0\Project\Audio_playback_and_record\inc
  • STM32F4-Discovery_FW_V1.1.0\Project\Audio_playback_and_record\src

Lors du drag, l’ide demande si vous voulez les lier ou les copier. Sur Windows XP je n’ai pas réussi à les lier. La copier marche.

Importation des bibliothèques

Plusieurs bibliothèques sont requises pour le fonctionnement de la démo Audio. Il va égalemement falloir les drag & dropper dans l’ide, mais pour faciliter la lecture nous allons tout d’abord créer un répertoire STM32, dans equel nous mettrons tout cela.

  • Créer un répertoire STM32 dans la racine du projet
  • Copier par drag and drop dans Coocox les répertoires suivants
    • STM32F4-Discovery_FW_V1.1.0\Libraries\STM32_USB_HOST_Library
    • STM32F4-Discovery_FW_V1.1.0\Libraries\STM32_USB_OTG_Driver
    • STM32F4-Discovery_FW_V1.1.0\Libraries\STM32F4xx_StdPeriph_Driver
    • STM32F4-Discovery_FW_V1.1.0\Utilities\STM32F4-Discovery
    • STM32F4-Discovery_FW_V1.1.0\Utilities\Third_Party\fat_fs

Suppression des sources inutiles

Les répertoire CMSIS et CMSIS_BOOT contiennent des éléments qui font double emploi (et vont poser des probèmes) avec ceux livrés dans le projet. Il va donc falloir supprimer :

  • /cmsis_boot/stm32f4xx_conf.h
  • /cmsis_boot/system_stm32f4xx.c

De même, le fichier main.c créé dans la racine par coocox ne sera pas nécessaire et doit être supprimé.

A l’issue, le projet ressemble à cela :

Paramétrage du projet

Plusieurs éléments doivent ensuite être paramétrés dans le projet. Pour cela, il faut cliquer avec le bouton de droite sur la racine de l’arbre du projet et sélectionner « Configuration ».

Dans « Include Path », ajouter les chemins suivants à l’aide des boutons « Add » et « Workspace »:

  • inc
  • STM32F4-Discovery
  • STM32/STM32F4xx_StdPeriph_Driver/inc
  • STM32/STM32_USB_HOST_Library/Class/MSC/inc
  • STM32/STM32_USB_HOST_Library/Core/inc
  • STM32/STM32_USB_OTG_Driver/inc
  • STM32/fat_fs/inc

Dans « Defined Symbols », ajouter les Symboles suivants :

  • USE_STDPERIPH_DRIVER
  • STM32F4XX
  • USE_USB_OTG_FS
  • MEDIA_USB_KEY

Il va falloir ensuite interdire la compilation de certains sources, car ils ne sont pas nécessaires au projet. Pour ce faire, sélectionner le fichier ou le dossier avec clic droit et sélectionner « Exclude from Build ». Ceci doit être fait pour les fichiers suivants :

  • STM32/fat_fs/src/option
  • STM32/fat_fs/src/diskio.c
  • STM32/STM32_USB_HOST_Library/Class/HID
  • STM32/STM32_USB_OTG_Driver/src/usb_bsp_template.c
  • STM32/STM32_USB_OTG_Driver/src/usb_dcd_int.c
  • STM32/STM32_USB_OTG_Driver/src/usb_dcd.c
  • STM32/STM32_USB_OTG_Driver/src/usb_otg.c

Enfin, le dernier point est capital. Il va falloir modifier le fichier de démarrage pour qu’il appelle l’initialisation des horloges. Je ne sais pas si c’est un oubli (bug) dans CooCox, car la routine est là, mais seulement pas appelée…

Cela se fait en modifiant /cmsis_boot/startup/startup_stm32f4xx.c :

  • Ligne 144: décommenter  la ligne
 extern void SystemInit(void);    /*!< Setup the microcontroller system(CMSIS) */
  • Ligne 291, ajouter juste avant l’appel de main():
 SystemInit();

Compilation et envoi a la cible

Le programme peut être compilé avec « Rebuild All », et ne doit donner aucune erreur.

GCC HOME: C:\CooCox\CoIDE\gcc\bin
compile:
    [mkdir] Created dir: C:\CooCox\CoIDE\workspace\test\Debug\bin
    [mkdir] Created dir: C:\CooCox\CoIDE\workspace\test\Debug\obj
       [cc] 56 total files to be compiled.
       [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -Wall -ffunction-sections -O0 -g -c -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DUSE_USB_OTG_FS -DMEDIA_USB_KEY -DSTM32F407VG -IC:\CooCox\CoIDE\workspace\test -IC:\CooCox\CoIDE\workspace\test\STM32\STM32F4-Discovery -IC:\CooCox\CoIDE\workspace\test\inc -IC:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\inc -IC:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Class\MSC\inc -IC:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Core\inc -IC:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_OTG_Driver\inc -IC:\CooCox\CoIDE\workspace\test\STM32\fat_fs\inc -IC:\CooCox\CoIDE\workspace\test\cmsis_boot -IC:\CooCox\CoIDE\workspace\test\cmsis C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_OTG_Driver\src\usb_core.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_aes.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4-Discovery\stm32f4_discovery_audio_codec.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Core\src\usbh_hcs.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Core\src\usbh_stdreq.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_can.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dac.c C:\CooCox\CoIDE\workspace\test\cmsis_boot\startup\startup_stm32f4xx.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4-Discovery\stm32f4_discovery.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_crc.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c C:\CooCox\CoIDE\workspace\test\src\main.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c C:\CooCox\CoIDE\workspace\test\src\waverecorder.c C:\CooCox\CoIDE\workspace\test\src\stm32f4xx_it.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_adc.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Class\MSC\src\usbh_msc_core.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dcmi.c C:\CooCox\CoIDE\workspace\test\src\waveplayer.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_des.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Core\src\usbh_core.c C:\CooCox\CoIDE\workspace\test\src\audio_sample.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_flash.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Class\MSC\src\usbh_msc_scsi.c C:\CooCox\CoIDE\workspace\test\src\system_stm32f4xx.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dma.c C:\CooCox\CoIDE\workspace\test\src\usbh_usr.c C:\CooCox\CoIDE\workspace\test\src\usb_bsp.c C:\CooCox\CoIDE\workspace\test\STM32\fat_fs\src\ff.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_OTG_Driver\src\usb_hcd.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Class\MSC\src\usbh_msc_bot.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Class\MSC\src\usbh_msc_fatfs.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_HOST_Library\Core\src\usbh_ioreq.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\misc.c C:\CooCox\CoIDE\workspace\test\STM32\fat_fs\src\fattime.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4-Discovery\stm32f4_discovery_lis302dl.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c C:\CooCox\CoIDE\workspace\test\STM32\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c C:\CooCox\CoIDE\workspace\test\STM32\STM32_USB_OTG_Driver\src\usb_hcd_int.c
       [cc] Starting link
       [cc] arm-none-eabi-gcc -O0 -nostartfiles -Wl,-Map=test.map -mcpu=cortex-m4 -mthumb -LC:\CooCox\CoIDE\workspace\test -Wl,--gc-sections -Wl,-TC:\CooCox\CoIDE\workspace\test\link.ld -g -o test.elf ..\obj\stm32f4xx_syscfg.o ..\obj\usb_core.o ..\obj\stm32f4xx_sdio.o ..\obj\stm32f4xx_hash.o ..\obj\stm32f4xx_cryp_aes.o ..\obj\stm32f4xx_hash_sha1.o ..\obj\stm32f4_discovery_audio_codec.o ..\obj\usbh_hcs.o ..\obj\stm32f4xx_usart.o ..\obj\usbh_stdreq.o ..\obj\stm32f4xx_pwr.o ..\obj\stm32f4xx_can.o ..\obj\stm32f4xx_wwdg.o ..\obj\stm32f4xx_hash_md5.o ..\obj\stm32f4xx_dac.o ..\obj\startup_stm32f4xx.o ..\obj\stm32f4_discovery.o ..\obj\stm32f4xx_crc.o ..\obj\stm32f4xx_iwdg.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\waverecorder.o ..\obj\stm32f4xx_it.o ..\obj\stm32f4xx_adc.o ..\obj\usbh_msc_core.o ..\obj\stm32f4xx_dcmi.o ..\obj\waveplayer.o ..\obj\stm32f4xx_cryp_des.o ..\obj\stm32f4xx_cryp.o ..\obj\stm32f4xx_fsmc.o ..\obj\usbh_core.o ..\obj\audio_sample.o ..\obj\stm32f4xx_gpio.o ..\obj\stm32f4xx_flash.o ..\obj\usbh_msc_scsi.o ..\obj\system_stm32f4xx.o ..\obj\stm32f4xx_dma.o ..\obj\usbh_usr.o ..\obj\usb_bsp.o ..\obj\ff.o ..\obj\usb_hcd.o ..\obj\usbh_msc_bot.o ..\obj\usbh_msc_fatfs.o ..\obj\stm32f4xx_spi.o ..\obj\stm32f4xx_i2c.o ..\obj\stm32f4xx_rng.o ..\obj\stm32f4xx_exti.o ..\obj\usbh_ioreq.o ..\obj\misc.o ..\obj\fattime.o ..\obj\stm32f4_discovery_lis302dl.o ..\obj\stm32f4xx_rtc.o ..\obj\stm32f4xx_cryp_tdes.o ..\obj\stm32f4xx_tim.o ..\obj\stm32f4xx_dbgmcu.o ..\obj\usb_hcd_int.o -L..\..\STM32\STM32F4-Discovery -lPDMFilter_GCC
Program Size:
      text       data        bss        dec        hex    filename
     63404       1008      18976      83388      145bc    test.elf

BUILD SUCCESSFUL
Total time: 7 seconds

Il peut ensuite être envoyé à la cible avec « Flash », « Program Download ».

A noter que ceci cconstruit le progamme de test dans sa version « USB ». Une autre version existe, et joue directement un fichier qui a été romé en même tempq que le programme. Pour cela, il suffit de remplacer le symbole défini « MEDIA_USB_KEY » par « MEDIA_IntFLASH ».

Bon courage et bonne découverte de ce fantastique kit…

This entry was posted in Dev. Logiciel. Bookmark the permalink.

9 Responses to STM32F4 DISCOVERY : Compiler les démos avec CooCox IDE et Code Sourcery

  1. Olivi3r says:

    Je commence à peine le développement sur micro, et je viens de faire l’acquisition de ce kit. Grâce à ce tuto, je vais pouvoir passer directement au plus intéressant :D. Merci.

  2. Jean-Louis VERN says:

    Super.
    J’avais installé Coocox avec Yagarto, et je ne m’en sortais pas (je compilais un exemple, pas d’erreur, mais taille du code = 0…)

    Il y a toutefois une petite erreur, ce n’est pas « STM32F4-Discovery » mais « STM32/STM32F4-Discovery » qu’il faut ajouter dans l’include path.

    A part ça, où trouvez vous les Defines symbols à ajouter ? Je suppose qu’ils doivent apparaître dans un fichier de config quelque part dans « STM32F4-Discovery_FW_V1.1.0 », mais où ? J’ai regardé les fichiers xml et autres et j’ai trouvé des defines, mais il y avait aussi « MEDIA_IntFLASH » que vous n’avez pas mis (dans Audio_playback_and_record.uvproj). Le faut-il ?

    Cordialement
    Jean-Louis

  3. Jean-Louis VERN says:

    Bon… ok, MEDIA_IntFLASH, c’est si le média n’est pas MEDIA_USB_KEY, je suppose…
    Cela dit, quand on met MEDIA_IntFLASH il demande la classe HID, et je me demande bien quel est le rapport avec la choucroute, la note d’application AN3997 étant muette sur le sujet… Peut importe… en bricolant un peu, en virant ceci et ajoutant cela (!) ça fonctionne (aussi) avec MEDIA_IntFLASH (je n’ai pas de super adaptateur pour tester le mode avec clef USB).

    Merci encore pour le tuto.

    Je viens de m’apercevoir que vous êtes de Montpellier, étant moi-même de la région, j’aimerais bien prendre contact avec vous…

    Jean-Louis

  4. Waleed Aslam says:

    Hello dear developer,
    I am just the beginner of ARM.
    Can you please upload the project folder for demo purpose. I have build the project on the same guidelines as discussed by you. There were a lot of errors stating the header file is not found.
    Waiting for your reply.
    Thanks.

  5. Jean-Louis VERN says:

    Hello Waleed,
    Have you set the correct directory name in the « include files » list ?
    This is not « STM32F4-Discovery » as stated, but « STM32/STM32F4-Discovery »
    Regards
    Jean-Louis

  6. Gilles de Milleville says:

    Bonjour,

    Je viens d’acquérir également cette carte et je recherchais un environnement de dev (free bien sur…), votre tuto est génial, merci à vous.
    J’ai cependant un petit problème, j’ai téléchargé la dernier version du gcc (arm-2012.03-56-arm-none-eabi) et j’ai l’impression qu’il est organisé différemment: lorsque je mets le path pour gcc à C:\CooCox\CoIDE\gcc comme indiqué, le rebuild all m’indique qu’il ne peut trouver le fichier :  » arm-none-eabi-gcc ». En regardant la structure de gcc il y a un répertoire « bin » qui contient entre autre ce fichier. J’ai donc modifié le path en conséquence mais lorsque je lance le rebuilt j’ai une série de message d’erreur:
    [cc] C:\CooCox\CoIDE\workspace\AudioTest\STM32\STM32_USB_OTG_Driver\src\usb_bsp_template.c:88:6: error: conflicting types for ‘USB_OTG_BSP_Init’
    [cc] C:\CooCox\CoIDE\workspace\AudioTest\STM32\STM32_USB_OTG_Driver\inc/usb_bsp.h:75:6: note: previous declaration of ‘USB_OTG_BSP_Init’ was here
    [cc] C:\CooCox\CoIDE\workspace\AudioTest\STM32\STM32_USB_OTG_Driver\src\usb_bsp_template.c:98:6: error: conflicting types for ‘USB_OTG_BSP_EnableInterrupt’
    [cc] C:\CooCox\CoIDE\workspace\AudioTest\STM32\STM32_USB_OTG_Driver\inc/usb_bsp.h:78:6: note: previous declaration of ‘USB_OTG_BSP_EnableInterrupt’ was here
    [cc] C:\CooCox\CoIDE\workspace\AudioTest\STM32\STM32_USB_OTG_Driver\src\usb_bsp_template.c:111:6: error: conflicting types for ‘USB_OTG_BSP_DriveVBUS’
    … (je n’ai pas copié l’intégralité des erreurs pour éviter d’alourdir le post)
    BUILD FAILED
    Total time: 13 seconds

    Auriez-vous une idée sur le sujet ? Faut-il que je prenne une version plus ancienne du gcc ?
    Merci d’avance pour le coup de main.

    Gilles.

  7. Gilles de Milleville says:

    (Suite du précédent message)

    J’ai trouvé mon problème, désolé pour le post précédent.
    En fait, comme j’ai eu une erreur de compilation la première fois que j’ai essayé (problème avec le path du gcc), j’ai renommé le répertoire (initialement « Audio Test ») en « AudioTest » sans l’espace, en pensant que l’espace dans le nom du workspace pouvait être à l’origine du problème. En renommant le workspace tous les « exclude » sont perdus. Il faut les reparamétrer.
    Après tout fonctionne correctement (il me reste un warning, mais je vais chercher de mon côté avant de demander de l’aide…)

    Merci encore pour ce tuto.
    Gilles.

  8. jmal fatma says:

    salut
    je n’ai pas compris comment je fais l’importation des bibliothèques et des sources?

  9. jmal fatma says:

    ou je trouve tous les répertoires que je dois les importer