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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren