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…