0

我有一个简单的程序,它从 UART 接口接收数据并驱动 WS2812b LED 灯条。所以,我使用 USART3 接收数据(在 IRQ 模式下)和 T3C2(定时器 3,通道 2)来驱动 LED。这是代码:https ://hastebin.com/rucumovero.cpp

如果我在不启用计时器的情况下使用 uart 接口 - 一切正常,但是当我启用它时 - 我开始丢失数据。例如,如果我发送 5 个类似的 32 字节数据包 [0x41..0x60],这里的日志

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 
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 
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 
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

每次丢失 3~4 个字节。

我尝试使用不同的波特率,不同的 usart 端口 - 结果是一样的。第 142 行有设置定时器间隔:

timer_set_period(TIM3, WSP);

在哪里

#define TICK_NS (1000/72)
#define WSP (1300 / TICK_NS)

如果我要评论这一行 - 问题将会消失,但是,当然,没有它我将无法驱动 LED。

所以,看起来我不能同时驱动 WS2812b LED 和从 UART 接收数据。是否应该表现得像这样?知道我该如何解决吗?非常感谢!

4

2 回答 2

0

看来是定时器的中断影响了串口接收中断。

于 2018-01-05T03:15:05.633 回答
0

请检查串行中断优先级是否高于其他优先级。

于 2018-01-09T06:14:51.390 回答