怎么用usart+dma+printf

2019-10-11 17:03发布

在使用USART来向电脑传输数据的时候,传递速度比较慢,故使用dma方式。但是发现DMA传输的数据是16进制,不能向printf函数一样的格式输出,为了方便观察数据,我想DMA输出向printf一样,但是都没有实现。。。
求大神帮助啊!!!!给点指导!!!或者例程!!!附上全部金钱!!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-10-11 17:06
可以自己改写printf
参考我们的扩展例程,蓝牙模块实验的,printf自定义写法如下:
[mw_shl_code=c,true]//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)  
{  
        u16 i,j;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART3_TX_BUF,fmt,ap);
        va_end(ap);
        i=strlen((const char*)USART3_TX_BUF);                //此次发送数据的长度
        for(j=0;j<i;j++)                                                        //循环发送数据
        {
                while((USART3->SR&0X40)==0);                        //循环发送,直到发送完毕   
                USART3->DR=USART3_TX_BUF[j];  
        }
}[/mw_shl_code]

你如果要改成DMA传输,那就只需要修改for循环发送,改为DMA就可以了。
不过,这样我认为你也是要等待DMA传输结束的,实际上节省的时间,并不明显。
爱娟娟
2楼-- · 2019-10-11 19:03
 精彩回答 2  元偷偷看……
SHU
3楼-- · 2019-10-11 23:07
爱娟娟 发表于 2017-3-13 15:39
可以更改波特率来提高传输速度啊

速度不够。。。
小陀螺爱炒蛋
4楼-- · 2019-10-11 23:43
printf说到底还是通过uart来发数据,这个跟什么格式没啥关系吧~你只要修改printf对接底层的接口为DMA的收发方式就可以了
SHU
5楼-- · 2019-10-12 04:29
正点原子 发表于 2017-3-13 15:32
可以自己改写printf
参考我们的扩展例程,蓝牙模块实验的,printf自定义写法如下:
[mw_shl_code=c,true] ...

好的,我来试试!

一周热门 更多>