|
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 |
STM32U575低功耗问题
STM32u575 USART 用GPDMA接收,DMA中断,usart 中断正常来,ROR数据正确,接收缓冲却不变
stm32u575 gpdma burst length=1 配置其他数值不工作
STM32U5进入standby模式时,待机电流有时候大的离谱,有时候却正常
STM32U5系列上电时序
STM32U585进入shutdown模式后偶发无法被唤醒引脚唤醒
DMA传输完成后,串口与DMA一直处于忙状态
STM32U575VGT6在cubeMX中没有FATFS中间件,是不支持?还是待开发?现在这块板子使用FATFS只能自己手动移植吗?
NUCLEO-U575ZI-Q原理图
使用touchgfx控件modalWindow,显示会有条纹。主控:U575+FMC+SSD1963+LCD_480x800,
微信公众号
手机版
你目前UART2是自发自收吗?
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); }
感觉又不像,你发生完100ms后才去开启基于UART2的接收。
你基于空闲中断做UART的DMA接收,接收长度才1个,意义何在?如何使用空闲事件?
一般来讲基于空闲事件做UART接收的话,接收数据长度相对设置比较长,以空闲事件表征当前数据接收完毕。在空闲中断里读取接收到的数据。