OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3046|回复: 5

怎么用usart+dma+printf

[复制链接]

9

主题

31

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-9-13
在线时间
24 小时
发表于 2017-3-13 15:32:34 | 显示全部楼层 |阅读模式
118金钱
在使用USART来向电脑传输数据的时候,传递速度比较慢,故使用dma方式。但是发现DMA传输的数据是16进制,不能向printf函数一样的格式输出,为了方便观察数据,我想DMA输出向printf一样,但是都没有实现。。。
求大神帮助啊!!!!给点指导!!!或者例程!!!附上全部金钱!!!

最佳答案

查看完整内容[请看2#楼]

可以自己改写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;jSR&0X40)==0); // ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-13 15:32:35 | 显示全部楼层
可以自己改写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传输结束的,实际上节省的时间,并不明显。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-1-6
在线时间
32 小时
发表于 2017-3-13 15:39:53 | 显示全部楼层
可以更改波特率来提高传输速度啊
回复

使用道具 举报

9

主题

31

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-9-13
在线时间
24 小时
 楼主| 发表于 2017-3-13 16:10:17 | 显示全部楼层
爱娟娟 发表于 2017-3-13 15:39
可以更改波特率来提高传输速度啊

速度不够。。。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-13 17:37:53 | 显示全部楼层
printf说到底还是通过uart来发数据,这个跟什么格式没啥关系吧~你只要修改printf对接底层的接口为DMA的收发方式就可以了
回复

使用道具 举报

9

主题

31

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-9-13
在线时间
24 小时
 楼主| 发表于 2017-3-13 20:55:40 | 显示全部楼层
正点原子 发表于 2017-3-13 15:32
可以自己改写printf
参考我们的扩展例程,蓝牙模块实验的,printf自定义写法如下:
[mw_shl_code=c,true] ...

好的,我来试试!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-14 02:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表