Mon tout premier projet

Afin de vérifier que votre environnement fonctionne correctement, créez un premier projet à l'intérieur de votre dépôt avec les propriétés suivantes :

  • Sur STM32CubeMX, commencez un nouveau projet en sélectionnant uniquement le processeur correct (STM32L475VGT6). N'optez pas pour la carte (board) IoT-node, nous ferons ça plus tard.
  • Sur la vue "Pinout view", sélectionnez la broche correspondant à la LED 2 (led verte, cf. schematics de la carte), et configurez la en sortie, mode push-pull, état bas, sans pull-up ou pull-down, faible vitesse. Nommez la LED2. Ce nom devrait apparaître dans la "Pinout view".
  • Dans "Clock configuration", indiquez que vous voulez utiliser l'horloge HSI comme source de la PLL, et la sortie de celle-ci PLLCLK comme horloge système. Nous n'utiliserons pas d'horloge externe. S'il y a un problème, utilisez "Resolve Clock issue", sinon passez à la suite.
  • En revenant à "Pinout & Configuration", activez le middleware "FreeRTOS" en mode "CMSIS v2".
  • Dans la configuration de FreeRTOS, nous allons uniquement modifier, dans "Tasks and Queues", la tâche par défaut, qui sera la seule que nous utiliserons. Son nom sera "blinkTask", sa fonction principale "startBlinkTask", et nous favoriserons l'allocation statique.
  • Générez maintenant le code pour le projet, sous le nom "blink" dans votre dépôt avec la chaîne d'outils "Makefile"
  • Si vous avez un avertissement comme quoi il vaut mieux utiliser une autre source que "Systick" pour le HAL (SysTick étant utilisé par FreeRTOS), changez la source du HAL là où c'est indiqué ("Pinout & Configuration" / "System Core" / "Sys") pour choisir, par exemple, le timer 1.

Si tout va bien, en lançant make dans le répertoire "blink" de votre dépôt, un exécutable build/blink.elf (ainsi qu'un .bin et un .hex) apparaîtra.

En regardant dans le répertoire "Core", vous verrez que "main.h" contient la définition de LED2_GPIO_Port et LED2_Pin correspondant à votre définition. De plus, dans "main.c", vous trouverez une fonction main, qui initialise le HAL, les horloges puis les GPIO, dont votre port LED2 à l'état indiqué. La tâche "blinkTask" est ensuite créée, et l'environnement d'exécution de FreeRTOS est lancé.

Vous pouvez maintenant faire clignoter cette fameuse LED 2 à la fréquence d'1Hz (interprétez cette phrase comme vous le souhaitez). Pour cela, en prenant bien soin de placer la totalité de votre code utilisateur entre des balises existantes "USER CODE BEGIN" et "USER CODE END", faîtes clignoter la led en utilisant les fonctions du HAL STM32.

En ce qui concerne le délai entre deux changements d'états, plusieurs solutions s'offrent à vous :

  • Vous pouvez utiliser les fonctions de FreeRTOS (vTaskDelay par exemple) et les macros associées.
  • Vous pouvez utiliser les fonctions de CMSIS (osDelay par exemple), qui, derrière, se charge d'appeler celles de FreeRTOS, si vous voulez utiliser une interface qui vous permet de changer facilement de système d'exploitation temps-réel au prix d'une légère surcouche logicielle.

De la même manière, vous êtes libres dans toute la suite de ce TP, de choisir si vous souhaitez déclarer vos objets de synchronisation, vos ports, etc. en utilisant STM32CubeMX, ou si vous préférez le faire à la main, ou un mélange des deux.

Quoi qu'il en soit, faîtes clignoter cette led et committez votre code dans votre dépôt Git. Il doit être possible de le reconstruire juste en tapant la commande make.

On ne rappelera pas ici les étapes nécessaires pour lancer JLinkGDBServer avec les bons paramètres ou pour utiliser arm-none-eabi-gdb pour charger le code et l'exécuter.

Allez, pendant qu'on y est, une toute petite modification

Dans STM32CubeMX, indiquez dans "Pinout & Configuration" / "RCC" que vous avez un oscillateur connecté sur HSE. Dans "Clock Configuration", indiquez que cet oscillateur est à 8MHz et indiquez aussi que vous voulez que l'horloge système HCLK soit à 80MHz (c'est le maximum sur STM32L4). Regénérez le code, compilez, chargez, vérifiez que ça marche, committez dans Git. Regardez la différence d'initialisation dans "main.c".

Vous remarquerez que HAL_RCC_ClockConfig prend en paramètre le paramètre de latence à utiliser pour les accès à la flash. Plus le système est rapide, plus la flash est lente en comparaison et plus il faut l'attendre avant de signaler une erreur.