Structuration du Code Généré avec STM32CubeIDE

Guide pratique pour comprendre et utiliser les sections réservées au code utilisateur dans les projets STM32.

1. Introduction

Dans le développement embarqué, la configuration des périphériques internes est cruciale pour le bon fonctionnement de l'application. STM32CubeIDE facilite cette tâche grâce à son interface graphique intuitive.

2. Périphériques Internes

Les microcontrôleurs STM32 intègrent divers périphériques internes tels que :

  • GPIO (General Purpose Input/Output)
  • ADC (Analog to Digital Converter)
  • USART (Universal Synchronous/Asynchronous Receiver/Transmitter)
  • I2C (Inter-Integrated Circuit)
  • SPI (Serial Peripheral Interface)

3. Configuration via .ioc

STM32CubeIDE utilise un fichier .ioc pour stocker la configuration du projet, y compris les paramètres des périphériques internes.

Pour configurer un périphérique :

  1. Ouvrir le fichier
  2. Accéder à l'onglet "Pinout & Configuration"
  3. Sélectionner le périphérique souhaité dans la liste
  4. Configurer les paramètres requis (mode, vitesse, etc.)
  5. Générer le code

4. Partie Générée par STM32CubeMX

STM32CubeMX génère automatiquement une grande partie du code en fonction des configurations définies dans le fichier .ioc. Cette partie inclut :

  • Initialisation des périphériques (GPIO, UART, Timers, etc.).
  • Configuration des horloges et des interruptions.
  • Structures et fonctions nécessaires au bon fonctionnement du microcontrôleur.

Toute modification dans le fichier .ioc entraînera la régénération de cette partie du code.
Ce qui écrasera toutes les modifications effectuées en dehors des balises /* USER CODE BEGIN XXX */ et /* USER CODE END XXX */ reservées au code utilisateur.

Exemple de code généré pour l'initialisation des GPIO :


/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */

/* USER CODE END MX_GPIO_Init_1 */

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

/*Configure GPIO pin : LD2_Pin */
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */

/* USER CODE END MX_GPIO_Init_2 */
}
        

Dans cet exemple, le GPIOA Pin 5 (la led interne) est configuré en mode sortie push-pull sans résistance de tirage, et le bouton bleu (user button) est configuré en mode entrée avec une interruption sur front descendant.

Note Importante : Toute modification du fichier .ioc écrasera les parties du code généré qui ne sont pas situées entre les balises /* USER CODE BEGIN XXX*/ et /* USER CODE END XXX*/.
Il est donc essentiel de placer votre code personnalisé dans ces sections pour éviter toute perte de données lors de la régénération du code.

5. Partie Réservée au Code Utilisateur

STM32CubeIDE réserve des sections spécifiques dans le code généré pour permettre aux développeurs d'ajouter leur propre logique sans risquer de perdre leurs modifications lors de la régénération. Ces sections sont délimitées par les balises :


    /* USER CODE BEGIN XXX */
    /* USER CODE END XXX */
        

Voici les balises les plus courantes et leur utilité :

  • /* USER CODE BEGIN Includes */

    Pour inclure des fichiers d'en-tête supplémentaires nécessaires au projet.

  • /* USER CODE BEGIN PD */

    Cette section est utilisée pour définir des macros ou des constantes spécifiques au projet.

  • /* USER CODE BEGIN PV */

    Pour déclarer des variables globales personnalisées.

  • /* USER CODE BEGIN PFP */

    Pour déclarer les prototypes des fonctions personnalisées.

  • /* USER CODE BEGIN 2 */

    Pour ajouter du code après l'initialisation des périphériques.

  • /* USER CODE BEGIN WHILE */

    Pour ajouter du code dans la boucle infinie while.

  • /* USER CODE BEGIN 4 */

    Pour ajouter des fonctions personnalisées, comme des callbacks ou des gestionnaires d'interruptions.

Note : Il est essentiel de toujours placer votre code dans ces sections pour éviter qu'il ne soit écrasé lors de la régénération.

6. Conclusion

STM32CubeIDE est un outil puissant qui simplifie la configuration des périphériques internes des microcontrôleurs STM32 grâce à son interface graphique intuitive et son fichier .ioc. En suivant les bonnes pratiques, comme l'utilisation des balises /* USER CODE BEGIN XXX */, vous pouvez personnaliser votre code tout en préservant sa structure lors des régénérations.