Tengo un programa simple, que recibe datos de la interfaz UART y maneja una tira led WS2812b. Estoy usando USART3 para recibir datos (en modo IRQ) y T3C2 (timer 3, canal 2) para manejar los LEDs. Aquí está el código:
https://hastebin.com/rucumovero.cpp
Si uso la interfaz uart sin habilitar un temporizador, todo funciona perfectamente, pero cuando habilito el temporizador empiezo a perder datos. Por ejemplo, aquí el log 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 otra velocidad de transmisión, otro puerto usart - 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 comento esta línea, el problema desaparecerá, pero, por supuesto, no podré conducir LEDs sin ella.
Entonces, parece que no puedo manejar los leds WS2812b y recibir datos de la UART al mismo tiempo. ¿Se supone que debe comportarse así? ¿Alguna idea de cómo puedo solucionarlo?
3 votos
Primero determina si estás ante un fallo de hardware (ej: trama corrupta debido al PWM del LED) o de software (ej: algo se detiene demasiado tiempo). Sugerencia: USART_SR->ORE.
0 votos
@Jeroen3 ¡Gracias! Sí, estoy recibiendo USART_SR_ORE bandera cuando estoy perdiendo datos. ¿Hay alguna manera de encontrar la razón de rebasamiento?
1 votos
He tenido alguna experiencia con la pérdida de datos y (alta velocidad de transmisión) UART. La única buena solución parece ser usar la prioridad de interrupción más alta para la UART (y sólo para la UART) y asegurarse de que la IRQ de la UART sólo está deshabilitada durante periodos muy cortos (por ejemplo, cuando se evalúa el buffer de recepción). En mi caso no podía usar el DMA porque no sabía cuántos bytes iba a recibir.