Hallo zusammen,
ich habe einige Zeit mit dem STM32F407 verbracht und habe mir da eine
schöne Bibliothek gebaut, um die Uarts per Interrupt und DMA betreiben
zu können. Klappt tadellos. Nun versuche ich gerade, alles auf den
STM32F103RBT6 zu portieren, hänge aber bei 99%.
Konkret geht es darum, mit dem ESP8266 zu kommunizieren und eingehende
TCP Pakete per DMA zu verarbeiten. Rein kommt bspw. ein:
gefolgt von 10 Bytes an Daten, die hier mal
sein sollen.
Tatsächlich empfange ich mit dem DMA, den ich eben auf 10 Bytes
konfiguriert habe, folgendes:
Er schiebt das letzte per Interrupt empfangene Byte also direkt in den
DMA. Und ich hab absolut keine Ahnung, warum.
1 | void startUart2RxDma(uint16_t dma_buffer_length)
|
2 | {
|
3 | //USART_ReceiveData(USART2);
|
4 | //USART_ClearITPendingBit(USART2,USART_IT_RXNE);
|
5 | //USART_ClearFlag(USART2,USART_FLAG_RXNE);
|
6 | //while(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){};
|
7 | USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
|
8 | DMA_ClearFlag(DMA1_FLAG_TC6);
|
9 | DMA_Cmd(DMA1_Channel6, DISABLE);
|
10 | DMA_SetCurrDataCounter(DMA1_Channel6, dma_buffer_length);
|
11 |
|
12 | DMA_Cmd(DMA1_Channel6, ENABLE);
|
13 | }
|
14 |
|
15 | //UART2 RX Interrupt
|
16 | void USART2_IRQHandler(void)
|
17 | {
|
18 | char data='\0';
|
19 | if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
|
20 | {
|
21 | data = USART_ReceiveData(USART2);
|
22 |
|
23 | UartReceiveByte(&U2,data);
|
24 | }
|
25 | }
|
In UartReceiveByte() reagiere ich auf den ':' und rufe schließlich
startUart2RxDma() auf. Nach den 10 Bytes lande ich dann im
DMA1_Channel6_IRQHandler(), der Transfer schließt also ab. Ich habe
schon einiges ausprobiert, warten, Flags resetten, etc., aber nichts hat
geholfen.
Hat jemand eine Idee, wie man das lösen könnte? Bug, Feature, oder bin
ich zu doof?
Gruß,
Georg