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…
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.
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
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
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.
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
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:CooCoxCoIDEgcc 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:CooCoxCoIDEworkspaceAudioTestSTM32STM32_USB_OTG_Driversrcusb_bsp_template.c:88:6: error: conflicting types for ‘USB_OTG_BSP_Init’
[cc] C:CooCoxCoIDEworkspaceAudioTestSTM32STM32_USB_OTG_Driverinc/usb_bsp.h:75:6: note: previous declaration of ‘USB_OTG_BSP_Init’ was here
[cc] C:CooCoxCoIDEworkspaceAudioTestSTM32STM32_USB_OTG_Driversrcusb_bsp_template.c:98:6: error: conflicting types for ‘USB_OTG_BSP_EnableInterrupt’
[cc] C:CooCoxCoIDEworkspaceAudioTestSTM32STM32_USB_OTG_Driverinc/usb_bsp.h:78:6: note: previous declaration of ‘USB_OTG_BSP_EnableInterrupt’ was here
[cc] C:CooCoxCoIDEworkspaceAudioTestSTM32STM32_USB_OTG_Driversrcusb_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.
(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.
salut
je n’ai pas compris comment je fais l’importation des bibliothèques et des sources?
ou je trouve tous les répertoires que je dois les importer