关于重定义
极度不推荐在使用DMA的时候按照传统的方式进行重定义!!!
非常简单,轮询方式整个CPU 在串口发送时处于等待状态,但是使用DMA时无法确保当前DMA已经传输完成。
有同学可能会认为可以通过判断DMA的传输标志位来进行等待,但如果这样的话就丧失了DMA的设计意图:
再次使用经过优化的重定义:
找到usart.c这个c文件并打开:
先在这个文件里面添加头文件:#include <stdarg.h>和#include <stdio.h>
然后再用户代码区添加( 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)
{
}
}
效果如下:
转载:(49条消息) STM32CUBEMX配置教程(九)STM32串口DMA收发数据_cubemx uart dma发送和接收_怡步晓心l的博客-CSDN博客
文章来源地址https://www.toymoban.com/news/detail-604075.html文章来源:https://www.toymoban.com/news/detail-604075.html
到了这里,关于STM32 串口DMA接收数据(高效接收数据)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!