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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.