Я использую плату STM32L4R5 и пытаюсь настроить DMA на линии UART2. Мне удалось заставить линию RX работать так, как я хочу, но когда я следую «Передача с использованием DMA» в разделе 44.5.19 «Справочного руководства RM0432», передается только один байт и ничего больше. Этот байт отправляется только тогда, когда я явно записываю байт в регистр TDR. После этого я вижу, что флаг TC очищен и затронут первый байт моего регистра DMA. Как заставить DMA постоянно отправлять данные в TDR для передачи?
Примечание: эта проблема похожа на вопрос без ответа здесь
Шаги, упомянутые в техническом описании, следующие:
Мой код здесь:
//filling in dummy info into my DMA TX buffer
memset((void*)DMA_USB_TXbuf, 0x55, 16);
//ensuring my UART is configured for DMA Transfer
huart2.Instance->CR3 |= USART_CR3_DMAT;
//steps 1-4 taken care of within this funciton
HAL_DMA_Start_IT(&hdma_usart2_tx, (uint32_t)&huart2.Instance->TDR, (uint32_t)&DMA_USB_TXbuf[0], DMA_USB_TX_SIZE);
//step 5 (just ensuring that we have the flags we want after the previous function)
__HAL_DMA_DISABLE(&hdma_usart2_tx);
__HAL_DMA_ENABLE_IT(&hdma_usart2_tx, DMA_IT_HT);
__HAL_DMA_ENABLE_IT(&hdma_usart2_tx, DMA_IT_TC);
//step 6
__HAL_UART_CLEAR_FLAG(&huart2, UART_CLEAR_TCF);
//step 7
__HAL_DMA_ENABLE(&hdma_usart2_tx);
//I shouldn't need to do this, but this seems to be the only way
// I get even 1 trasmission from DMA register
WRITE_REG(huart2.Instance->TDR, 0x55);
Было две части того, почему это не работало должным образом.
Спасибо, Кодо.
Кодо
HAL_USART_Transmit_DMA()
?Клен
Крис Стрэттон
Бо Р