硬汉嵌入式论坛

 找回密码
 立即注册
查看: 106|回复: 8
收起左侧

[Zephyr] zephyrDMA串口不支持循环发送?

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 3 天前 | 显示全部楼层 |阅读模式
在设备树中,将DMA初始化如下:


&usart3 {
     ......
    dmas = <&dma1 3 4 0x540 0>,
           <&dma1 1 4 0x540 0>;   
    dma-names = "tx", "rx";
    ......
};


其中对DMA的DMA_SxCR寄存器位8配置为了1,此时应该调用一次uart_tx函数发送后应该会一直向外发送数据,但测试结果还是向往发送一次。
经过对内部驱动进行分析发现;zephyr提供的dma_stm32.c文件中对循环寄存器的配置位为5,如下:
#define STM32_DMA_CONFIG_CYCLIC(config)                 ((config >> 5) & 0x1)

这显然和芯片的参考手册对不上,当我尝试将设设备树中DMA的配置,配置为0x460时,及对应第五位为1,测试结果为:数据没有完全进行发送。
求各路大神帮忙解答一下,是我配置出了问题还是怎么回事?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 前天 10:53 | 显示全部楼层
帮顶。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 前天 11:06 | 显示全部楼层
把你用到的zephyr版本发出来,对比下最新的和LTS版本。另外如果不追求新功能,建议使用LTS版本
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 前天 15:38 | 显示全部楼层
elecfier 发表于 2025-8-14 11:06
把你用到的zephyr版本发出来,对比下最新的和LTS版本。另外如果不追求新功能,建议使用LTS版本

版本是最新版本4.2.99
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 前天 15:40 | 显示全部楼层
设备树 串口的 dma 不使用 STM32_DMA_MODE_CYCLIC, 直接使用 uart_callback_set() 注册回调,在回调 TX_DONE 事件中继续调用 uart_tx() 手动实现自动循环发送。

设备树使用 STM32_DMA_MODE_CYCLIC 发现 调用 uart_tx() 之后触发 TX_DONE 事件的时候只会传输一半的数据量
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 前天 20:15 | 显示全部楼层
狠狠滴摸鱼冲浪 发表于 2025-8-14 15:40
设备树 串口的 dma 不使用 STM32_DMA_MODE_CYCLIC, 直接使用 uart_callback_set() 注册回调,在回调 TX_DO ...

是这样的,在设备树中使用STM32_DMA_MODE_CYCLIC,测试数据传输量确实只有一半,如果不能使用循环模式的话那就表明接收也是使用不了呗,不知道zephyr的bug还是咋回事。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 昨天 10:20 | 显示全部楼层
aiqiqi 发表于 2025-8-14 20:15
是这样的,在设备树中使用STM32_DMA_MODE_CYCLIC,测试数据传输量确实只有一半,如果不能使用循环模式的 ...

zephyr/drivers/dma/dma_stm32.c 中来看,设备树配置 STM32_DMA_MODE_CYCLIC 会触发DMA半传输中断
[C] 纯文本查看 复制代码
    /* Enable Half-Transfer irq if circular mode is enabled */
    if (stream->cyclic) {
        LL_DMA_EnableIT_HT(dma, dma_stm32_id_to_stream(id));
    }


回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 昨天 10:30 | 显示全部楼层
狠狠滴摸鱼冲浪 发表于 2025-8-15 10:20
zephyr/drivers/dma/dma_stm32.c 中来看,设备树配置 STM32_DMA_MODE_CYCLIC 会触发DMA半传输中断
[mw_s ...

但是也会配置 DMA 完成中断,不过触发 半传输中断 后 完成中断 就没有再触发了。
我还没找到在原因。

而且触发 TX_DONE 是在串口的 TC 中断中,DMA半传输会触发串口 TC 中断???诡异,只能再看看代码,应该是漏掉了什么东西
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 昨天 10:47 | 显示全部楼层
从 zephyr/drivers/serial/uart_stm32.c 来看,估计目前驱动中串口发送dma应该是没有太完善的,应该是主要适配了串口接收dma的功能
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 03:30 , Processed in 0.043610 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表