OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: jxc2017jxc

STM32 能做到吗?高手请进,STM32 的 TIM 定时请求DMA SPI 传输?

[复制链接]

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 2026-7-17 16:31:24 | 显示全部楼层
jxc2017jxc 发表于 2017-6-30 08:24
经测试,TIM DMA 是可以的,谢谢各位大侠。

楼主您好,我最近也在搞STM32F407的SPI通过DMA采集ADS8353的代码。也是想通过定时器的DMA来触发SPI的收发。一次完整的SPI收发需要进行6个字节的交互。请问定时器的DMA的目标地址能直接写SPI的DR地址吗?SPI的需要设置发送DMA吗?还是只设置接收DMA就行?请赐教!
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 2026-7-20 15:45:11 | 显示全部楼层
xuande 发表于 2017-6-21 09:21
可以利用两路DMA实现,我已经用几年了。

一路是:

       您好,我最近也在搞STM32F407的SPI通过DMA采集ADS8353的代码。也是想通过定时器的DMA来触发SPI的DMA收发。每5us自动进行一次SPI交互(收发6个字节)。
       我理解的是定时器的DMA往SPI的DR先写一个字节,然后SPI TX DMA写剩余5个字节。同时触发SPI RX DMA 接收6个字节到大的接收缓冲区。不知道思路对不?
还有我知道SPI RX DMA 需要设置为循环模式,但是定时器DMA(接收TIM3_TRIG DMA请求)是不是也得设置为正常模式?最主要是SPI TX DMA不知道该设置为正常模式还是循环模式,正常模式发送完成会关闭DMA,硬件无法开启,循环模式是不是会一直发送数据啊(TXE为1就会请求SPI TX DMA)。
      有偿请教!!!
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 2026-7-20 15:45:36 | 显示全部楼层
jxc2017jxc 发表于 2017-6-30 08:24
经测试,TIM DMA 是可以的,谢谢各位大侠。

       您好,我最近也在搞STM32F407的SPI通过DMA采集ADS8353的代码。也是想通过定时器的DMA来触发SPI的DMA收发。每5us自动进行一次SPI交互(收发6个字节)。
       我理解的是定时器的DMA往SPI的DR先写一个字节,然后SPI TX DMA写剩余5个字节。同时触发SPI RX DMA 接收6个字节到大的接收缓冲区。不知道思路对不?
还有我知道SPI RX DMA 需要设置为循环模式,但是定时器DMA(接收TIM3_TRIG DMA请求)是不是也得设置为正常模式?最主要是SPI TX DMA不知道该设置为正常模式还是循环模式,正常模式发送完成会关闭DMA,硬件无法开启,循环模式是不是会一直发送数据啊(TXE为1就会请求SPI TX DMA)。
      有偿请教!!!
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 2026-7-20 15:48:10 | 显示全部楼层
K.O.Carnivist 发表于 2017-6-23 18:09
定时器DMA触发启动SPI我试了一下是可以的。手上没有407,我用446试的,TIM1控制SPI1。

所以现在两种方 ...

       您好,我最近也在搞STM32F407的SPI通过DMA采集ADS8353的代码。也是想通过定时器的DMA来触发SPI的DMA收发。每5us自动进行一次SPI交互(收发6个字节)。
       我理解的是定时器的DMA往SPI的DR先写一个字节,然后SPI TX DMA写剩余5个字节。同时触发SPI RX DMA 接收6个字节到大的接收缓冲区。不知道思路对不?
还有我知道SPI RX DMA 需要设置为循环模式,但是定时器DMA(接收TIM3_TRIG DMA请求)是不是也得设置为正常模式?最主要是SPI TX DMA不知道该设置为正常模式还是循环模式,正常模式发送完成会关闭DMA,硬件无法开启,循环模式是不是会一直发送数据啊(TXE为1就会请求SPI TX DMA)。
      有偿请教!!!
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 2026-7-20 16:08:12 | 显示全部楼层
jxc2017jxc 发表于 2017-6-30 08:24
经测试,TIM DMA 是可以的,谢谢各位大侠。


楼主 可以共享一下你的工程吗,1989878317@qq.com。有偿!多谢!
回复

使用道具 举报

59

主题

6303

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11846
金钱
11846
注册时间
2014-4-1
在线时间
1373 小时
发表于 2026-7-21 11:54:24 | 显示全部楼层
本帖最后由 xuande 于 2026-7-21 11:56 编辑

@张法

我理解的是定时器的DMA往SPI的DR先写一个字节,然后SPI TX DMA写剩余5个字节。同时触发SPI RX DMA 接收6个字节到大的接收缓冲区。不知道思路对不?
这思路是对的,但应当改动一下:直接用定时器DMA向SPI的DR写入六个数据,而不是一个!这样就不必再操作SPI发送其他五个字节了,这样的过程更好,更易于编程。

关于循环模式。循环模式是在DMA运行完成规定次数后,能够自动填充存储器地址M0ADD和运行数量NDTR,但触发权还在你手里。相当于循环模式自动装填子蛋,但是否扣扳机还是由你控制。


回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 2026-7-22 11:33:58 | 显示全部楼层
xuande 发表于 2026-7-21 11:54
@张法

我理解的是定时器的DMA往SPI的DR先写一个字节,然后SPI TX DMA写剩余5个字节。同时触 ...

多谢大佬回复。我一开始也是想的用定时器DMA直接给SPI的DR发送六个字节。但是定时器每次触发DMA请求时,DMA只能发送一个单元数据(1个字节或者2个字节).要想让定时器 DMA给SPI的DR发送6个字节,得让定时器连续触发3次或者6次触发DMA才行吧。不知道我理解的对不对?我的需求是TIM2控制CH1产生CS产生200KHz的方波信号来驱动ADS8353,同时在CS下降沿(每5us)能够触发一次TIM DMA给SPI DR发送6个dummy字节来接收ADS8353采样数据。
回复

使用道具 举报

59

主题

6303

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11846
金钱
11846
注册时间
2014-4-1
在线时间
1373 小时
发表于 2026-7-22 12:01:01 | 显示全部楼层
本帖最后由 xuande 于 2026-7-22 12:06 编辑
张法 发表于 2026-7-22 11:33
多谢大佬回复。我一开始也是想的用定时器DMA直接给SPI的DR发送六个字节。但是定时器每次触发DMA请求时,D ...

一次DMA,要么发送一个8位字节,要么一个16位字节,不可能做到发送2个8位字节!
一次是不能发送2个字节的!

其实触发6次,依次发出,就行了。触发3次是不行的。



回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 6 天前 | 显示全部楼层
xuande 发表于 2026-7-22 12:01
一次DMA,要么发送一个8位字节,要么一个16位字节,不可能做到发送2个8位字节!
一次是不能发送2个字节 ...

大佬,最重要的是 如何让定时器以200KHz的频率(每5us)连续触发6次DMA呢??
回复

使用道具 举报

59

主题

6303

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11846
金钱
11846
注册时间
2014-4-1
在线时间
1373 小时
发表于 5 天前 | 显示全部楼层
本帖最后由 xuande 于 2026-7-30 09:14 编辑
张法 发表于 2026-7-29 15:53
大佬,最重要的是 如何让定时器以200KHz的频率(每5us)连续触发6次DMA呢??


这需要问吗?把数量设置为 6 就行了,好像是 NDTR 寄存器。

你是担心 5us 时间太短,操作完不成吗?
一次 DMA 只完成一个动作,就是把数据从你指定的地方搬运到另一个指定的地方,这个过程很快。耗时间是你其他的动作。
比如把数据搬到串口发送出去,搬运的动作很快(瞬间),但发送的时间长度是由波特率那些决定的。所以,触发DMA的间隔时间,要大于发送的时间,保证串口把前一个数据发出去,再触发下一次。我用过1us间隔,给一个DA发波形表。



回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-3-21
在线时间
8 小时
发表于 5 天前 | 显示全部楼层
xuande 发表于 2026-7-30 09:13
这需要问吗?把数量设置为 6 就行了,好像是 NDTR 寄存器。

你是担心 5us 时间太短,操作完不成吗? ...

    大佬,我理解的是把DMA的数据长度设置为6,不管是正常模式还是循环模式,也得需要触发6次才能把6个字节传输完成。定时器一次触发一次DMA请求,DMA应该不能自动传输6个字节吧
    而我的需求场景是 每5us时间一到,让定时器DMA往SPI_DR搬运6次,每次一个字节。同时SPI RX DMA自动接收6个数据。一帧交互可能只需要4.5us,然后空闲0.5us。周而复始的进行下去。
问题核心是,每5us时间一到,怎么能连续触6次发DMA请求?
回复

使用道具 举报

59

主题

6303

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11846
金钱
11846
注册时间
2014-4-1
在线时间
1373 小时
发表于 5 天前 | 显示全部楼层
张法 发表于 2026-7-30 18:22
大佬,我理解的是把DMA的数据长度设置为6,不管是正常模式还是循环模式,也得需要触发6次才能把6个字 ...


第一种方法:
启用两个定时器,第一个定时器负责5uS定时,在定时中断里启动第二个定时器。
这第二个定时器负责以更短的定时触发DMA,6次。

第二种方法:
用CPLD之类的电路,按你的时间产生脉冲,每一个脉冲触发一次DMA。

回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-8-4 23:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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