[Utilisation de l'outil] Configuration de la minuterie de base STM32CubeMX

I. Aperçu

    Que vous soyez novice ou maître, sur la base du développement du micro-ordinateur monopuce STM32, l'utilisation de STM32CubeMX peut considérablement améliorer l'efficacité du développement, et le développement de son interface réduit également considérablement le seuil de développement pour les novices sur le micro-ordinateur monopuce STM32.
    Cet article décrit principalement la configuration et les connaissances associées du timer de la puce STM32.

2. Description du logiciel

    STM32CubeMX est un outil graphique multiplateforme officiel ST MCU/MPU pour ST. Il prend en charge le développement sous les systèmes Linux, MacOS et Windows. Son interface sous-jacente est la bibliothèque HAL. De plus, les étudiants habitués à enregistrer le développement, les bibliothèques LL peuvent également être utilisé. En plus d'intégrer la couche d'abstraction matérielle du MCU/MPU, STM32CubeMX intègre également des middlewares tels que RTOS, système de fichiers, USB, réseau, affichage, IA intégrée, etc., afin que les développeurs puissent facilement compléter le pilote sous-jacent de la configuration MCU/MPU. , laissant plus d'énergie pour développer la logique fonctionnelle de couche supérieure, peut encore améliorer l'efficacité du développement embarqué.
    Version démo 6.7.0

3. Introduction à la minuterie

    La minuterie, comme son nom l'indique, est la fonction de synchronisation. La minuterie est le périphérique le plus basique du microcontrôleur, à l'exception du GPIO. Dans ST, les minuteries sont divisées en plusieurs types : minuteries de base, minuteries à usage général, minuteries avancées et minuteries à faible consommation. Cet article se concentre sur la configuration des minuteries de base, et d'autres types de minuteries sont décrits en détail dans d'autres chapitres.
    La minuterie de base doit fournir uniquement la fonction de synchronisation la plus élémentaire. Ci-dessous, nous expliquerons le principe de la minuterie à partir du schéma fonctionnel de la minuterie de base ST.
insérez la description de l'image ici
    En prenant le timing 1s comme exemple, si la fréquence d'horloge d'entrée actuelle est de 1 MHz, comment pouvons-nous obtenir l'intervalle de 1s ? Comme nous le savons tous, 1 MHz signifie en soi une fréquence de 1 000 000 de fois par seconde. Il est donc facile de penser que si la minuterie compte un nombre à chaque cycle d'horloge, il faudra 1 seconde pour compter 1 000 000 de fois. Ainsi, le premier paramètre apparaît - Valeur de rechargement automatique . La fonction de ce paramètre est la suivante : lorsque le compteur atteint la valeur de rechargement automatique, un indicateur d'interruption de débordement peut être déclenché et l'utilisateur peut obtenir l'indicateur d'interruption de débordement Get 1s time.
    Cependant, la réalité n'est pas si idéale. La valeur de rechargement automatique n'est que de 16 bits et la valeur de comptage du temporisateur n'est que de 16 bits. C'est-à-dire que le nombre maximum ne peut atteindre que 65 535, et il ne peut pas atteindre 1 000 000 à tout. Que dois-je faire ? Pensez-y, puisque le comptage ne peut pas atteindre un nombre aussi grand, est-il possible de rendre le comptage moins rapide, par exemple, laissez la minuterie compter à une fréquence de 1 kHz, il suffit alors de compter 1000 fois pour obtenir 1 seconde de temps. Mais l’entrée de la minuterie est de 1 MHz, comment puis-je la ralentir ? À ce stade, un autre paramètre est utile - la valeur du pré-échelonneur (Prescaler Value) . Si 1 MHz est divisé par 2, cela fait 500 kHz, et s'il est divisé par 1 000, cela fait 1 kHz.

4. Configuration de la minuterie

    Après avoir lu le principe, nous examinerons ici l'implémentation spécifique de la fonction.Prenons l'exemple de l'horloge 1s ci-dessus, comment la régler dans CubeMX.

  • configuration de base

    Regardez d'abord l'interface de configuration, car ici nous n'avons besoin que d'une fonction de notification de timing, et n'avons pas besoin d'utiliser un port externe, nous pouvons donc sélectionner directement "TIM6" dans l'onglet "Timers" (TIM6 est le timer de base), cochez Sélectionnez « Activé » pour activer la minuterie.
insérez la description de l'image ici
    Ensuite, examinez quelques informations de configuration de base.
insérez la description de l'image ici
Mode One Pulse : Une fois ce mode activé, tant que l'indicateur de débordement est déclenché une fois, l'activation du comptage sera automatiquement désactivée. Si vous souhaitez le déclencher à nouveau, vous devez activer manuellement l'activation du comptage. Donc si vous souhaitez implémenter des événements déclencheurs périodiques, vous n'avez pas besoin de cocher cette option.
Prescaler : l'un des tueurs de novices, bien que le préscaler soit écrit ici, mais la valeur de réglage réelle est le préscaler -1, c'est-à-dire que lorsque la fréquence est divisée par 10, elle doit être réglée sur 9.
Mode compteur : le mode de comptage, également appelé sens de comptage, détermine si la minuterie compte de manière croissante ou décroissante. S'il est uniquement utilisé pour la synchronisation, l'incrémentation ou la décrémentation n'a aucun effet.
Période de comptage (Période de comptage) : lorsque la valeur de comptage atteint la valeur de la période de comptage, un indicateur de débordement sera déclenché. Novice Killer 2, car le décompte commence à partir de 0, donc si vous souhaitez atteindre 10 décomptes, il vous suffit de définir 9 est assez.
Rechargement automatique (préchargement automatique) : Si le rechargement automatique est sélectionné, après le déclenchement d'un indicateur de débordement, la minuterie remettra automatiquement le compte à 0 et recommencera à compter.
Sélection d'événement déclencheur (Trigger Event Selection) : vous pouvez choisir de déclencher la sortie via l'indicateur UG, l'activation du comptage et l'indicateur de débordement, qui n'est généralement pas utilisé.

    Afin d'obtenir un timing 1s, nous devons d'abord connaître la fréquence d'horloge du timer actuel. Vérifiez d'abord l'arborescence de l'horloge. TIM6 est accroché sur le bus d'horloge APB. Ici, nous le réglons en fonction de la fréquence la plus élevée du micro-ordinateur monopuce, qui est de 48 MHz.
insérez la description de l'image ici
    Pour faciliter le calcul, nous pouvons remplir ici 47999 pour le coefficient de pré-échelle, soit 48000 division de fréquence. Le cycle de comptage peut être rempli de 999, c'est-à-dire compter 1000 fois. De plus, activez le rechargement automatique, afin qu'un décompte de cycles de 1 s puisse être obtenu.
insérez la description de l'image ici
    Afin de nous faire savoir immédiatement quand la période de comptage est écoulée pour effectuer certaines opérations, nous devons également ouvrir ici la fonction de service d'interruption. Dans l'onglet "NVIC Setting", vérifiez l'activation de l'interruption "TIM6".
insérez la description de l'image ici
    Après avoir terminé la configuration ci-dessus et sélectionné la bibliothèque à utiliser, le code du projet peut être généré.

  • Implémentation du code de la bibliothèque LL

    Ajoutez le code suivant au projet généré pour inverser une variable booléenne lorsqu'une interruption est déclenchée.

/***************************main.c******************************/
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_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  LL_TIM_EnableIT_UPDATE(TIM6);
  /* 使能计数 */
  LL_TIM_EnableCounter(TIM6);
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

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

/***************************stm32f0xx_it.c******************************/
void TIM6_DAC_IRQHandler(void)
{
    
    
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
  /* 进中断后判断如果使能了更新中断,且更新中断标志为1,则翻转数据,并清除标志 */
  if (   (LL_TIM_IsActiveFlag_UPDATE(TIM6))
      && (LL_TIM_IsEnabledIT_UPDATE(TIM6))
	   )
  {
    
    
      LL_TIM_ClearFlag_UPDATE(TIM6);
      TestTimer = (++TestTimer) % 2;
  }
  /* USER CODE END TIM6_DAC_IRQn 0 */

  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}
/*******************************************************************/
  • Implémentation du code de la bibliothèque HAL
/* USER CODE BEGIN 0 */
uint8_t TestTimer = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
  TestTimer = (++TestTimer) % 2;
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}
/* 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_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htim6);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  • Démonstration d'effet

insérez la description de l'image ici

    Logiciel de gravure pour le débogage, vous pouvez voir que la variable s'inverse une fois toutes les 1 s.

5. Questions nécessitant une attention particulière

1. Notez que lors du réglage du coefficient de pré-échelle et de la valeur de rechargement, vous devez soustraire 1, c'est-à-dire que si vous souhaitez diviser par 2, PSC doit être défini sur 1, et si vous souhaitez compter 10 réinitialisations, vous devez définissez 9 pour la valeur de rechargement.
2. Après configuration du projet généré, il ne sera pas compté lors de son initialisation, il devra appeler la bibliothèque LL pour l'ouvrir lors de son utilisation.

Je suppose que tu aimes

Origine blog.csdn.net/u012749085/article/details/131396208
conseillé
Classement