有人使用STM32的定时器事件触发DMA,让其将内存数据传输到通信外设的数据寄存器进行发送,发现DMA根本就不动作。
比方以基于STM32F411的芯片为例,通过TIM3更新事件触发DMA请求,DMA从内存将数据送到SPI1的数据寄存器,从而完成数据发送。
他采用CubeMx进行配置。基本配置如下:[文中图片可以放大观看]


相关用户实现代码如下:

从配置过程和代码实现来看,似乎都没有问题。那DMA怎么就是不动作呢?
问题出在我们使用上面的函数做DMA传输所关联源端和目标端时,出现了想当然的情况。
我们利用TIMER事件来作为DMA请求源时,而作为数据传输的源端或目的端,都是我们用户指定的。这时就一定要注意源端和目标端是当前DMA流所支持的。否则就会出现乱点鸳鸯谱,DMA根本可能就跑不起来。就像你叫了某快递公司,它的服务范围是相对固定的,并非你想去哪里她就能服务到哪里。
比方上面的例子,如果改成SPI2就没问题。为什么刚才SPI1不行呢,因为DMA1根本访问不到SPI1,我们不妨看看基于STM32F411芯片的内部功能及总线框图就很清晰了。

从上图不难看出DMA1是访问不到SPI1或SPI4这些外设的,或者说DMA1就没法访问挂在APB2总线上的外设,只能访问APB1总线上的外设。
小结:一般来讲,基于某触发事件,对应的DMA数据流就可以确定下来了,那该DMA数据流的传输范围往往也随之确定。我们在为该DMA数据流指定源端和目标端时一定要符合其传输范围,否则会出现传输无法完成的情形。换言之,我们在做DMA传输时,为了实现DMA的有效传输,往往需要结合源端和目的端来调整或选择合适的DMA数据流。结合前面的比方,如果这家快递公司到不了,我们换一家可能就轻松解决了。
-
STM32
+关注
关注
2305文章
11122浏览量
371193 -
定时器
+关注
关注
23文章
3361浏览量
121756 -
dma
+关注
关注
3文章
577浏览量
105364
原文标题:定时器触发DMA数据传输失败之案例
文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
STM32通过DMA方式传输TIM3定时器计数值,数值重复是为什么?
stm32数据传输的相关资料分享
DMA进行数据传输和CPU进行数据传输的疑问
DMA数据传输(源代码分享)
DMA数据传输在SPEAR300实现高速串口驱动设计
测试代码中使用DMA传输,定时器触发ADC
STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA)
STM32CUBEMX配置教程(十三)STM32的定时器触发的固定频率DAC输出(使用DMA)
stm32数据传输

STM32定时器触发DMA数据传输失败的原因如何解决
评论