STM32F072 UART DMA Interrupt funktioniert nicht

OP #4474765
Lesenswert?
• ▲
▼
Hi!
Ich versuche gerade UART mit DMA zum laufen zu bringen. Ich möchte die 
ankommenden Daten in den RAM schaufeln und danach den Interrupt 
auslösen.

Ich konfiguriere das DMA mit dieser Funktion:
1
void initDMA() {
2
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
3

4
  //USART Channel
5
  DMA_Cmd(DMA1_Channel5, DISABLE);
6
  DMA_DeInit(DMA1_Channel5);
7

8
  DMA_InitTypeDef dmaInitStruct;
9

10
  dmaInitStruct.DMA_M2M = DMA_M2M_Disable;
11
  dmaInitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
12
  dmaInitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
13
  dmaInitStruct.DMA_Mode = DMA_Mode_Normal;
14
  dmaInitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
15
  dmaInitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
16
  dmaInitStruct.DMA_BufferSize = 16 * 32;
17
  dmaInitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
18
  dmaInitStruct.DMA_MemoryBaseAddr = (uint32_t) buffer;
19
  dmaInitStruct.DMA_PeripheralBaseAddr = (uint32_t) &(USART1->RDR);
20
  dmaInitStruct.DMA_Priority = DMA_Priority_VeryHigh;
21
  DMA_Init(DMA1_Channel5, &dmaInitStruct);
22

23
  DMA_SetCurrDataCounter(DMA1_Channel5, 16 * 32);
24

25
  DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
26

27
  NVIC_InitTypeDef nvicInitStruct;
28
  nvicInitStruct.NVIC_IRQChannel = DMA1_Channel4_5_6_7_IRQn;
29
  nvicInitStruct.NVIC_IRQChannelPriority = 1;
30
  nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
31
  NVIC_Init(&nvicInitStruct);
32

33
  DMA_ClearFlag(DMA1_FLAG_TC5);
34
  DMA_Cmd(DMA1_Channel5, ENABLE);
35
}

UART-Config:
1
void initUART() {
2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3

4
  USART_InitTypeDef uartInitStruct;
5
  uartInitStruct.USART_BaudRate = BAUD_RATE;
6
  uartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
7
  uartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
8
  uartInitStruct.USART_Parity = USART_Parity_No;
9
  uartInitStruct.USART_StopBits = USART_StopBits_1;
10
  uartInitStruct.USART_WordLength = USART_WordLength_8b;
11
  USART_Init(USART1, &uartInitStruct);
12

13
  //GPIO_AF_1 is used for USART1
14
  GPIO_PinAFConfig(UART_SPI_Port, UART_RX_PinSource, GPIO_AF_1);
15
  GPIO_PinAFConfig(UART_SPI_Port, UART_TX_PinSource, GPIO_AF_1);
16

17
  USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
18
/*/
19
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
20

21
  NVIC_InitTypeDef nvicInitStruct;
22
  nvicInitStruct.NVIC_IRQChannel = USART1_IRQn;
23
  nvicInitStruct.NVIC_IRQChannelPriority = 1;
24
  nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
25
  NVIC_Init(&nvicInitStruct);
26
//*/
27
  USART_Cmd(USART1, ENABLE);
28
}
ISR:
1
void DMA1_Channel4_5_6_7_IRQHandler(){
2
  if (DMA_GetITStatus(DMA1_IT_TC5)) {
3
    DMA_Cmd(DMA1_Channel5, DISABLE);
4
    DMA_ClearFlag(DMA1_FLAG_TC5);
5
    DMA_ClearITPendingBit(DMA1_IT_TC5);
6
    bufferChanged = 1;
7
    currentBuffer = !currentBuffer;
8
    DMA1_Channel5 ->CMAR = (uint32_t) buffer[currentBuffer];
9
    DMA1_Channel5 ->CNDTR = 16 * 32;
10
    DMA_Cmd(DMA1_Channel5, ENABLE);
11
  }
12
}
Wenn ich aber Daten an das UART schicke kommt nie der Interrupt. Wenn 
ich DMA deaktiviere und den UART RXNE Interrupt aktiviere, wird dieser 
ausgelöst, sobald UART etwas empfängt, es kann also nicht am Signal 
liegen.
Seht ihr hier irgendeinen Konfigurationsfehler?

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.