STM32F429计时器触发了USART DMA传输问题

问题描述 投票:1回答:1

这是我在该论坛上的第一篇文章。我正在开发一个基于STM32F429DISCOVERY板的MIDI音序器设备,该板以180MHz的频率运行。为了发送Midi消息,USART1配置为31250波特,相应的DMA配置为将存储在ram中的3字节数组传输到USART。我正在通过配置Timer 4更新中断来进行Midi消息发送定时的测试,在该服务例行程序中,我启用了内存到外设USART1 DMA操作。这使我可以在USART1外设上定期发送3字节消息。

一切正常,使用正确的频率和正确的数据,但是我有一个小问题,我已经研究了几天,但无法纠正。为了使情况更清楚,我在计时器中断例程中将发现指示灯(RG13)设置为瞬时闪烁,并将示波器的1个通道连接到该引脚。示波器的第二个通道连接到USART TX引脚。现在,执行代码后,我可以在示波器的CH1上看到led脉冲,然后在CH2上看到USART串行数据。但是由于某种原因,每次发送数据时,导致脉冲与串行数据传输开始之间的时间会波动。它随着每次发送而增加,从大约1uS增加到大约30uS,然后跳回到1。我注意到,如果我稍微改变USART波特率,则脉冲和数据发送之间的时间波动会以模式变化,变快或变慢,范围变长或变短。我尝试从USART和DMA重置所有适当的标志,尝试禁用/启用计时器,以中断优先级播放,但是没有任何方法可以消除时间波动。可以想象,对于MIDI音序器硬件应用程序来说,其稳定性至关重要,因为它决定了音乐事件的时间安排,而这些活动必须牢不可破。我也尝试过不带DMA地单独使用USART,手动发送每个字节,结果基本相同。中断驱动的USART TX也显示了同样的结果。消除USART TX响应时间波动的唯一可行方法是,在每次发送操作之前都要先初始化USART和DMA模块,然后再重新初始化它们。这似乎提供了稳定的操作,但是在计时器中断和通过USART实际发送数据之间插入了较长的延迟,这是不可接受的。

[如果有人对此有任何想法或做过类似的事情,我需要就应该看的地方提出建议。

非常感谢!

最好的问候,康斯坦丁

timer dma stm32f4discovery usart
1个回答
0
投票

即使根据您的详细描述,也有可能出现错误,所以我能做的就是猜测:

也许只是TIM设置之一只是略有错误:计时器的自动重载寄存器(TIM4_ARR)呢?

周期设置必须仅是一个单位低于所需的传输周期除以(可能是预先缩放的)时钟周期(请参阅递增计数/递减计数详细信息)。

现在,如果重载值刚好等于该值,则第二个触发器将延迟一个微小的周期,第三个触发器将延迟两倍,以此类推(以您所描述的为准)。然后,这种“延迟斜坡”将上升,直到不想要的延迟加起来达到一个UART位周期(对于31250波特,恰好是32uS,非常接近您所描述的“大约30uS”)。然后,下一个触发器将恰好适合相邻的UART位周期(没有太多延迟)。将该假设与您的其他发现进行比较...

  • 更改UART波特率将保留基本错误,但是令人讨厌的延迟时间会改变。它可能会更改其符号(“更快或更慢”),具体取决于(实际)TIM周期和UART位周期之间的拍子特性。 =>确定

  • 将事件处理从DMA更改为IRQ处理程序不会对问题有太大改变,而只是初始延迟的“阶段”(到CPU需要执行其他ST库函数的时间)。 =>确定
  • 禁用并重新启用UART可能会改变行为,因为UART时钟可能会与基础总线时钟(USART2的APB2)重新进行新的同步,因此TIM触发后的延迟将显示为常数,您将不会注意到波动。 =>确定
© www.soinside.com 2019 - 2024. All rights reserved.