0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

茶话MCU 来源:未知 作者:易水寒 2018-11-25 09:21 次阅读

有人使用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
    +关注

    关注

    2270

    文章

    10900

    浏览量

    355933
  • 定时器
    +关注

    关注

    23

    文章

    3248

    浏览量

    114784
  • dma
    dma
    +关注

    关注

    3

    文章

    561

    浏览量

    100574

原文标题:定时器触发DMA数据传输失败之案例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32通过DMA方式传输TIM3定时器计数值,数值重复是为什么?

    AD值防止数据错乱,故DMA配置必须放在ADC之前。) 因此为了排除相同原因导致的数据重复,所以将DMA配置放在TIM3
    发表于 04-10 06:50

    STM32F103定时器触发ADC+DMA传输 精选资料分享

    STM32F103定时器触发ADC+DMA传输ADC除了软件触发方式之外还有外部
    发表于 08-11 06:05

    stm32 定时器触发ADC多通道采样+DMA提取数据相关资料下载

    stm32g0 定时器触发ADC多通道采样+DMA提取数据stm32g0
    发表于 02-15 06:46

    stm32数据传输的相关资料分享

    简介DMA,全称Direct Memory Access,即直接存储访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和
    发表于 02-22 06:58

    DMA进行数据传输和CPU进行数据传输的疑问

    求大佬解答,本人正在学习STM32单片机中DMA直接数据存储部分的内容 看了DMA简介后,也上手过实例代码,但是没有实际的项目经验,所以有以下疑问:
    发表于 05-25 17:18

    DMA数据传输(源代码分享)

    手头项目也需要加入DMA数据传输,以最大限度地提升CPU效率,于是测试了一下XMEGA的DMA模块,把一块内存中的数据DMA
    的头像 发表于 04-27 09:22 9159次阅读

    DMA数据传输在SPEAR300实现高速串口驱动设计

    DMA数据传输无需CPU的参与,是一种更加高效的数据传输方式。现有的DMA数据传输方案都是基于DMA
    发表于 04-04 12:23 1619次阅读
    <b class='flag-5'>DMA</b><b class='flag-5'>数据传输</b>在SPEAR300实现高速串口驱动设计

    测试代码中使用DMA传输定时器触发ADC

    现在共用到ADC1模块的4个ADC通道,即1个片内Vrefint通道和其它三个外部通道CH8,CH10,CH17。下面测试代码中使用DMA传输定时器触发ADC.
    的头像 发表于 08-10 16:22 4490次阅读
    测试代码中使用<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>,<b class='flag-5'>定时器</b><b class='flag-5'>触发</b>ADC

    STM32CUBEMX配置教程(十二)STM32定时器触发的固定频率ADC采样(使用DMA

    STM32CUBEMX配置教程(十二)STM32定时器触发的固定频率ADC采样(使用DMA
    发表于 11-24 13:51 85次下载
    <b class='flag-5'>STM32</b>CUBEMX配置教程(十二)<b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b><b class='flag-5'>触发</b>的固定频率ADC采样(使用<b class='flag-5'>DMA</b>)

    STM32CUBEMX配置教程(十三)STM32定时器触发的固定频率DAC输出(使用DMA

    STM32CUBEMX配置教程(十三)STM32定时器触发的固定频率DAC输出(使用DMA
    发表于 11-24 14:06 46次下载
    <b class='flag-5'>STM32</b>CUBEMX配置教程(十三)<b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b><b class='flag-5'>触发</b>的固定频率DAC输出(使用<b class='flag-5'>DMA</b>)

    STM32F103定时器触发ADC+DMA传输

    STM32F103定时器触发ADC+DMA传输ADC除了软件触发方式之外还有外部
    发表于 11-30 10:36 57次下载
    <b class='flag-5'>STM32</b>F103<b class='flag-5'>定时器</b><b class='flag-5'>触发</b>ADC+<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>

    H743定时器触发ADC转换DMA传输之应用

    学习安富莱的H743的定时器触发ADC DMA传输源码
    发表于 11-30 11:21 11次下载
    H743<b class='flag-5'>定时器</b><b class='flag-5'>触发</b>ADC转换<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>之应用

    stm32 定时器触发ADC多通道采样+DMA提取数据

    stm32g0 定时器触发ADC多通道采样+DMA提取数据stm32g0
    发表于 12-16 16:56 68次下载
    <b class='flag-5'>stm32</b> <b class='flag-5'>定时器</b><b class='flag-5'>触发</b>ADC多通道采样+<b class='flag-5'>DMA</b>提取<b class='flag-5'>数据</b>

    STM32CubeMX-串口开启DMA进行数据传输

    STM32CubeMX笔记-串口开启DMA进行数据传输
    发表于 12-27 18:40 7次下载
    <b class='flag-5'>STM32</b>CubeMX-串口开启<b class='flag-5'>DMA</b>进行<b class='flag-5'>数据传输</b>

    stm32数据传输

    简介DMA,全称Direct Memory Access,即直接存储访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和
    发表于 12-28 19:08 8次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>数据传输</b>