Hallo,
ich nutze einen STM32F413VGT6 und die USART3. Ich habe einen n Byte
großen Buffer, in dem circular die empfangenen Daten kopiert werden
sollen.
In der Main Loop schicke ich sekündlich über die USART Daten raus und
kann diese mit Putty lesen, das klappt also schonmal.
Ebenfalls zyklische schaue ich, ob NDTR sich verändert hat, also Zeichen
angekommen sind. Wenn ich in putty ein Zeichen eintippe sehe ich auch,
dass einmal in die If Verzweigung gesprungen wird und NDTR um +1
verringert wird, es ist also etwas passiert. Putty schickt kein CR oder
LF mit. Die richtige Kombi aus Channel und Stream scheine ich auch
gewählt zu haben, andernfalls sollte ja nichts passieren.
Die DMA Fifo ist beim Start initial deaktiviert.
Es gab mal bei manchen STM32 die Notwendigkeit, irgendwas mit (volatile
uint8_t*) zu casten, da habe ich aber auch schon rumprobiert.
Im Buffer sind aber nur '\0' zu sehen. Ein Zeichen klassisch ohne DMA zu
lesen mittels folgendem funktioniert:
1 | while (!(oConfig.oUSART->SR & USART_SR_RXNE));
|
2 | return oConfig.oUSART->DR;
|
Hier ein paar Code Ausschnitte:
USART Initialisierung:
1 | memset(buf_rx, 0, BUFFER_SIZE);
|
2 |
|
3 | DMA1->LIFCR = 0xffffffff;
|
4 | DMA2->LIFCR = 0xffffffff;
|
5 |
|
6 | dma = DMA1_Stream1;
|
7 | oUSART = USART3;
|
8 |
|
9 | dma->CR &= ~DMA_SxCR_EN;
|
10 | dma->CR |= 4 << DMA_SxCR_CHSEL_Pos;
|
11 | dma->PAR = (uint32_t)&oUSART->DR;
|
12 | dma->M0AR = (uint32_t)&buf_rx[0];
|
13 | dma->M1AR = (uint32_t)&buf_rx[0];
|
14 | dma->NDTR = BUFFER_SIZE;
|
15 | dma->CR |= DMA_SxCR_PL_1;
|
16 | dma->CR |= DMA_SxCR_PL_0;
|
17 | dma->CR |= DMA_SxCR_MINC;
|
18 | dma->CR |= DMA_SxCR_CIRC;
|
19 | //dma->CR |= DMA_SxCR_PSIZE_1;
|
20 | //dma->CR |= DMA_SxCR_MSIZE_1;
|
21 | dma->CR |= DMA_SxCR_EN;
|
22 |
|
23 | oUSART->CR1 &= ~USART_CR1_UE;
|
24 | oUSART->CR3 |= USART_CR3_DMAR;
|
25 | oUSART->CR1 = USART_CR1_TE | USART_CR1_RE;
|
26 | oUSART->CR1 |= USART_CR1_UE;
|
27 |
|
28 | setBaudrate(oConfig.u32Baudrate);
|
Main loop:
1 | uint16_t USART::dataAvailabe() {
|
2 | uint16_t z = (BUFFER_SIZE - dma->NDTR);
|
3 |
|
4 | if (pos != z) {
|
5 | if (z > pos) {
|
6 | return z - pos;
|
7 | }
|
8 | else {
|
9 | return BUFFER_SIZE - pos + z;
|
10 | }
|
11 | }
|
12 |
|
13 | return 0;
|
14 | }
|
15 |
|
16 | uint8_t USART::get() {
|
17 | uint8_t data;
|
18 | //while (!(oConfig.oUSART->SR & USART_SR_RXNE));
|
19 | //return oConfig.oUSART->DR;
|
20 | if (dataAvailabe()) {
|
21 | data = buf_rx[pos];
|
22 | pos++;
|
23 | if (pos >= BUFFER_SIZE) {
|
24 | pos = 0;
|
25 | }
|
26 | }
|
27 |
|
28 | return data;
|
29 | }
|
30 |
|
31 |
|
32 | while(1){
|
33 | if(oHardware.oPort[0].dataAvailabe()){
|
34 | oHardware.oPort[0].send(oHardware.oPort[0].get());
|
35 | }
|
36 |
|
37 | if(t.Ready()){
|
38 | oHardware.oPort[0].enable(oHardware.oPort[0].getEnable() ? false : true);
|
39 |
|
40 | t.StartMs(1000);
|
41 | String s = "ADC: ";
|
42 | s += oHardware.oPort[0].getVoltage();
|
43 | s += "mV\r\n";
|
44 | oHardware.oPort[0].send(s.c_str());
|
45 | }
|
46 | }
|