Articles récents
STM32 : Liaison série
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.
![](./Electronique/Images/stm32_4_1.jpg)
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.![](./Electronique/Images/stm32_4_2.png)
![](./Electronique/Images/stm32_4_3.png)
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 :
![](./Electronique/Images/stm32_4_4.png)
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.
© 2025 www.doritique.fr par Robert DORIGNY