|
|
main代码:while (1) { /* First transmit data, then start DMA receive */
if (loop_TX < 0xFF) {
loop_TX++;
HAL_UART_Transmit(&huart2, &loop_TX, 1, 100);
HAL_Delay(100);
/* Start DMA receive with IDLE detection */
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, &loop_RX, 1);
/* Wait for DMA transfer to complete */
HAL_Delay(100);
/* Flush cache to ensure DMA data is visible to CPU */
SCB_InvalidateDCache_by_Addr(&loop_RX, sizeof(loop_RX));
printf("[MAIN] TX: %02X, RX: %02X\r\n", loop_TX, loop_RX);
}
}
void GPDMA1_Channel0_IRQHandler(void)
{
/* USER CODE BEGIN GPDMA1_Channel0_IRQn 0 */
printf("[GPDMA1_Channel0] DMA done, CNDTR=%u, CSAR=0x%08lX, CDAR=0x%08lX, CTR1=0x%08lX\r\n",
__HAL_DMA_GET_COUNTER(&handle_GPDMA1_Channel0),
handle_GPDMA1_Channel0.Instance->CSAR,
handle_GPDMA1_Channel0.Instance->CDAR,
handle_GPDMA1_Channel0.Instance->CTR1);
/* USER CODE END GPDMA1_Channel0_IRQn 0 */
HAL_DMA_IRQHandler(&handle_GPDMA1_Channel0);
/* USER CODE BEGIN GPDMA1_Channel0_IRQn 1 */
/* USER CODE END GPDMA1_Channel0_IRQn 1 */
}
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)) {
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
uint16_t dma_cntr = __HAL_DMA_GET_COUNTER(huart2.hdmarx);
/* Flush cache to ensure DMA data is visible to CPU */
SCB_InvalidateDCache_by_Addr(&loop_RX, sizeof(loop_RX));
printf("[USART2] IDLE, DMA CNDTR=%u, RX=%02X, RDR=%02X\r\n",
dma_cntr, loop_RX, huart2.Instance->RDR);
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
打印信息看DMA中断进去了,IDLE中断进去了,ROR是正确的,loop_RX却维持初始化的值。
[MAIN] loop_RX addr=0x20000029[GPDMA1_Channel0] DMA done, CNDTR=0, CSAR=0x40004424, CDAR=0x20000029, CTR1=0x00000000[MAIN] TX: B4, RX: 0F[USART2] IDLE, DMA CNDTR=0, RX=0F, RDR=B5[MAIN] loop_RX addr=0x20000029[GPDMA1_Channel0] DMA done, CNDTR=0, CSAR=0x40004424, CDAR=0x20000029, CTR1=0x00000000[MAIN] TX: B5, RX: 0F[USART2] IDLE, DMA CNDTR=0, RX=0F, RDR=B6[MAIN] loop_RX addr=0x20000029[GPDMA1_Channel0] DMA done, CNDTR=0, CSAR=0x40004424, CDAR=0x20000029, CTR1=0x00000000
USART2 TX直接接在了RX上。
|
-
-
|