RT-Thread论坛
直播中

张敏

8年用户 1664经验值
私信 关注
[问答]

STM32H743 UART DMA接收不到数据,为什么?

主分支的bsp下STM32 拷贝的

配置如下:

/* Device Drivers */
#define RT_USING_DEVICE_IPC
#define RT_UNAMED_PIPE_NUMBER 64
#define RT_USING_SERIAL
#define RT_USING_SERIAL_V2
#define RT_SERIAL_USING_DMA
#define RT_USING_PIN
/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
#define BSP_USING_ON_CHIP_FLASH
#define BSP_USING_UART
#define BSP_USING_UART3
#define BSP_UART3_RX_USING_DMA
#define BSP_UART3_RX_BUFSIZE 256
#define BSP_UART3_TX_BUFSIZE 128
#define BSP_USING_UART8
#define BSP_UART8_TX_BUFSIZE 128
#define BSP_UART8_RX_BUFSIZE 128
其中BSP_USING_UART8作为msh串口,对uart8除了msp.c的初始化,没有使用其他配置,msh使用正常.
对uart3 增加一下内容宏定义
/* DMA1 stream1 */
#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_INSTANCE)
#define UART3_DMA_RX_IRQHandler          DMA1_Stream1_IRQHandler
#define UART3_RX_DMA_RCC                 RCC_AHB1ENR_DMA1EN
#define UART3_RX_DMA_INSTANCE            DMA1_Stream1
#define UART3_RX_DMA_REQUEST             DMA_REQUEST_USART3_RX
#define UART3_RX_DMA_IRQ                 DMA1_Stream1_IRQn
#endif
main.c代码如下

#include
#include
#include
#define LED1_PIN    GET_PIN(C, 12)
/* 串口设备句柄 */
static rt_device_t serial;
int main(void)
{
        int rx_length;
        uint8_t buff[32];
    /* set LED2 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
        /* 查找串口设备 */
    serial = rt_device_find("uart3");
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", "uart3");
        return RT_ERROR;
    }
        /* 以 DMA 接收及轮询发送方式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
        rt_device_write(serial, 0, "hello", (strlen("hello")));
    while (1)
    {
            rx_length = rt_device_read(serial, 0, buff, 32);
            if(rx_length>0)
            {
                rt_kprintf("%*s\n",rx_length,buff);
            }
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(1000);
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(1000);
    }
}
使用串口助手,PC端能收到“hello”,但是PC端下发的数据,没有收到。

如果配置上不使用DMA,串口收发没问题。

回帖(1)

杨帆

2025-2-19 17:45:41
STM32H743 UART DMA接收不到数据可能有以下几个原因:

1. 硬件连接问题:请检查UART3的硬件连接是否正确,包括TX、RX引脚是否正确连接,以及是否有其他硬件故障。

2. 配置问题:请检查您的配置是否正确。根据您的配置,您已经启用了UART3和DMA接收功能。请确保您已经正确配置了UART3的波特率、数据位、停止位和校验位等参数。

3. DMA配置问题:请检查您的DMA配置是否正确。您需要确保DMA通道、优先级、数据宽度等参数已经正确设置。此外,您还需要确保DMA的内存地址和外设地址已经正确设置。

4. 中断配置问题:请检查您的中断配置是否正确。您需要确保UART3的接收中断已经正确配置,并且中断服务函数已经正确实现。

5. 软件问题:请检查您的软件代码是否有问题。您需要确保UART3的初始化函数已经正确实现,并且DMA接收功能已经正确启用。

6. 调试问题:请使用调试工具(如ST-Link)检查您的代码是否正确运行,以及UART3和DMA的寄存器值是否正确。

以下是一些建议的调试步骤:

1. 使用串口调试助手检查UART3的TX和RX引脚是否有数据传输。

2. 使用调试工具检查UART3和DMA的寄存器值,确保它们已经正确设置。

3. 在UART3的接收中断服务函数中添加调试信息,检查是否有接收到数据。

4. 如果可能,请尝试使用其他UART端口(如UART8)进行测试,以排除硬件问题。

5. 检查您的代码是否有语法错误或逻辑错误,导致UART3和DMA接收功能无法正常工作。

通过以上步骤,您应该能够找到导致STM32H743 UART DMA接收不到数据的原因,并进行相应的修复。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分