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

[复制链接]
14835|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 | 显示全部楼层
或许轮询更符合你的要求。
 楼主| inurl 发表于 2013-1-21 08:32 | 显示全部楼层
顶起来再讨论下
jlass 发表于 2013-1-21 09:32 | 显示全部楼层
stm32 波特率设成 115200*4

这么高的波特率
 楼主| inurl 发表于 2013-1-21 10:09 | 显示全部楼层
jlass 发表于 2013-1-21 09:32
stm32 波特率设成 115200*4

这么高的波特率

:D 好像是很容易出错哈
 楼主| inurl 发表于 2013-1-21 10:14 | 显示全部楼层
huangxz 发表于 2013-1-19 10:17
"STM32是收到了一个起始位就产生了硬件中断吗? 然后再在中断处理函数里面等待硬件接收完毕一个字节?"
不 ...

:) 实际处理起来会丢字节的啦 , 很频繁的哦
 楼主| inurl 发表于 2013-2-18 18:50 | 显示全部楼层
acguy 发表于 2013-1-19 10:18
串口有一个数据寄存器,完全收毕的字节先放到这个寄存器中,同时发出数据就绪中断。
你在中断处理中必须在 ...

用DMA的话有个问题, 他要设置一个固定的DMA接收长度才进中断,但是串口数据无法固定长度
john_lee 发表于 2013-2-18 21:31 | 显示全部楼层
如果楼主的 UART 数据协议格式,能保证下面两点,就可以使用 DMA 接收:
1、发送方所发送的每个 packet 中的数据,要保证连续:即每两个 byte 之间的时间间隔,不要超过一个 byte frame 的时间。
2、发送方所发送的各个 packet 之间,要保证至少间隔一个 byte frame 的时间。
 楼主| 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长度是不定的。
  1. static void DMA_RxConfiguration(uint32_t *BufferDST, uint32_t BufferSize)    // 就是这个BUFFERSIZE是不定的!
  2. {
  3.   DMA_InitTypeDef DMA_InitStructure;

  4.   DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);

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

  7.   /* DMA2 Channel4 Config */
  8.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_Address;
  9.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST;
  10.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  11.   DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
  12.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  13.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  14.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  15.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  16.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  17.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  18.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  19.   DMA_Init(DMA2_Channel4, &DMA_InitStructure);

  20.   /* DMA2 Channel4 enable */
  21.   DMA_Cmd(DMA2_Channel4, ENABLE);
  22. }



john_lee 发表于 2013-2-19 12:01 | 显示全部楼层
换个角度考虑:就假设这个 UART 是有 FIFO 的,那么你如何接收不同长度的 packet ?
 楼主| inurl 发表于 2013-2-19 12:05 | 显示全部楼层
john_lee 发表于 2013-2-19 12:01
换个角度考虑:就假设这个 UART 是有 FIFO 的,那么你如何接收不同长度的 packet ? ...

可以一个字节进一次中断,但是DMA不能设置1个字节产生一次传输完成啊!
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 就行了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
john_lee 发表于 2013-2-19 12:56 | 显示全部楼层
另外,你怎么知道“DMA不能设置1个字节产生一次传输完成”?
henryzheng 发表于 2013-2-20 16:38 | 显示全部楼层
用DMA是最可行的,  中断的话CPU的效率就行低了
 楼主| inurl 发表于 2013-2-20 19:37 | 显示全部楼层
本帖最后由 inurl 于 2013-2-20 19:42 编辑
henryzheng 发表于 2013-2-20 16:38
用DMA是最可行的,  中断的话CPU的效率就行低了

你有没有用过DMA的串口接收? 不是串口发送!  我觉得不大可行
 楼主| 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增加缓冲的时间,可以留给中断函数更多的时间去处理
 楼主| 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增加缓冲的时间,可以留给中断函数更多的时间去处理
john_lee 发表于 2013-2-20 19:44 | 显示全部楼层
inurl 发表于 2013-2-20 19:40
每个字节都中断,FIFO怎么就没意义了?

每个字节都中断,任何 uart 都有这个功能,比如 51 的 uart,你能说它有 fifo ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

293

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部