Для связи по интерфейсу UART вы можете использовать блокирующий режим или неблокирующий режим с использованием прерывания. В блокирующем режиме все другие операции блокируются до завершения связи по UART, тогда как другие операции могут выполняться независимо от UART в неблокирующем режиме и выполняться критичные по времени операции. UART DMA – это неблокирующая операция, она сокращает количество прерываний и улучшает реальное время связи.
В данном материале будет рассказано, как использовать UART DMA в микроконтроллерах STM32F103.
В качестве порта для UART DMA мы будем использовать UART4. Итак, сначала выберите «Pinout & Configuration» в STM32CubeIDE, затем настройте все, как показано далее.
Выберите Configuration - DMA Setting и нажмите на кнопку Add, чтобы выбрать UART_TX. Выберите «Normal» в «Mode». В «нормальном» режиме передача/прием через DMA происходит только один раз. В случае, если вам нужно выполнять передачу/прием через DMA многократно без вмешательства пользователя, вам следует выбрать «Circular».
Затем проверьте, включено ли «UART4 global interrupt» в «NVIC Settings». В «нормальном» режиме, если «UART4 global interrupt» не включено, операция DMA не будет запущена при следующем вызове функции, потому что состояние UART не изменится на HAL_UART_STATE_READY.
После вышеуказанной конфигурации выполните «Generate Code», а затем вы можете проверить, что «MX_DMA_Init()» добавлено в main.c.
Затем добавьте коды для вызова HAL_UART_Transmit_DMA каждую секунду в блоке while(). В нашем коде UART1 будет передавать данные без DMA, а UART4 будет делать это с использованием DMA. Вызов HAL_UART_Transmit_DMA() – это все, что вам нужно.
while (1)
{
/* ПОЛЬЗОВАТЕЛЬСКИЙ КОД */
/* ПОЛЬЗОВАТЕЛЬСКИЙ КОД 3 */
if(onesecondElapsed)
{
onesecondElapsed = 0;
count++;
memset(msg, 0, 200);
sprintf((char *)msg, "UART1,[%d],%srn", count, message);
HAL_UART_Transmit(&huart1, msg, strlen((const char*)msg), 20);
memset(dma_buf, 0, 200);
sprintf((char *)dma_buf, "UART4 DMA,[%d],%srn", count, message);
HAL_UART_Transmit_DMA(&huart4, dma_buf, strlen((const char*)dma_buf));
}
loopback_tcps(0, ethBuf0, 5000);
}
Скомпилируйте и загрузите двоичный файл, используя STM32CubeProgrammer, как обычно. Затем запустите Putty, чтобы отслеживать, что отправляет STM32F103.
© digitrode.ru