|
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上。 |
STM32u575 USART 用GPDMA接收,DMA中断,usart 中断正常来,ROR数据正确,接收缓冲却不变
stm32h7 定时器输出比较模式+dma,生成脉冲异常
STM32U575低功耗问题
STM32G030F6串口空闲中断配置卡死
请教STM32F103的DMA空闲接收问题
STM32H725VGT3内存不足问题
STM32H7A3 怎样配置MDMA的硬件触发MDMA_REQUEST_DMA1_Stream0_TC将数据再次转运
串口DMA收发出现ORE错误
关于外部事件(EXTI0)触发SPI读取数据
STM32F429突然死机
微信公众号
手机版
另外检查一下函数设置的接收数量参数就是1,按说接收就应该结束了。
抱歉,我调整一下:我在while中会不断发送,接收一个字节,
/ USER CODE BEGIN PV /
uint8_t loop_TX = 0xaa;
uint8_t loop_RX = 0x0f;
/ USER CODE END PV /
.............................
/ MPU Configuration--------------------------------------------------------/
MPU_Config();
/* Reset of all peripherals, Initializes the Flash interface and the Systick.
*/
HAL_Init();
/ USER CODE BEGIN Init /
/ USER CODE END Init /
/ Configure the system clock /
SystemClock_Config();
/ GTZC initialisation /
MX_GTZC_Init();
/ USER CODE BEGIN SysInit /
delay_init();
HAL_Delay(100);
/ USER CODE END SysInit /
/ Initialize all configured peripherals /
MX_GPIO_Init();
MX_GPDMA1_Init();
MX_SPI2_Init();
MX_USB_OTG_FS_PCD_Init();
MX_UCPD1_Init();
MX_I2C4_Init();
MX_LPUART1_UART_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
MX_I2C3_Init();
MX_FLASH_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
MX_ICACHE_Init();
/ Initialize interrupts /
MX_NVIC_Init();
HAL_Delay(100);
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(500);
/ 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 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",
}
/ USER CODE END USART2_IRQn 0 /
HAL_UART_IRQHandler(&huart2);
/ USER CODE BEGIN USART2_IRQn 1 /
/ USER CODE END USART2_IRQn 1 /
}
void GPDMA1_Channel4_IRQHandler(void)
{
/ USER CODE BEGIN GPDMA1_Channel4_IRQn 0 /
/ USER CODE END GPDMA1_Channel4_IRQn 0 /
HAL_DMA_IRQHandler(&handle_GPDMA1_Channel4);
/ USER CODE BEGIN GPDMA1_Channel4_IRQn 1 /
printf("[GPDMA1_Channel4] DMA done, CNDTR=%u\r\n",
printf(
"[GPDMA1_Channel4] DMA buf: %02X %02X %02X %02X %02X %02X %02X %02X\r\n",
g_oas1200.rx_buffer[0], g_oas1200.rx_buffer[1], g_oas1200.rx_buffer[2],
g_oas1200.rx_buffer[3], g_oas1200.rx_buffer[4], g_oas1200.rx_buffer[5],
g_oas1200.rx_buffer[6], g_oas1200.rx_buffer[7]); / USER CODE END GPDMA1_Channel4_IRQn 1 /
}
here is some print result :
[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