STM32L486启用LPUART1+DMA遇传输错误中断求助
STM32L486 LPUART1 DMA TX传输错误排查方案
时钟配置核查
确保LPUART1、DMA2及GPIOC的时钟已正确使能:__HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_LPUART1_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE();注意STM32L4的LPUART1挂接在APB1总线,若APB1分频系数不为1,需确认波特率计算时的时钟源参数正确。
DMA通道参数匹配校验
检查DMA句柄的核心配置是否与UART TX需求一致:- 传输方向:必须设置为
DMA_MEMORY_TO_PERIPH - 数据宽度:UART默认8位数据,需对应
DMA_DATAWIDTH_8BIT - 外设增量模式:关闭(
DMA_PINC_DISABLE),因为LPUART1的TDR寄存器地址固定 - 内存增量模式:开启(
DMA_MINC_ENABLE),确保缓冲区数据依次发送 - 传输模式:单次传输设为
DMA_NORMAL,循环传输设为DMA_CIRCULAR - 外设地址:必须指向
&LPUART1->TDR,而非其他寄存器 - 传输长度:与发送缓冲区的字节数完全匹配
- 传输方向:必须设置为
初始化顺序与UART状态检查
- 先完成LPUART1的初始化(
HAL_UART_Init()),确保LPUART1->CR1中的TE(发送使能)位已置1 - 再配置DMA通道并关联UART句柄(若使用HAL库的自动关联,需确保
huart1.hdmatx指向正确的DMA句柄) - 最后开启DMA中断并调用
HAL_UART_Transmit_DMA()
- 先完成LPUART1的初始化(
DMA错误标志定位
在DMA2_Channel6_IRQHandler中先读取DMA2的中断状态寄存器(DMA2->ISR),定位具体错误类型:TEIF6:传输错误,可能是外设地址无效、传输过程中外设未就绪DMEIF6:直接模式错误,通常是DMA配置与外设模式不匹配FEIF6:FIFO错误,若开启了DMA FIFO模式,需检查FIFO阈值设置是否合理
可在中断中添加临时代码打印标志位,或通过调试器直接查看寄存器值。
中断优先级与冲突排查
- 确保DMA2_Channel6的中断已通过
HAL_NVIC_EnableIRQ(DMA2_Channel6_IRQn)开启 - 检查中断优先级分组设置(如
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2)),避免DMA中断被其他高优先级中断抢占导致异常 - 确认DMA中断优先级高于LPUART的中断(若同时开启了UART中断)
- 确保DMA2_Channel6的中断已通过
硬件与引脚配置复查
- 确认PC0(LPUART1_RX)、PC1(LPUART1_TX)的复用功能已正确配置为
GPIO_AF8_LPUART1 - 检查引脚的电气配置:TX引脚需设为推挽输出(
GPIO_MODE_AF_PP),并配置合适的上拉/下拉(根据硬件连接选择) - 排查硬件连接:确认TX引脚未短路、虚焊,电平匹配(如TTL电平与调试工具一致)
- 确认PC0(LPUART1_RX)、PC1(LPUART1_TX)的复用功能已正确配置为
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

