我有一个简单的程序,它从 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 接收数据。是否应该表现得像这样?知道我该如何解决吗?非常感谢!