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?