STM32 HAL Uart

В сегодняшней статье рассмотрим как работать с функциями STM32 HAL Uart. подробно разберем каждую функцию, а так же рассмотрим небольшой пример.

STM32 Uart

В микроконтроллерах STM32, в зависимости от количества выводов, может быть от 1 до 6 блоков UART/USART а также LPUART

STM32 Uart в CubeMx
  • UART — Universal asynchronous receiver/transmitter или если по простому асинхронный приема передатчик.
  • USART — Universal Synchronous/Asynchronous Receiver/Transmitter или, синхронный/асинхронный приема передатчик.
  • LPUART — это тот же UART, только с пониженным энергопотреблением.

Прием и передача по Uart может осуществляться в следующих режимах:

  • Прием и передача данных в режиме опроса.
  • Прием и передача данных с помощью прерываний.
  • Прием и передача данных с помощью DMA.

Для каждого из режимов у STM32 имеются свои функции HAL Uart.

Функции HAL UART в режиме опроса

HAL Uart Transmit

Передача данных в режиме опроса осуществляется с помощью функции HAL_UART_Transmit:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout), где

  • huart — указатель на используемый UART.
  • pData — массив с данным для отправки.
  • Size — количество байт. которые нужно отправить.
  • Timeout — время ожидания отправки.

HAL Uart Receive

Для того, что бы принять данные по UART, необходимо использовать функцию HAL_UART_Receive:

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout), где

  • huart — указатель на используемый UART.
  • pData — указатель на приемный буфер.
  • Size — количество байт, которые нужно принять.
  • Timeout — время ожидания отправки.

ВНИМАНИЕ! В данном режиме функции приема и передачи данных, блокируют работу основного цикла на время приема или отправки данных. Или на время Timeout.

Функции HAL UART в режиме прерываний

HAL Uart Transmit IT

Передача данных в режиме прерываний осуществляется с помощью функции HAL_UART_Transmit_IT:

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size), где

  • huart — указатель на используемый UART.
  • pData — массив с данным для отправки.
  • Size — количество байт. которые нужно отправить.

HAL Uart Receive IT

Для того, что бы принять данные по UART в режиме прерываний, необходимо использовать функцию HAL_UART_Receive_IT:

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size), где

  • huart — указатель на используемый UART.
  • pData — указатель на приемный буфер.
  • Size — количество байт, которые нужно принять.

В режиме прерываний функции приема и передачи данных не блокируют основной цикл программы, что является плюсом.

Функции HAL в режиме DMA

HAL Uart Transmit DMA

Передача данных в режиме прерываний осуществляется с помощью функции HAL_UART_Transmit_DMA:

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size), где

  • huart — указатель на используемый UART.
  • pData — массив с данным для отправки.
  • Size — количество байт. которые нужно отправить.

HAL Uart Receive DMA

Для того, что бы принять данные по UART в режиме прерываний, необходимо использовать функцию HAL_UART_Receive_DMA:

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size), где

  • huart — указатель на используемый UART.
  • pData — указатель на приемный буфер.
  • Size — количество байт, которые нужно принять.

В режиме DMA функции приема и передачи данных не блокируют основной цикл программы, а так же прием или передача данных осуществляется без участия процессора.

Пример программы на STM32

Рассмотрим пример программы приема передаче через UART c использованием прерываний:

// Использовать будем USART2
uint32_t SIZE_BUFFER = 125;
uint8_t BuferRxDEBUG[SIM8xx_SIZE_BUFFER];

//В main после инициализации UART
MX_USART2_UART_Init();
//необходимо вызвать функцию приема байта. Этим мы активируем начало работы приема
HAL_UART_Receive_IT(&huart2, &getbyteDb, 1);
// Для приема данных будем использовать функцию Callback. Данная функция выполняется когда завершен прием 1 байта.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    /* Prevent unused argument(s) compilation warning */
    if(huart==&huart2)
    {
	HAL_UART_Receive_IT(&huart2, &getbyteDb, 1);
	BuferRxDEBUG[pGetByteDb] = getbyteDb;
	pGetByteDb++;
        // если достигли признака конца строки, очищаем буфер и обнуляем счетчик принятых байт
	if (RxBuf_Bytes((uint8_t*)BuferRxDEBUG, (uint8_t *) END_OF_MESSAGE_STRING, SIZE_BUFFER))
	{
	     Flush_Buf(BuferRxDEBUG, SIZE_BUFFER);
	     pGetByteDb = 0;
	}
     }
}
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии