Forum: Mikrocontroller und Digitale Elektronik STM32F105 CL & DMA -> USART2


von Joseph D. (Gast)


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
}

von STM Apprentice (Gast)


Lesenswert?

... 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?

von Joseph D. (Gast)


Lesenswert?

STM Apprentice schrieb:
> ... 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
}

von Jan H. (janiiix3)


Lesenswert?

Auf normalen Wege funktioniert es?

von holger (Gast)


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.

von Jan H. (janiiix3)


Lesenswert?

Es muss aber mindestens 1 x klappen..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.