STM32 串口DMA接收数据(高效接收数据)

关于重定义

极度不推荐在使用DMA的时候按照传统的方式进行重定义!!!
非常简单,轮询方式整个CPU 在串口发送时处于等待状态,但是使用DMA时无法确保当前DMA已经传输完成。
有同学可能会认为可以通过判断DMA的传输标志位来进行等待,但如果这样的话就丧失了DMA的设计意图:

再次使用经过优化的重定义:

找到usart.c这个c文件并打开:
先在这个文件里面添加头文件:#include 和#include
然后再用户代码区添加( UartTxBuf[128]需要设置全局,否则可能会出错):
 

unsigned char UartTxBuf[128]; 
void Usart1Printf(const char *format,...)
{
	
	uint16_t len;
	va_list args;	
	va_start(args,format);
	len = vsnprintf((char*)UartTxBuf,sizeof(UartTxBuf)+1,(char*)format,args);
	va_end(args);
	HAL_UART_Transmit_DMA(&huart1, UartTxBuf, len);
}

上述函数可以将Usart1Printf里面的要发送的数据打包后通过DMA一次完成传输,十分方便高效!!!

此函数用法和printf一致!!!

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  unsigned char s_buf[]="hello world\r\n";
  
  HAL_UART_Transmit_DMA(&huart1,s_buf,sizeof(s_buf));
  HAL_Delay(200);
  Usart1Printf("HELLO\r\n");
  HAL_Delay(200);
  Usart1Printf("HELLO%d\r\n",10);
  HAL_Delay(200);
  while (1)
  {

  }
}

效果如下: 

STM32 串口DMA接收数据(高效接收数据)_第1张图片 

转载:(49条消息) STM32CUBEMX配置教程(九)STM32串口DMA收发数据_cubemx uart dma发送和接收_怡步晓心l的博客-CSDN博客 

 

 

你可能感兴趣的:(stm32,单片机,嵌入式硬件)