STM32F105 CL & DMA -> USART2

Gast #5171816
Lesenswert?
• ▲
▼
Juten Tach ;)

Was mache ich bei der Initialisierung des DMA Kanales falsch?
Ich bekomme keine Ausgabe über UART wenn ich es mit DMA versuche?!
1
uint32_t TxBuffer[16];
2
void dmaUsart2Init(void)
3
{
4
   DMA_InitTypeDef d;
5
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
6

7
   DMA_DeInit(DMA1_Channel4);
8
   d.DMA_PeripheralBaseAddr     = (uint32_t)&USART2->DR;
9
   d.DMA_MemoryBaseAddr         = (uint32_t)TxBuffer;
10
   d.DMA_DIR                    = DMA_DIR_PeripheralDST;
11
   d.DMA_BufferSize             = 16;
12
   d.DMA_PeripheralInc          = DMA_PeripheralInc_Disable;
13
   d.DMA_MemoryInc              = DMA_MemoryInc_Enable;
14
   d.DMA_PeripheralDataSize     = DMA_PeripheralDataSize_Byte;
15
   d.DMA_MemoryDataSize         = DMA_MemoryDataSize_Byte;
16
   d.DMA_Mode                   = DMA_Mode_Normal;
17
   d.DMA_Priority               = DMA_Priority_VeryHigh;
18
   d.DMA_M2M                    = DMA_M2M_Disable;
19
   DMA_Init(DMA1_Channel4, &d);
20

21
   DMA_Cmd(DMA1_Channel4, ENABLE);
22
}
1
void dmaSend(DMA_Channel_TypeDef *txCh, uint8_t wordLen)
2
{
3
    DMA_Cmd(txCh, DISABLE);
4
    /*
5
    *   the channel must disable before call DMA_SetCurrDataCounter
6
    *
7
    */
8
    DMA_SetCurrDataCounter(txCh, wordLen);
9

10
    /*
11
    *   the data to will be send are defined @ dma init
12
    *
13
    */
14

15
    /* ... */
16

17
    /*
18
    *   enable the dma channels
19
    *
20
    */
21
    DMA_Cmd(txCh, ENABLE);
22
}
1
  while(1)
2
  {
3
        TxBuffer[0] = 'A';
4
        TxBuffer[1] = 'B';
5
        TxBuffer[2] = 'C';
6

7
        dmaSend(DMA1_Channel4,1);
8
  }
9
}
Gast #5171923
Lesenswert?
• ▲
▼
STM Apprentice schrieb im Beitrag #5171824:
> ... und wo ist die UART-Initialisierung?
>
> Profan gesprochen, der UART muss ja auch wissen dass er
> was tun soll ....
>
> Ist das Salamitaktik von dir das du nicht den gesamten Code zeigst?

Sorry. Hat gefehlt.
1
void _uartInit(void)
2
{
3
    USART_InitTypeDef usartx;
4
    GPIO_InitTypeDef  gpiox;
5

6
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
7
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
8

9
    gpiox.GPIO_Pin      = GPIO_Pin_2;
10
    gpiox.GPIO_Speed    = GPIO_Speed_10MHz;
11
    gpiox.GPIO_Mode     = GPIO_Mode_AF_PP;
12
    GPIO_Init(GPIOA, &gpiox);
13

14
    gpiox.GPIO_Pin      = GPIO_Pin_3;
15
    gpiox.GPIO_Speed    = GPIO_Speed_10MHz;
16
    gpiox.GPIO_Mode     = GPIO_Mode_IN_FLOATING;
17
    GPIO_Init(GPIOA, &gpiox);
18

19

20
    usartx.USART_BaudRate               = 9600;
21
    usartx.USART_WordLength             = USART_WordLength_8b;
22
    usartx.USART_StopBits               = USART_StopBits_1;
23
    usartx.USART_Parity                 = USART_Parity_No ;
24
    usartx.USART_Mode                   = USART_Mode_Rx | USART_Mode_Tx;
25
    usartx.USART_HardwareFlowControl    = USART_HardwareFlowControl_None;
26
    USART_Init(USART2, &usartx);
27

28
    USART_Cmd(USART2, ENABLE);
29

30
    /* Enable USARTy DMA Rx and TX request */
31
    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
32

33
    /* Enable USARTy TX DMA1 Channel */
34
    DMA_Cmd(DMA1_Channel4, ENABLE);
35
}
36
[/void _uartInit(void)
37
{
38
    USART_InitTypeDef usartx;
39
    GPIO_InitTypeDef  gpiox;
40

41
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
42
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
43

44
    gpiox.GPIO_Pin      = GPIO_Pin_2;
45
    gpiox.GPIO_Speed    = GPIO_Speed_10MHz;
46
    gpiox.GPIO_Mode     = GPIO_Mode_AF_PP;
47
    GPIO_Init(GPIOA, &gpiox);
48

49
    gpiox.GPIO_Pin      = GPIO_Pin_3;
50
    gpiox.GPIO_Speed    = GPIO_Speed_10MHz;
51
    gpiox.GPIO_Mode     = GPIO_Mode_IN_FLOATING;
52
    GPIO_Init(GPIOA, &gpiox);
53

54

55
    usartx.USART_BaudRate               = 9600;
56
    usartx.USART_WordLength             = USART_WordLength_8b;
57
    usartx.USART_StopBits               = USART_StopBits_1;
58
    usartx.USART_Parity                 = USART_Parity_No ;
59
    usartx.USART_Mode                   = USART_Mode_Rx | USART_Mode_Tx;
60
    usartx.USART_HardwareFlowControl    = USART_HardwareFlowControl_None;
61
    USART_Init(USART2, &usartx);
62

63
    USART_Cmd(USART2, ENABLE);
64

65
    /* Enable USARTy DMA Rx and TX request */
66
    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
67

68
    /* Enable USARTy TX DMA1 Channel */
69
    DMA_Cmd(DMA1_Channel4, ENABLE);
70
}
Gast #5172395
Lesenswert?
• ▲
▼
1
  while(1)
2
  {
3
        TxBuffer[0] = 'A';
4
        TxBuffer[1] = 'B';
5
        TxBuffer[2] = 'C';
6

7
        dmaSend(DMA1_Channel4,1);
8
  }

Ich vermisse hier Code der abwartet bis der DMA Transfer beendet ist
bevor der nächste Transfer gestartet wird. Das kannst du so nicht 
einfach
hintereinander weg reinprügeln.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.