现在的位置: 首页 > 综合 > 正文

stm32 串口 DMA变长收发好开心~~

2019年03月22日 ⁄ 综合 ⁄ 共 1005字 ⁄ 字号 评论关闭

发送

1.  DMA发送可以没有中断,当DMA通道打开时自动发送。

2. 防止发送缓冲区被新来的数据覆盖  参见 http://blog.csdn.net/ysmz4/article/details/46549041

接收

stm32例程上用的RXNE中断。但当已知接收帧的最大长度,总线空闲中断更好(开始接收后,过一段时间内总线空闲(过多久判定为总线空闲:当检测到停止位后,在一定时间内未接收到数据时。有空查查数据手册...),则认为DMA接收完毕)。

按照这个做就可以。

http://blog.csdn.net/jdh99/article/details/8444474

上文关键在于:

1. temp = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);   实际接收数 = 设置大小 -DMA空闲大小 

       我把temp返回给处理函数,实际接收数就得到了。

2.    一定要有这句: 
        DMA_SetCurrDataCounter(DMA2_Channel3,R_B_SIZE); //设置传输数据长度 

       即使我用的这个版本(v2.0)没有该接口,但是一定要从高版本(v3.5)上拷过来。

      因为:第二次接收的时候要重新配置长度。如果没有这句,DMA缓冲区将不清空!!泪奔~~~大笑得意

3.485总线为半双工,意思是:在某时刻下,Tx和Rx只能有一个使能,由485控制线(置位1or 0)来控制。

【DMA_Mode】DMA_Mode_Circular   vs  DMA_Mode_Normal,循环模式有什么用?

循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。

【其他文章,mark】

对于DMA彻底研究  http://blog.chinaunix.net/uid-21658993-id-3030728.html

对于DMA彻底研究(2)   AD转换之DMA  http://blog.chinaunix.net/uid-21658993-id-3031512.html

USART_DMA 位置长度的接收 需TMR  

http://www.amobbs.com/thread-5186206-1-1.html 

抱歉!评论已关闭.