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条回答
新星之火12138
1楼-- · 2019-07-15 11:52
实际上应该很容易找出你的“timerclock”滴答的速度,如果你没有改变你应该在数据表中找到值的设置,它可能与你的quarz或外部时钟频率(或者你的任何频率)相同使用),也许使用一套预分频器。但是,如果你想测量它,我建议每次调用timerroutine时切换一个IO引脚,并将引脚连接到示波器。调试器也可以告诉你程序中的命令需要多长时间,但由于我使用了不同的编程工具,我遗憾地无法给你任何有用的提示如何继续
daitz
2楼-- · 2019-07-15 17:31
在某种程度上它是相同的,因为无论哪种情况都没有阻止你的中断。然而,尝试使用尽可能少的IRQ并使它们尽可能小(例如,只唤醒μC并为主循环中的实际处理设置标志)具有消除竞争条件潜力的额外好处。这样,您也可以始终相信您的处理以相同的顺序发生(在主循环中)。很明显,当我这样提到它时,但想象一下,如果你突然决定在IRQ(以及其他地方)使用UART调试打印,会发生什么。
罕井雅直
3楼-- · 2019-07-15 18:20
 精彩回答 2  元偷偷看……
zyh34997
4楼-- · 2019-07-15 20:49
谢谢你的回答!看起来优先级调整对我有用,但我要在中断例程中做一些更改

一周热门 更多>