STM32: Comment Configurer un Timer pour fonctionner en interruption sur STM32 + Application

Dans ce Tuto, vous allez savoir comment utiliser un Timer en interruption sur STM32, cela est très utile pour l’acquisition de données dans un système. Le timer génère une interruption dans le microcontrôleur, le MCu arrête de faire toute tâche et exécute une fonction spécifique d’interruption (appelé CallBack).

Outils nécessaires:

  • STM32CubeIDE : l’IDE où vous pouvez coder vos projet STM32 et configurez vos microcontrôleurs, avec son outil CubeMX qui nous facilite la tache et il nous génère le code nécessaire.
  • Une carte Nucleo STM32.
  • deux fils.
  • LED.
  • Résistance pour protection de la LED.

1) Créer un nouveau projet STM32 sur STM32CubeIDE

Pour les gens qui ne savent pas comment créer un nouveau projet sur STM32CubeIDE et choisir la carte STM convenable, consulter ce tuto créer rapidement un nouveau projet stm32 sur stm32cubeide. Dans ce tuto, on a utilisé la carte STM32F411RE.

2) Sélectionnez le Timmer:

Ouvrez le fichier de terminaison .ioc pour accéder au CubeMX.

Sélectionnez un timmer sur Timmers, pour notre cas TIM3.

On a choisi le Timer 3 car la carte stm32F411RE, son timer3 pourra être utilisé pour générer une interruption globale dans notre programme.

Vous devez voir la datasheet de la famille de votre carte ( tapez sur google datasheet STM32F411 Reference manuel pour avoir ces détails), vous trouverez ça sur le site de STMicroelectronics pour savoir les options d’utilisation de chaque timer.

3) Configuration du Timer sur Interruption:

Choisissez la source d’horloge l’horloge interne du Microcontrôleur (internal clock).

Sur la partie configuration du timer, sur l’onglet NVIC settings (cet onglet inclut les différents modes d’interruption que le timer supporte), activez TIM3 global interrupt en cochant Enabled.

4) Configuration du Timer, pour avoir la fréquence voulue:

Cliquez sur l’onglet Clock Configuration pour configurer la fréquence d’horloge.

On a choisit une fréquence de 16 MHZ car pour notre demo à la fin, on a besoin d’une interruption chaque seconde. Les Bus APB1et APB2 alimentent les Timers.

La formule de clacul de la fréquence du Timer c’est:

  • Fpwm : fréquence de timer pour se réinitialiser
  • Fclk : fréquence d’horloge
  • period : paramètre de compteur à regler sur counter settings (valeur maximal du compteur du timer).
  • prescaler : paramètre de compteur à régler sur counter settings (divise la fréquence d’horloge pour avoir la fréquence du timer voulue).

On choisit notre période de compteur (Counter Period) et le Prescaler:

On a choisi les valeurs ci-dessus, si on applique la formule vu précédemment, on aura bien une fréquence de 1 HZ ce qui correspond à une période de 1s, donc notre interruption sera générée chaque seconde.

Vous pouvez acheter la carte STMicroelectronics STM32F411RE sur Amazon avec ce lien et obtenez une offre de -10%.

5) Application (changement d’état d’une LED chaque seconde):

Pour notre application, on a besoin d’un Pin pour alimenter la LED, donc on règle la broche PA8 en un GPIO_Output ce qui correspond au connecteur D7 dans la datasheet de la carte.

Après appuyez sur ctrl+s afin de sauvegarder les modification et générer le code.

Dans le code ci dessous vous trouverez le code qu’on a ajouté en gras et en italique, toujours pensez à ajouter votre code entre les commentaires : /* USER CODE BEGIN {chiffre}*/ et /* USER CODE END {chiffre} */ . Si vous ne placez pas votre code entre ces commentaires, lors de la modification de la configuration du STM32 et génération d’un nouveau code dans votre projet STM32, les lignes de code ajoutées vont être perdues.

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  	if (htim==&htim3)
  	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
  }
/* USER CODE END 0 */
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 1);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

Les fonctions utiles pour vous à utiliser dans votre main:

  • Fonction pour commencer l’interruption sur le Timer: HAL_TIM_Base_Start_IT(&htim3), ça concerne le timer3 (htim3) .
  • Fonction qui va être exécuter dans chaque seconde ( fonction d’interruption callback) : HAL_TIM_PeriodElapsedCallback, Cette fonction est définit sur le HAL de STM dans le fichier (stm32f4xx_hal_tim.c), elle est définit en la précédant du descripteur _weak et donc on pourra la redéfinir dans notre code sans ce descripteur.

Pour les autres fonctions d’initialisation, elles sont générées automatiquement par le CubeMX.

Voici le résultat de notre application :