2017-12-28 4 views
0

나는 UART 인터페이스에서 데이터를 수신하고 WS2812b LED 스트립을 구동하는 간단한 프로그램을 가지고있다. 그래서 USART3을 사용하여 데이터를 IRQ 모드로 수신하고 T3C2 (타이머 3, 채널 2)를 사용하여 LED를 구동합니다. 다음은 코드입니다. https://hastebin.com/rucumovero.cppSTM32F103 : 타이머가 uart와 간섭 할 수 있습니까?

타이머를 사용 설정하지 않고 uart 인터페이스를 사용하는 경우 모든 것이 완벽하게 작동하지만 사용하도록 설정하면 데이터가 손실됩니다. 예를 들어, 다음 로그 I 보낼 경우 유사한 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 바이트가 손실 될 때마다.

나는 다른 보레이트 (baud rate), 다른 usart 포트를 사용하려고 시도했다. 결과는 동일하다. 물론, 문제가 사라지지만, 내가없이 LED를 구동 할 수 없습니다 -이 라인을 주석 경우

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

timer_set_period(TIM3, WSP); 

가 : 라인 (142)에 설정 타이머 간격이있다 그것.

그래서 WS2812b LED를 구동 할 수없고 동시에 UART로부터 데이터를 수신 할 수없는 것처럼 보입니다. 이런 행동을한다고 생각하니? 어떤 생각을 어떻게 고칠 수 있습니까? 대단히 감사합니다!

+3

추측으로 만 당신은 UART 인터럽트를 놓친다. 플래그를 확인하고 참조하십시오. 그렇다면 인터럽트 우선 순위를 변경하십시오. –

답변

0

타이머가 중단되면 직렬 포트 수신 인터럽트가 영향을받은 것으로 보입니다.

0

직렬 인터럽트 우선 순위가 다른 우선 순위보다 높은지 확인하십시오.

관련 문제