STM32F103:定时器可以干扰uart吗?

2019-07-14 17:36发布

我有一个简单的程序,它从UART接口接收数据并驱动WS2812b LED灯条。因此,我使用USART3接收数据(在IRQ模式下)和T3C2(定时器3,通道2)来驱动LED。这是代码:如果我在没有启用计时器的情况下使用uart接口,一切工作都很完美,但是当我启用计时器时,我开始丢失数据。例如,这里是日志,如果我发送5个类似的32字节数据包[0x41..0x60]
  1. <font size="4">read 29 byte(s): 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  2. read 29 byte(s): 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 60
  3. read 28 byte(s): 41 42 43 44 45 46 47 48 49 4A 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5D 5E 5F 60
  4. read 29 byte(s): 41 42 43 44 45 46 47 48 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 5A 5B 5C 5D 5E 5F 60</font>
复制代码
每次丢失3~4个字节。我尝试使用不同的波特率,不同的usart端口 - 结果是一样的。计时器间隔在第142行中设置:timer_set_period(TIM3, WSP);哪里#define TICK_NS (1000/72)#define WSP (1300 / TICK_NS)如果我注释掉这一行,问题就会消失,但是,当然,如果没有它,我将无法驱动LED。因此,看起来我无法同时驱动WS2812b LED并从UART接收数据。这应该是这样的吗?知道我该如何修复它?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
zyh34997
1楼-- · 2019-07-14 21:01
谢谢!是的,当我丢失数据时,我收到了USART_SR_ORE标志。有没有办法找到超限的原因?
denxinan
2楼-- · 2019-07-14 21:15
我有一些数据丢失和(高波特率)UART的经验。唯一好的解决方案似乎是使用UART的最高中断优先级(以及仅用于UART),并确保仅在非常短的持续时间内禁用UART IRQ(例如,在评估接收缓冲区时)。在我的情况下,我无法使用DMA,因为我不知道我会收到多少字节。
新星之火12138
3楼-- · 2019-07-14 22:51
看着这个

#define TICK_NS (1000/72)
#define WSP (1300 / TICK_NS)
你的计时器需要大约100步(如果我从规格中得到它)然后运行你告诉它的任何例行程序。我无法清楚地看到你的程序需要多少时间才能完成一个步骤,但似乎你的计时器例程应该经常运行(每秒偶数1000次或更多)。

现在,如果您的uart例程在没有计时器的情况下按预期工作,但在引入时丢失数据,则强烈建议计时器中断您的串行通信。

这可能是因为:

你的计时器例程经常运行
计时器例程太长
定时器中断的优先级高于uart中断。
或者可能将它们全部放在一起。

可能的解决方案:

STM32具有称为NVIC(嵌套矢量中断控制器)的东西,您可以使用它来更改中断优先级。

当你使用两个或多个中断时,你必须考虑它们几乎可以在同一时间运行(这种情况在两个中断以相似的频率运行时更常发生),并且一个例程可能因此而丢失信息(特别是使用uart)。所以你必须想办法处理这个明确的案例 - >锁定机制或改变优先级。

您的日常工作时间越长,您输入第二点所述情况的可能性就越高。通常的做法是使中断例程尽可能短,并且永远不要在中断中使用延迟或循环。

考虑是否有一种方法可以更少地运行您的计时器例程。这样你至少可以最大限度地减少数据丢失的可能性,但是要完全排除它,你将不得不做第1-3点中描述的事情。
daitz
4楼-- · 2019-07-15 03:58
 精彩回答 2  元偷偷看……
zyh34997
5楼-- · 2019-07-15 08:55
与增加中断优先级不一样?
zyh34997
6楼-- · 2019-07-15 10:09
谢谢你的回答!测量调试定时器频率的时间间隔以及评估中断处理程序例程的运行时间的最佳方法是什么?

一周热门 更多>