使用dma将数据从内存发送到串口,为什么没有串口输出函数,数据就会发送到串口调试助手。


#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_dma_mtp.h"

extern uint8_t SendBuff[SENDBUFF_SIZE];

void Delay( uint32_t count )
{
    for (; count!=0;count--);
}


int main(void)
{
    uint16_t i;
    // 来到这里的时候,系统的时钟已经被配置成72M。
    LED_GPIO_Config();    
    
    USART_Config();
    
    for ( i=0; i'P';
    }
    
    USARTx_DMA_Config();
    USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);
    
    while (1)
    {
        LED_B(ON);
    }
}

基于Monster 组和GPT的调写:

  • 在STM32中,DMA是一种直接内存访问技术,可以在不经过CPU的情况下,把数据从内存传输到外设。串口输出也是一种外设操作,要把要发送的数据传输到串口寄存器中,才能通过串口发送出去。
  • 在上述代码中,看到有一个USARTx_DMA_Config()函数,该函数用于配置USART的DMA传输功能。在这里,开启了USART的DMA发送请求,并将数据存储在SendBuff数组中。由于我们没有提供串口输出函数,所以数据并没有经过CPU处理,而是直接通过DMA传输到了USART寄存器中,从而发送到了串口调试助手。
  • 所以,可以得出结论:在用DMA传输数据到串口时,不需要提供串口输出函数,只要配置好USART的DMA传输功能,并将要发送的数据存储在指定的内存地址中即可。
该回答引用ChatGPT
在这段代码中,使用了DMA将数据从内存发送到串口,但是没有显式地调用串口输出函数,数据却能够发送到串口调试助手。这是因为在USARTx_DMA_Config函数中,已经配置了DMA的传输方向和传输数据的地址,当USART_DMACmd函数使能DMA请求后,DMA会自动将数据从内存中读取并发送到串口,无需再调用串口输出函数。
具体来说,USARTx_DMA_Config函数配置了DMA的传输方向为从内存到外设(即USART),并设置了DMA的传输数据的地址为SendBuff数组的首地址。而USART_DMACmd函数使能了USART的DMA请求,即当USART的发送寄存器为空时,会向DMA发送请求,DMA会自动将数据从内存中读取并发送到USART的发送寄存器中。
因此,即使没有显式地调用串口输出函数,数据也能够发送到串口调试助手。不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/212153
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:百度DMA+小度App的蓝牙语音解决方案入局
  • 除此之外, 这篇博客: 实现DMA从存储器到外设的数据传输中的 存储器数据写入 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    本来我对这段代码不了解,后来搞懂了回车换行就清楚了,代码写得很好。
    它要把数据放入输入数据缓冲区中,填入的是整数个TEXT_TO_SEND里面的内容。
    u8 SendBuff[SEND_BUF_SIZE]; //发送数据缓冲区
    开始写入第一句未写完执行外层if的else情况,直至写完执行内层if语句的else情况,写入0X0D(为回车符’\r’),同时mask加1,接着执行上一部分,写入0X0A(为换行符’\n’),同时将t清零,开始写第二句,如此重复,直至写满数据缓冲区。

    	j=sizeof(TEXT_TO_SEND);	   
    	for(i=0;i<SEND_BUF_SIZE;i++)//填充ASCII字符集数据
        {
    		if(t>=j)//加入换行符
    		{
    			if(mask)
    			{
    				SendBuff[i]=0x0a;
    				t=0;
    			}else 
    			{
    				SendBuff[i]=0x0d;
    				mask++;
    			}	
    		}else//复制TEXT_TO_SEND语句
    		{
    			mask=0;
    			SendBuff[i]=TEXT_TO_SEND[t];
    			t++;
    		}   	   
        }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^