Tengo un programa simple, que recibe datos de la interfaz UART y controla una tira de tira WS2812b. Por lo tanto, estoy usando USART3 para recibir datos (en modo IRQ) y T3C2 (temporizador 3, canal 2) para controlar los LED. Aquí está el código:
Si utilizo la interfaz uart sin habilitar un temporizador, todo funciona perfectamente, pero cuando habilito el temporizador empiezo a perder datos. Por ejemplo, aquí está el registro si envío 5 paquetes similares de 32 bytes [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
cada vez que se pierden 3 ~ 4 bytes.
Intenté usar una velocidad de transmisión diferente, un puerto de usuario diferente, el resultado es el mismo. El intervalo del temporizador se establece en la línea 142:
timer_set_period(TIM3, WSP);
donde
#define TICK_NS (1000/72)
#define WSP (1300 / TICK_NS)
Si hago un comentario en esta línea, el problema desaparecerá, pero, por supuesto, no podré conducir los LED sin él.
Entonces, parece que no puedo conducir leds WS2812b y recibir datos de UART al mismo tiempo. ¿Se supone que se comporte así? ¿Alguna idea de cómo puedo solucionarlo?