【待续,啊啊啊啊】【找了一遍,最后成功!!】stm32 USART 防止发送缓冲区被新来的数据覆盖

来源:互联网 发布:识别文字的软件 编辑:程序博客网 时间:2024/03/28 19:57

除了发送数据后延时,我在尝试有没有其他办法。果然有!!微笑

最后结论是(6),以下列出的是其他失败的尝试。


尝试办法:

1.【走不通】空闲符号     见我的文章http://blog.csdn.net/ysmz4/article/details/46546761

2.【走不通】断开符号     见我的文章http://blog.csdn.net/ysmz4/article/details/46546761


3.发送后延时波特时钟,会不会已经避免了此问题。

看半双工通信协议==============

4.【走不通】USART_SetGuardTime(USARTx, timevalue);//保护时间值 (Guard time value)

但是这是在智能卡模式下的,不能单独设置。(单独设置没有效果)

5.【听说太麻烦】硬件流控(CTS,RTS)

需要串口DB9的硬件连线+软件控制。详见我的文章《串口硬件流量控制说明》


6. 利用TXE+TC标志  

    面对的问题是:中断发送时——发送缓冲区不为空(帧没发送完),新帧就将其覆盖。(而不是两包之间(TC就可保证无误))

      DMA发送时——发送缓冲区不为空(包没发送完),新包就将其覆盖。(注:DMA发送模拟打包和拆包,就是说DMA连续发送两包时,不用担心一包内的数据覆盖非空发送缓冲区的情况)

   参考手册,图251"发送时TC/TXE的变化情况":


其实参考手册里已经说明了如何防止发送缓冲区里的内容被覆盖(DMA部分)



------------------------------------------实现------------------------------------------------

DMA下发送部分程序:

#if BSP_485_DMA_EN      USART_ITConfig(BSP_USART_485, USART_IT_TC, ENABLE);     while((USART_GetFlagStatus(BSP_USART_485, USART_FLAG_TXE) == RESET)||        //这两行保证了发送缓冲区不被覆盖!!          (USART_GetFlagStatus(BSP_USART_485, USART_FLAG_TC) == RESET)) {}        DMA_Cmd(BSP_485_DMA_T_CH, DISABLE);     BSP_485_DMA_T_CH->CNDTR =   len;         ///发送数量设置    DMA_Cmd(BSP_485_DMA_T_CH, ENABLE); 


串口单个/中断发送下的程序:

http://blog.sina.com.cn/s/blog_53219feb0100ncaj.html




BUT!!头儿要求有根据,而不是实验结果没错就行了。所以,我要搞明白DMA发送两包时,有没有可能被接收端看成一包,也就是说发送端总线空闲(高电平)的时间至少为多久。

我离彻底明白还有段距离啊,啊啊啊啊啊啊啊啊啊啊

继续研究,第二波。。。。


一、首先需要知道stm32总线架构。   参见我的文章《【漂亮!!】DMA深度剖析》   http://blog.csdn.net/ysmz4/article/details/46681877

然后基本可以解释这个问题:

Q:其他任务抢占有没可能令dma发送不完全(即被打断)?
A:有可能,但有前提。

原因:多层结构允许两个主设备并发执行数据传输,只要他们寻址到不同的设备。(《AN2548 应用笔记 》)(应该理解为不同的从总线)
          《STM32F10x 产品架构的效率》示例图有说明。

”DMA和CPU只是在需要通过一个给定的从总线进行数据访问时才会产生竞争。“

总线挪用 vs 突发模式。参考手册里只在以太网中发现突发模式。

”推荐DMA总线使用保持在2/3以下。“

                (ysmz4:看不太懂,项目完成后需要计算DMA使用时间。)


二、USART_DMA时序

(自定义的DMA接收函数是假设已知接收长度。所以只凭分析将得出:若两帧真的被DMA receiver看做一帧,则第二帧将被丢弃。为了知道是否有这种情况,需要研究两帧之间的间隙是否足够长(被DMA receiver探测到))


暂不考虑cpu与DMA的总线竞争。
那么:当两包连续到来时,DMA接收期待是都接收到,并放到不同的fifo。(而不是两包(or几包)被认为是一包而导致放到同一个fifo)
接收数据包的长度上层是已知的(接口看来是这样)。


连续来的两包被DMA接收端看做一包的条件是:两包之间时长小于idle中断置起需要的时间——因为 接收端根据idle中断判断一包接收完毕。

idle中断置起的条件是:总线空闲中断是在检测到在接收数据后,数据总线上一个字节的时间内,没有再接到数据后发生。

idle需要一个字符的时长,modbus需要3-5个字符时长来证明到结尾。但是还是没说服力说明用DMA idle接收来替代发送后给出延时。
现在我需要足够证据证明(如果能的话)两包间的时延大于一帧。


两包之间时长最短为多少?



0 0
原创粉丝点击