You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

STM32L053R8T6开发板DMA+USART与虚拟串口通信故障求助

STM32L053 Nucleo USART+DMA通信问题排查

最近我在折腾STM32L053R8T6 Nucleo开发板,想实现电脑虚拟串口和开发板之间的USART+DMA通信,但碰到了问题。先贴出我目前写的DMA和USART相关代码片段:

#include "Device/Include/stm32l0xx.h" // Device header
#include "JB.h"
#include <string.h>
#define PCLK 32000000
#define BAUD 19200
uint8_t stringtosend[] = "test\n";
uint8_t stringtoreceive[] = " ";
void ENABLE_UART_DMA(void){
RCC->AHBENR |= RCC_AHBENR_DMA1EN; //enable periph.clk for DMA1
/**Enabling...(代码未完成部分保留原样)

结合我调试这类问题的经验,给你列几个最容易踩坑的排查点:

  • DMA通道匹配检查:STM32L0系列里,USART1的发送请求对应DMA1_CH4,接收对应DMA1_CH5,千万别配错通道。另外要确认DMA的方向:发送是内存到外设,接收是外设到内存,数据宽度要和USART的配置一致(比如8位数据位就选字节模式),内存地址要开增量,外设地址固定。
  • USART侧DMA使能别漏了:光开DMA时钟没用,还得在USART的CR3寄存器里把DMAT(发送DMA使能)和DMAR(接收DMA使能)位置1,这样USART才会触发DMA传输请求。
  • 波特率计算要精准:你定义了PCLK=32MHz、BAUD=19200,得仔细算USART_BRR的值。STM32L0的USART支持小数分频,正确计算逻辑是:USARTDIV = PCLK / BAUD,整数部分放到BRR的[15:4]位,小数部分乘以16取整放到[3:0]位。比如32MHz/19200≈1666.666,整数部分1666是0x682,小数部分0.666*16≈10(0xA),所以BRR应该是0x682A,别直接用整数除法导致波特率误差太大。
  • DMA传输长度要设对:发送的时候,DMA的NDTR寄存器要设为strlen((char*)stringtosend),不然可能只发一部分或者乱发。接收的话也要根据预期接收的字节数设置NDTR,或者用循环DMA模式。
  • GPIO复用配置不能错:Nucleo的USART1一般是PA9(TX)和PA10(RX),要把PA9配置为复用推挽输出,PA10配置为浮空输入,别忘了开启GPIOA的时钟,还要确认复用功能映射正确(AF4对应USART1)。
  • 中断相关的细节:如果用DMA完成中断,要在NVIC里给DMA通道配置合适的优先级,同时记得在中断服务函数里清除DMA的传输完成标志位,避免重复触发中断。

内容的提问来源于stack exchange,提问作者xen20

火山引擎 最新活动