打印

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

[复制链接]
12677|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
inurl|  楼主 | 2013-1-19 09:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 inurl 于 2013-1-19 09:31 编辑

stm32 波特率设成 115200*4 ,那么它传输一位时间是 1/115200/4  = 2.17us左右

收全一个字节要 (8+1+1)*2.17 = 20us

现在实测串口中断处理函数处理时间要 9us (包括等待一个字节接收完毕时间),这个时间够吗 ?

stm32串口没有FIFO ,真是让人啄级啊。

STM32是收到了一个起始位就产生了硬件中断吗? 然后再在中断处理函数里面等待硬件接收完毕一个字节?


相关帖子

沙发
huangxz| | 2013-1-19 10:17 | 只看该作者
"STM32是收到了一个起始位就产生了硬件中断吗? 然后再在中断处理函数里面等待硬件接收完毕一个字节?"
不是的,是收到一个字节以后才会产生中断的。中断处理要尽快退出,千万不能在中断里面有任何的等待。
另外:我觉的对于没有fifo的stm32来说,尽量不要用那么高的bps,9us的中断处理时间不算很长,以72M cpu时钟来说,20us*72=1440条单周期指令,能快点更好。

使用特权

评论回复
板凳
acguy| | 2013-1-19 10:18 | 只看该作者
串口有一个数据寄存器,完全收毕的字节先放到这个寄存器中,同时发出数据就绪中断。
你在中断处理中必须在下一字节接收完毕之前,把数据寄存器的内容读出来。否则数据寄存器的内容就被下一字节冲掉了。

使用特权

评论回复
地板
acguy| | 2013-1-19 10:20 | 只看该作者
或许轮询更符合你的要求。

使用特权

评论回复
5
inurl|  楼主 | 2013-1-21 08:32 | 只看该作者
顶起来再讨论下

使用特权

评论回复
6
jlass| | 2013-1-21 09:32 | 只看该作者
stm32 波特率设成 115200*4

这么高的波特率

使用特权

评论回复
7
inurl|  楼主 | 2013-1-21 10:09 | 只看该作者
jlass 发表于 2013-1-21 09:32
stm32 波特率设成 115200*4

这么高的波特率

:D 好像是很容易出错哈

使用特权

评论回复
8
inurl|  楼主 | 2013-1-21 10:14 | 只看该作者
huangxz 发表于 2013-1-19 10:17
"STM32是收到了一个起始位就产生了硬件中断吗? 然后再在中断处理函数里面等待硬件接收完毕一个字节?"
不 ...

:) 实际处理起来会丢字节的啦 , 很频繁的哦

使用特权

评论回复
9
inurl|  楼主 | 2013-2-18 18:50 | 只看该作者
acguy 发表于 2013-1-19 10:18
串口有一个数据寄存器,完全收毕的字节先放到这个寄存器中,同时发出数据就绪中断。
你在中断处理中必须在 ...

用DMA的话有个问题, 他要设置一个固定的DMA接收长度才进中断,但是串口数据无法固定长度

使用特权

评论回复
10
john_lee| | 2013-2-18 21:31 | 只看该作者
如果楼主的 UART 数据协议格式,能保证下面两点,就可以使用 DMA 接收:
1、发送方所发送的每个 packet 中的数据,要保证连续:即每两个 byte 之间的时间间隔,不要超过一个 byte frame 的时间。
2、发送方所发送的各个 packet 之间,要保证至少间隔一个 byte frame 的时间。

使用特权

评论回复
11
inurl|  楼主 | 2013-2-19 11:22 | 只看该作者
本帖最后由 inurl 于 2013-2-19 11:26 编辑
john_lee 发表于 2013-2-18 21:31
如果楼主的 UART 数据协议格式,能保证下面两点,就可以使用 DMA 接收:
1、发送方所发送的每个 packet 中 ...

用DMA接收的话,要设置DMA接收长度。但是UART接收的话,packet长度是不定的。
static void DMA_RxConfiguration(uint32_t *BufferDST, uint32_t BufferSize)    // 就是这个BUFFERSIZE是不定的!
{
  DMA_InitTypeDef DMA_InitStructure;

  DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);

  /* DMA2 Channel4 disable */
  DMA_Cmd(DMA2_Channel4, DISABLE);

  /* DMA2 Channel4 Config */
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA2_Channel4, &DMA_InitStructure);

  /* DMA2 Channel4 enable */
  DMA_Cmd(DMA2_Channel4, ENABLE);
}



使用特权

评论回复
12
john_lee| | 2013-2-19 12:01 | 只看该作者
换个角度考虑:就假设这个 UART 是有 FIFO 的,那么你如何接收不同长度的 packet ?

使用特权

评论回复
13
inurl|  楼主 | 2013-2-19 12:05 | 只看该作者
john_lee 发表于 2013-2-19 12:01
换个角度考虑:就假设这个 UART 是有 FIFO 的,那么你如何接收不同长度的 packet ? ...

可以一个字节进一次中断,但是DMA不能设置1个字节产生一次传输完成啊!

使用特权

评论回复
14
john_lee| | 2013-2-19 12:50 | 只看该作者
inurl 发表于 2013-2-19 12:05
可以一个字节进一次中断,但是DMA不能设置1个字节产生一次传输完成啊!


每个字节都中断?那么 FIFO 有意义吗?
stm32 的 UART 有 USART_DR 寄存器,你可以理解为深度只有 1 个字节的 FIFO,正好符合你的要求。
FIFO 和 DMA 的意义在于批量收发数据,减少中断次数,减轻 CPU 的开销,如果你不在乎这些开销,你就直接使用 USART_DR 就行了。

使用特权

评论回复
15
john_lee| | 2013-2-19 12:56 | 只看该作者
另外,你怎么知道“DMA不能设置1个字节产生一次传输完成”?

使用特权

评论回复
16
henryzheng| | 2013-2-20 16:38 | 只看该作者
用DMA是最可行的,  中断的话CPU的效率就行低了

使用特权

评论回复
17
inurl|  楼主 | 2013-2-20 19:37 | 只看该作者
本帖最后由 inurl 于 2013-2-20 19:42 编辑
henryzheng 发表于 2013-2-20 16:38
用DMA是最可行的,  中断的话CPU的效率就行低了

你有没有用过DMA的串口接收? 不是串口发送!  我觉得不大可行

使用特权

评论回复
18
inurl|  楼主 | 2013-2-20 19:40 | 只看该作者
本帖最后由 inurl 于 2013-2-20 19:44 编辑
john_lee 发表于 2013-2-19 12:50
每个字节都中断?那么 FIFO 有意义吗?
stm32 的 UART 有 USART_DR 寄存器,你可以理解为深度只有 1 个字 ...

每个字节都中断,FIFO怎么就没意义了?FIFO增加缓冲的时间,可以留给中断函数更多的时间去处理

使用特权

评论回复
19
inurl|  楼主 | 2013-2-20 19:40 | 只看该作者
本帖最后由 inurl 于 2013-2-20 19:44 编辑
john_lee 发表于 2013-2-19 12:50
每个字节都中断?那么 FIFO 有意义吗?
stm32 的 UART 有 USART_DR 寄存器,你可以理解为深度只有 1 个字 ...

每个字节都中断,FIFO怎么就没意义了?FIFO增加缓冲的时间,可以留给中断函数更多的时间去处理

使用特权

评论回复
20
john_lee| | 2013-2-20 19:44 | 只看该作者
inurl 发表于 2013-2-20 19:40
每个字节都中断,FIFO怎么就没意义了?

每个字节都中断,任何 uart 都有这个功能,比如 51 的 uart,你能说它有 fifo ?

使用特权

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

本版积分规则

37

主题

293

帖子

1

粉丝