你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32u575 USART 用GPDMA接收,DMA中断,usart 中断正常来,ROR数据正确,接收缓冲却不变

[复制链接]
simonlkoo 提问时间:2026-3-9 09:27 / 未解决

st.png10ebc053-ecce-41f0-8ab8-c576f4fc8c96.png

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上。

收藏 评论2 发布时间:2026-3-9 09:27

举报

2个回答
butterflyspring 回答时间:2 小时前
最好调整一下格式,或者放文本作为附件,否则小伙伴们看起来太辛苦了。


另外检查一下函数设置的接收数量参数就是1,按说接收就应该结束了。

STM32U575 USART DMA .PNG
simonlkoo 回答时间: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",

   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 /

}

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",

 __HAL_DMA_GET_COUNTER(&handle_GPDMA1_Channel4));

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

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版