发新帖我要提问
12
返回列表
打印

STM32的串口中断最大处理时间

[复制链接]
楼主: inurl
手机看帖
扫描二维码
随时随地手机跟帖
21
inurl|  楼主 | 2013-2-20 19:45 | 只看该作者 回帖奖励 |倒序浏览
john_lee 发表于 2013-2-20 19:44
每个字节都中断,任何 uart 都有这个功能,比如 51 的 uart,你能说它有 fifo ? ...

你太无聊了,我不跟你说了

使用特权

评论回复
22
john_lee| | 2013-2-20 19:51 | 只看该作者
inurl 发表于 2013-2-20 19:40
每个字节都中断,FIFO怎么就没意义了?FIFO增加缓冲的时间,可以留给中断函数更多的时间去处理
...

你的程序有忙等并关闭中断超过 20us 的?

使用特权

评论回复
23
inurl|  楼主 | 2013-2-20 19:56 | 只看该作者
john_lee 发表于 2013-2-20 19:51
你的程序有忙等并关闭中断超过 20us 的?

yes

使用特权

评论回复
24
john_lee| | 2013-2-20 19:56 | 只看该作者
inurl 发表于 2013-2-20 19:45
你太无聊了,我不跟你说了

像你这种态度,只有自己玩去吧。

使用特权

评论回复
25
inurl|  楼主 | 2013-2-20 20:10 | 只看该作者
本帖最后由 inurl 于 2013-2-21 12:59 编辑

已经解决了

http://www.amobbs.com/thread-5486343-1-1.html
“STM32学习笔记三 竹天笑前言:开始学USART+DMA的时候看到帖子《STM32 UART DMA实现未知数据长度接收》,觉得方法妙极了。此下出自此帖子——(整体的思路是这样的,一开始设置好DMA接收,可以把缓冲区长度设置为帧最大长度,我们可以把RX连接到定时器的管脚输入端,并且一开始设置输入并且使能引脚下降沿中断,当帧的第一个字节发送时,因为起始位为低电平,空闲时UART为高电平,满足条件,进入中断,禁止中断,并且在中断中开启定时器,该定时器工作在复位模式,上升沿复位,并且设置好定时器输出比较值为超时时间,比如20ms,这样,在传输后面字节时,肯定会有高低电平出现,即便是传输的是0x00,0xFF,虽然UART数据区不变,但是都为1,或都为0,但是因为起始位为低电平,停止位是高电平,所以肯定会有上升沿,定时器会一直复位,输出定时器的计数器一直到达不了输出比较值,当一帧传输结束后,定时在最后一个字节复位后,由于没有数据继续到达,无法复位,则计数器就能计到输出比较值,这时发出中断,在定时器中断中可以计算出接收数据的长度,并且通知外部数据已经接收完毕。)”
    今天我在工作中调通了另一种USART+DMA接收未知数据长度的接收,使用的是USRAT空闲总线中断接收,这种方法也在网站上比较多见,以前没试过,今天才知道如此的爽,另外我使用DMA发送USART数据替代了以前的查询法发送,发现更加爽了。其速度快了很多,尤其是在大量数据传输与发送的时候其优势更加明显。


使用特权

评论回复
26
inurl|  楼主 | 2013-2-20 20:11 | 只看该作者
  楼上的一个个版主都是站着说话不腰痛,开口闭口DMA, 也不想下到底能不能行, 真浮躁!!!

使用特权

评论回复
27
henryzheng| | 2013-2-21 10:55 | 只看该作者
inurl 发表于 2013-2-20 19:37
你有没有用过DMA的串口接收? 不是串口发送!  我觉得不大可行

STM32F10x的com1~com4是可以的,  com5不行, 可以看技术手册。

使用特权

评论回复
28
john_lee| | 2013-2-21 12:39 | 只看该作者
inurl 发表于 2013-2-20 20:11
楼上的一个个版主都是站着说话不腰痛,开口闭口DMA, 也不想下到底能不能行, 真浮躁!!! ...

谁浮躁?我看是你吧,你自己先入为主的想着要每个字节都中断,自己脑袋里有个框框,还想把别人的意见硬往你这个框框里套。
看看你所谓的解决办法,还需要一个额外的硬件定时器,真是多余又浪费,而且还要 PCB 配合,虽然能实现功能需求,但实在是笨办法,你仔细看看我在10楼的提示,如果满足要求,那么这种方法使用 DMA + UART idle 中断是最理想的:设置 DMA 接收长度为缓冲区最大长度,并使能 idle 中断,然后启动 UART 和 DMA 开始接收,如果数据是一个一个紧接着的,即上一字节的结束位与下一字节的起始位之间的隔间不超过一个字节的传输时间,这个时间是 idle 的触发时间门限,那么数据就一个一个地被 DMA 保存到缓冲区;如果一个字节接收完成后,下个字节在 idle 门限时间内仍没有到来,那么 idle 中断将被触发,意思就是表示一个 packet 已经结束,你可以到 DMA 的当前传输指针寄存器中找到实际传输了多少字节,在 idle 中断处理中,你需要停止 DMA,因为 DMA 并没有全部传输指定的长度。

使用特权

评论回复
29
john_lee| | 2013-2-21 12:46 | 只看该作者
另,stm32 的 idle 门限时间是定死的,就是一个字节的传输时间,如果你的波特率是 115200 * 4,那么这个门限时间大概是 21.7us。
如果你确定你的 packet 之内的每个字节的间隔不超过这个门限,就可以使用这种方法。如果超过了,算我没说。
附带吐槽一下 stm32,别的一些 MCU 的门限时间,是可以设置的,这样能够容忍更长的间隔时间。

使用特权

评论回复
30
tengyong10| | 2013-2-23 22:13 | 只看该作者
串口与DMA传输,最高可以以达到4.5Mbps。

使用特权

评论回复
31
ye_song| | 2014-3-22 16:02 | 只看该作者
mark

使用特权

评论回复
32
zchong| | 2014-3-23 18:05 | 只看该作者
DMA+环形缓冲区

使用特权

评论回复
33
penghuiyanbiyun| | 2014-12-23 09:59 | 只看该作者
串口中断确实是个头疼的问题,虽然我现在还没用到DMA方式。MARK一下先。

使用特权

评论回复
34
zou2012| | 2015-12-16 09:23 | 只看该作者
inurl 发表于 2013-1-21 10:14
实际处理起来会丢字节的啦 , 很频繁的哦

波特率高,意味着接收完整一个字节需要的时间就短,那么要求CPU在中断读数据的处理要更快。处理完中断之后,若下个字节还没有接收完,那么CPU回到后台继续处理其他程序。因此,在接收一帧数据的过程中,CPU一会跑进中断,一会执行后台程序。应该是这个过程吧?

使用特权

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

本版积分规则