Coming soon |
This article explains what is UART and how to use it through examples
1. What is a Universal Asynchronous Receiver Transmitter (UART)
The universal synchronous/asynchronous receiver transmitter (USART/UART) offers a flexible means of Full-duplex data exchange with external equipment requiring an industry standard NRZ asynchronous serial data format. The USART offers a very wide range of baud rates using a programmable baud rate generator. It supports synchronous one-way communication and Half-duplex Single-wire communication, as well as multiprocessor communications. It also supports the LIN (Local Interconnect Network), Smartcard protocol and IrDA (Infrared Data Association) SIR ENDEC specifications and Modem operations (CTS/RTS). High speed data communication is possible by using the DMA (direct memory access) for multibuffer configuration. Also, the UART can be used with interrupt.
The main of this article is to describe the UART features and precisely:
- Simple UART Communication
- UART with Interrupt
- UART with DMA
2. Objectives
The objectives of this wiki article are to know how to setup UART and generate code with STM32CubeIDE and how to use HAL functions.
3. Create the project in STM32CubeIDE
- File > New > STM32 Project in main panel.
In this example the NUCLEO-L476RG board is used.
- Select NUCLEO-L476RG board using Board Selector as shown in the below figure.
In case you haven't downloaded the STM32L476 Cube library, it will be downloaded automatically, it may take some time.
- Save the project.
- Initialize all peripherals with their default settings.
Answer “Yes” to initialize all peripherals with their default mode? Popup as below:
4. UART Configuration
- Choose the USART1 mode on Asynchronous mode.
- Set the parameter settings as shown in the below figure.
5. GPIO Configuration
To choose the correct GPIOs pins, it is necessary to refer to the datasheet and precisely Alternate function table.
For the STM32L476 USART2 communication is connected to PA2 for transmission and PA3 for reception as shown below.
File:STM32L476 datasheet table.png
For that, PA2 and PA3 are configured in alternate function mode.
File:GPIO configuration.png
6. Generate source code
Click "Ctrl+S" to generate the project
6.1. Simple UART Communication
6.1.1. Hardware preparation
Work in pairs boards, one will create transmitter and second receiver.
For that, the two boards are connected as follows:
- Rx board 1 connected with Tx board 2.
- Tx board 1 connected with Rx board 2.
- Connected the GND board 1 with GND board 2.
File:Hardware USART communication.png
6.1.2. Edit main.c
- definite buffer
/* USER CODE BEGIN 0 */
uint8_t tx_buff[]={0,1,2,3,4,5,6,7,8,9};
uint8_t rx_buff[10];
/* USER CODE END 0 */
- Transmit and Receive data
/* USER CODE BEGIN 2 */
HAL_UART_Receive(&huart1,rx_buff,10,1000);
HAL_UART_Transmit(&huart1,tx_buff,10,1000);
/* USER CODE END 2 */
- Complete callback
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
__NOP();
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
__NOP();
}
/* USER CODE END 4 */
- Compile and flash
First of all, build your project .
Then debug it when you used only NUCLEO-L476RG.
Connect the second Nucleo-L476RG.
Click Reset button of board 1 then Click Reset button of the board 2 and finally Click Reset button of board 1.
Click on Resume button to execute the code.
Click on suspend to show the expressions in the tx_buff and rx_buff.
File:Expressions show UART.png
6.2. UART with Interrupt
6.2.1. Hardware preparation
Rx connected with Tx to create loopback as shown in the below figure.
File:Hardware USART Interrupt.png
6.2.2. Configure UART Interrupt
Open the UART.ioc file in the STM32Cube IDE project as shown in the below figure.
Enable the USART2 global interrupt.
File:Configure UART Interrupt604 × 317.png
6.2.3. Generate project and edit main.c
Click "Ctrl+S" to generate the project
- Definite buffer
/* USER CODE BEGIN 0 */
uint8_t tx_buff[]={0,1,2,3,4,5,6,7,8,9};
uint8_t rx_buff[10];
/* USER CODE END 0 */
- Send and Receive data
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2,rx_buff,10);
HAL_UART_Transmit_IT(&huart2,tx_buff,10);
/* USER CODE END 2 */
- Complete callback
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
__NOP();//check if we receive all data
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
__NOP();//check if we transmit all data
}
/* USER CODE END 4 */
- Compile and flash
First of all, build your project
Then debug it
Click on Resume button to execute the code.
Click on suspend to show the expressions in the tx_buff and rx_buff.
File:Expressions show view UART with Interrupt.png
6.3. UART with DMA
6.3.1. Hardware preparation
Rx connected with Tx to create hardware loopback as already mentioned in 6.2.1 Hardware preparation section.
6.3.2. HAL library workflow summary
File:HAL lib UART with DMA.png
6.3.3. Configure UART DMA
Open the UART.ioc file in the STM32Cube IDE project as shown in the below figure.
Add the DMA request as shown in the below figure.
File:Configure UART DMA.png
6.3.4. Generate project and edit main.c
Click "Ctrl+S" to generate the project
- Definite buffer
/* USER CODE BEGIN 0 */
uint8_t tx_buff[]={0,1,2,3,4,5,6,7,8,9};
uint8_t rx_buff[10];
/* USER CODE END 0 */
- Send and Receive data
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart2,rx_buff,10);
HAL_UART_Transmit_DMA(&huart2,tx_buff,10);
/* USER CODE END 2 */
- Complete callback
/* USER CODE BEGIN 4 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
__NOP();//check if we receive all data
}
/* USER CODE END 4 */
- Compile and flash
First of all, build your project
Then debug it
Click on Resume button to execute the code.
Click on suspend to show the expressions in the tx_buff and rx_buff.
File:Expressions show view UART with DMA.png
[[category:Getting_started_with_STM32_system_peripherals | 35]]