STM32 Nucleo F446RE : Blink de base

Comme premier code, nous allons commuter la LED2 du Nucleo afin de mesurer la performance des librairies.

Lors des tests, l’onde carré observée était d’environ 2.4MHz. Ce n’est pas la méthode la plus rapide, car les fonctions utilisées pour le changement d’état de la LED2 présentent une surcharge notable.

#include "stm32f4xx.h"
#include "system_stm32f4xx.h"
#include "stm32f4xx_hal_gpio.h"
#include "stm32f4xx_hal_rcc.h"

GPIO_InitTypeDef GPIO_InitStructure;

void main(void)
{
  HAL_Init();
  __GPIOA_CLK_ENABLE();
  GPIO_InitStructure.Pin = GPIO_PIN_5;
  GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStructure.Pull = GPIO_PULLUP;
  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

  while (1)
  {
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
  }
}

SMT32 Nucleo F446RE : Blink rapide

Les fonctions qui permettent de contrôler les I/O du STM32 sont pratiques mais, elles sont également très lentes. Ces fonctions ne se limitent pas à imposer le niveau des sorties, elles font aussi quelques vérifications.

Il est possible de contrôler directement les I/O du STM32 en utilisant directement le port de sortie via le registre de sortie (ODR pour Output Data Register).

Pour obtenir l’information sur les différents registres, il faut consulter le manuel de référence sur le site de ST.

lien : www.st.com/resource/en/reference_manual/dm00135183.pdf

Voici un petit code qui permettra de commuter rapidement une sortie.  Sur le NUCLEOF446RE, la LED2 est reliée à PA5. Lors des tests, cette version donnait une période de 80ns, soit une fréquence de 12MHz.

#include "stm32f446xx.h"

#define LED2_INIT RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; \
        GPIOA->MODER |= GPIO_MODER_MODER5_0
#define LED2_ON (GPIOA->ODR |= 0x0020)
#define LED2_OFF (GPIOA->ODR &= ~0x0020)
#define LED2_TOGGLE (GPIOA->ODR ^= 0x0020)

int main (void)
{
 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

 LED2_INIT;
 while (1)
 {
   LED2_ON;
   LED2_OFF;
 }
}

Finalement, il est également possible de faire une méthode hybride, et d’utiliser les fonctions pour l’initialisation et modifier directement les registres pour le contrôle.

#include "stm32f4xx.h"
#include "stm32f4xx_hal_gpio.h"

GPIO_InitTypeDef GPIO_InitStructure;
#define LED2_ON (GPIOA->ODR |= 0x0020)
#define LED2_OFF (GPIOA->ODR &= ~0x0020)

void main(void)
{
   HAL_Init();
   __GPIOA_CLK_ENABLE();
   GPIO_InitStructure.Pin = GPIO_PIN_5;
   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
   GPIO_InitStructure.Pull = GPIO_PULLUP;
   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
   HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

   while (1)
   {
     LED2_ON;
     LED2_OFF;
   }
}

Ajouter un fichier source dans un projet SMT32 sous Eclipse

Après la création d’un projet, tous les fichiers d’entête seront disponibles automatiquement, mais, si le fichier source n’est pas explicitement ajouté au projet, le linker donnera une erreur lors de la compilation, car il ne trouvera pas le code à associer aux fonctions.

Par exemple, dans ce projet, nous désirons utiliser les fonctions du adc. Le fichier smt32f4xx_hal_adc.h est disponible dans les fichiers inclus mais pas le smt32f4xx_hal_adc.c qui contient le code des fonctions.

incl1inc2

Il est possible d’ajouter des fichiers sources, selon les besoins du projet. Il faut aller dans les propriétés du projet, sous C/C++General>>Paths and Symbols>>Source Location puis cliquer sur Edit Filter.

incl4

Dans la fenêtre du filtre, il est maintenant possible de retirer le fichier désiré de la liste des fichiers exclus à la compilation. Sélectionner le fichier et appuyer sur Remove ajoute ce dernier à la liste des sources.

incl3

La liste des sources inclut maintenant le fichier.

inc2

Voilà!