你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何使用定时器的更新事件触发DMA读取6字节SPI数据?

[复制链接]
kokoro 提问时间:2021-12-10 09:06 / 已解决

想用定时器的更新事件触发DMA读取SPI数据,现在有个问题是一次更新事件只能触发一次DMA传输,我想要定时器触发一次,DMA能发送6字节到SPI的DR,从而读取6字节的数据该如何设计?

收藏 评论7 发布时间:2021-12-10 09:06

举报

7个回答
xmshao 最优答案 回答时间:2021-12-12 13:01:27

kokoro 发表于 2021-12-10 12:24
我用的是STM32L4Q5,有DMAMUX。</p>
<p>(PS:题外话,L4+系列DMA貌似都不支持突发传输和双缓冲管理,不知 ...

[md]你可以考虑基于定时器中断,每次中断里启动SPI的DMA传输,DMA传输请求数为6,Normal模式;

或者使用DMAMUX的DMA同步功能,比方使用LPTIMER的周期性输出事件来触发SPI DMA传输。

这个我也实测过可行的。

kokoro 回答时间:2021-12-13 08:27:29

xmshao 发表于 2021-12-12 13:01
你可以考虑基于定时器中断,每次中断里启动SPI的DMA传输,DMA传输请求数为6,Normal模式;</p>
<p>或者使用 ...

[md]因为我需要用全硬件方式实现(全程不需要CPU干预),所以我觉得你说的第二个方案可行,多谢大佬解答~

xmshao 回答时间:2021-12-10 10:11:08
这个问题设计多个外设,timer spi dma,尤其相关事件细节,实现起来要费点劲,不过可以实现。这里刚好有一篇文章你可以参考,可以说专门针对你
的需求而写的。你可以搜索下 STM32定时器触发SPI逐字收发之应用示例 (qq.com)

估计本网站就能搜到这篇文章。
kokoro 回答时间:2021-12-10 10:25:33

xmshao 发表于 2021-12-10 10:11
这个问题设计多个外设,timer spi dma,尤其相关事件细节,实现起来要费点劲,不过可以实现。这里刚好有一篇 ...

谢谢,这篇文章我看到了,但是不能实现我说的这个功能。

“这里使用片内定时器TIM3,借助它的更新事件触发DMA请求,通过DMA将数据给到SPI1的数据寄存器并发送出去,同时也开启SPI1接收事件的DMA传输。SPI2的收、发事件都启用DMA传输来实现数据收发操作。

TIM3的更新事件周期控制两个SPI的收发节奏,即定时器每产生一次更新事件,SPI1/SPI2这两个主从通信模块就进行一个数据的收发。我们可以通过调整定时器的计时周期来调整数据收发的快慢节奏。”

上面是我引用文章里的两段话,其中第二段话明确的说明了“定时器每产生一次更新事件,SPI1/SPI2这两个主从通信模块就进行一个数据的收发”,我想要实现的是定时器每产生一次更新事件,SPI1/SPI2这两个主从通信模块就进行6个字节数据的收发。说白了就是定时器溢出一次,触发DMA传输6次,将6个字节送到SPI的发送DR,从而将6个字节的数据从SPI连接的设备中读出。

xmshao 回答时间:2021-12-10 11:42:16

kokoro 发表于 2021-12-10 10:25
谢谢,这篇文章我看到了,但是不能实现我说的这个功能。</p>
<p>

[md]ok,是的,跟你的要求还不太一样。

你能否告知下芯片型号,或许可以再试试。一起探讨无妨。

如果你所用芯片是G4/F7/H7这些,它们带有DMAMUX,也有机会实现的。

kokoro 回答时间:2021-12-10 12:24:05

xmshao 发表于 2021-12-10 11:42</p>
<p>[md]ok,是的,跟你的要求还不太一样。

[md]我用的是STM32L4Q5,有DMAMUX。

(PS:题外话,L4+系列DMA貌似都不支持突发传输和双缓冲管理,不知道为什么砍掉这些)

C^ 回答时间:2022-1-12 09:36:40

捕获.PNG2.PNG这个我做过,总共需要2个DMA,定时器更新事件触发的DMA配置DMA_MEMORY_TO_PERIPH,MEMORY的地址是你SPI读取指令。SPI的DMA就正常使用

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版