打印

USART的DMA传输

[复制链接]
3005|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TT5656|  楼主 | 2012-12-28 23:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手请教大虾,在USART中用DMA方式传输时,USART是怎么向DMA发送请求信号的呢?是对寄存器的哪一步操作发出的信号吗?比如现在我编写一个程序,每按键一次就用DMA发送一个字符串,最后找了个办法就是在按键中断程序中添加以下代码:
                        USART_ClearFlag(USART2,USART_FLAG_TC);
                        DMA_Init(DMA1_Channel7,&DMA_InitStruct);
                        DMA_Cmd(DMA1_Channel7,ENABLE);
                        while(!USART_GetFlagStatus(USART2,USART_FLAG_TC));
                        DMA_Cmd(DMA1_Channel7,DISABLE);
每次都要重新初始化及使能DMA,请问有什么别的方法可以让同一外设重复请求DMA吗??
沙发
linc676085| | 2012-12-29 08:45 | 只看该作者
第一:请看《STM32F10x微控制器参考手册》的第24.3.12-利用DMA连续通信。
里面已经说了,只要TXE 位(RXNE位)被置起,就从配置成使用DMA外设的SRAM 区装载数据到USART_DR寄存器(USART_DR寄存器装载到DMA外设的SRAM 区)。
第二:我不太明白楼主的意思。楼主是不是要不在中断里每次重新初始化及使能DMA?

使用特权

评论回复
板凳
uet_cache| | 2012-12-29 09:29 | 只看该作者
官方外设库中有相应例程,可参考官方的配置。

使用特权

评论回复
地板
TT5656|  楼主 | 2012-12-29 20:14 | 只看该作者
linc676085 发表于 2012-12-29 08:45
第一:请看《STM32F10x微控制器参考手册》的第24.3.12-利用DMA连续通信。
里面已经说了,只要TXE 位(RXNE ...

是这样的,我希望用DMA从串口重复发送数据。比如每按键一次就从串口发出一个字符串。之前已配置好GPIO、NVIC、EXTI、USART和DMA,在外部中断程序中发送字符串。使能所有DMA和USART后发送一个字符串没有问题,可是再按键就无法发送了。应该如何设置才能再次发送这一字符串呢?试了好多方法都不行,暂时只有这种每次进入中断就需重新初始化和使能以及取消使能的方法,还有另一种DMA_DeInit()再Init()再使能的方法,DeInit()函数内部有取消使能DMA的操作,所以这两种方法是一样的。但其中的原因我还没有搞懂。有没有什么简便的方法可以使外设重复申请DMA的吗?
参考手册中DMA一节里说:在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。      如果没理解错的话,是外设向DMA发送一次请求,接受到DMA的应答信号后就释放请求,DMA与外设开始进行数据交互。那么以串口为例,串口向DMA发送初始请求时如何发送的呢?如果DMA发送完一个字符串,那么应该只要串口再次请求就能够再次发送。这个请求信号时如何体现的呢?DMA和USART的寄存器中好像只有使能位没有发送请求位,如果所有相关寄存器位都使能后就能发送请求,那么再次请求该如何发送呢?我试过重新使能USART->CR3的DMAT位,但是没有效果,重新使能USART也没有效果,重新使能DMA也没有没有效果,只有重新使能DMA并且初始化DMA后才能实现每按一次键就能发送一次字符串。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

61

帖子

0

粉丝