STM32 : Liaison série

12 mars 2020 rdorigny 0 commentaires

Continuons notre apprentissage et découverte du STM32 grâce à la carte Nucleo-64. Notamment, l'objectif de cet article est d'apprendre à communiquer par l'intermédiaire d'une liaison série USB avec ce microcontrôleur.

Le protocole série est très courant, on utilise énormément du fait de sa simplicité et fiabilité, aussi il semble utile de s'y attarder.





Le microcontrôleur STMF401RE de la Nucleo dispose d'une interface USART qui va permettre de créer un port de communication virtuel par le port USB de la carte de liaison ST-LINK. UART est un protocole simple, il utilise le bit de début (avant le mot de données), les bits d'arrêt (un ou deux, après le mot de données), le bit de parité (pair ou impair) dans son format de base pour le formatage des données. Le bit de parité aide à la détection d'erreur sur un bit.
L'interface USART pour UART synchrone accepte des données cadencées (avec une horloge synchrone), le débit de données est possiblement plus élevé dans ce cas.

Configuration du port UART

Si on ouvre un projet dans le STM32CubeMX, en choisissant l'initialisation par défaut, on observe que les GPIO PA2 et PA3 sont respectivement marqués comme USART_TX et USART_RX. C'est à dire que l'initialisation par défaut du STM32 est réalisée comme une liaison série pour ces entrées/sorties.

Ensuite, dans le STM32CubeMX, sous Connectivity, USART2, dans l'onglet parameter settings choisir les paramètres de la liaison comme ci-dessous (115200bauds/s, pas de parité, ...).


Dans l'onglet NVIC Setting, cocher la case Enabled du global interrupt. Ensuite, on renseigne les paramètres du projet dans Project manager en sélectionnant la toolchain MDK-ARM, et enfin on ouvre le projet dans Keil UVision.

Programmation de la liaison USART

Si on observe le programme principale, on trouvera une fonction d'initialisation de l'USART, la fonction MX_USART2_UART_Init(). On retrouve les paramètres du STM32CubeMX.
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

Ensuite, il suffit de taper le code suivant dans le boucle while de la fonction main():
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_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    uint8_t  buffer[15] = "Hello world!";
    HAL_UART_Transmit(&huart2, buffer, sizeof(buffer), HAL_MAX_DELAY);
    HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
Une fois le code chargé, n'oubliez d'appuyer sur le bon reset pour faire prendre en compte le changement de code. Sur un terminal, on observe :


Conclusion

Nous avons vu comment transmettre des données ou du texte sur le port USART, il existe également une fonction HAL_UART_Receive() pour prendre en charge la réception des données.









Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2020 www.doritique.fr par Robert DORIGNY