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

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

3天内不再提示

STM32 DMA传输的问题分析

茶话MCU 来源:茶话MCU 2023-12-01 09:19 次阅读

问题1、

用户使用STM32G473RET6芯片,开发环境STM32CubeMX+Keil(LL库)。使用DMA1通道1,在半传输中断和完全传输中断里,拷贝ADC采集的数据。在应用过程中发现DMA半传输中断和完全传输中断不能独立使用。

具体体现:
1、在DMA1初始化时,打开了半传输中断,关闭完全传输中断,照样能触发完全传输中断
LL_DMA_EnableIT_HT(DMA1,LL_DMA_CHANNEL_1);//打开DMA1半传输中断
LL_DMA_DisableIT_TC(DMA1,LL_DMA_CHANNEL_1);//关闭DMA1完全传输中断
2、在DMA1初始化时,关闭了半传输中断,打开完全传输中断,照样能触发半传输中断
LL_DMA_EnableIT_TC(DMA1,LL_DMA_CHANNEL_1);//打开DMA1完全传输中断
LL_DMA_DisableIT_HC(DMA1,LL_DMA_CHANNEL_1);//关闭DMA1半传输中断

这个问题很让他很困惑,想知道怎么回事。

关于这个问题,我们在操作DMA相关的使能位或做相关传输长度配置时,一定要注意他们往往要求在DMA通道未被使能的前提下进行【具体阅读芯片手册】。现在的问题是,他想对DMA传输中断使能位进行改写,依然也有这个前提。见下图黄色高亮内容,即当相应DMA通道被使能时,是不接受对相应DMA通道的传输完成和半完成中断使能的改写。

3c31184e-8f7a-11ee-939d-92fbcf53809c.png

换言之,这里若要对相应中断使能位进行改写,得先将DMA通道使能位【EN位】进行清零。使用LL库的话就调用LL_DMA_DisableChannel()函数实现,修改相应中断使能位之后再将DMA通道打开,即调用LL_DMA_EnableChannel()函数。

3c7126be-8f7a-11ee-939d-92fbcf53809c.png

问题2、用户使用STM32G431芯片,用到TIMER1的PWM功能,并启用基于TIMER事件的DMA Burst传输实现4个比较通道寄存器的批量修改。使用CubeMx进行配置。配置时发现一点疑惑,为什么外设端不需地址自增的勾选。

3c831ab8-8f7a-11ee-939d-92fbcf53809c.png

现在用户的具体情况就是利用TIMER更新事件触发DMA请求,每次更新事件触发DMA将4个内存数据转发给定时器的4个CCR寄存器。

3c985a36-8f7a-11ee-939d-92fbcf53809c.png

按照客户的理解,在做DMA配置时这里的外设地址也应该勾选自增才对,可事实发现不勾选才结果正常,若选择外设地址自增了反而异常。

3cb7314a-8f7a-11ee-939d-92fbcf53809c.png

3cddd4d0-8f7a-11ee-939d-92fbcf53809c.png

ST公司设计人员为了满足DMA对TIMER寄存器批量访问,还特别设计了2个寄存器,分别是TIMx_DCR和TIMx_DMAR。其中,DCR寄存器由DBL和DBA字段组成。

DBA:被访问的第一个定时器寄存器相对于定时器地址映射表中的TIMx_CR1的地址偏移量【偏移量从0开始计算】。

DBL:每组批量访问的寄存器个数【从0开始计算】。DMA访问DMAR寄存器时,按照如下算式得到绝对地址实现对寄存器的逐个访问。(TIM2_CR1address) + (DBA + DMA index)x 4。

对于定时器DMA BURST传输,外设地址就是TIM2_DMAR寄存器的地址。DMA根据上面地址算式实现对多个TIMER寄存器的访问。TIM2_DMAR寄存器地址本身是固定的,无须增减,所以基于定时器事件DMA Burst模式配置外设时不要做地址自增勾选。

当然,上面需求也可以基于非Burst模式来完成。假设还是基于4个内存数据修改4个CCR寄存器,此时则需要4次定时器事件触发DMA请求,做DMA配置时需要将内存端和外设端都选择地址自增模式。基于CubeMx的参考配置如下:

3d008994-8f7a-11ee-939d-92fbcf53809c.png

当然,相应API函数也跟Burst模式下的也不一样【这里依然使用更新事件申请DMA】。 HAL_DMA_Start_IT(&hdma_tim1_up,(uint32_t)T1_CCRData, (uint32_t)&htim1.Instance->CCR1,4); 下面是两种不同访问模式下的示意图,图示可能更直观些。

3d372936-8f7a-11ee-939d-92fbcf53809c.png

好,今天的分享就到这里,下次再聊。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    95

    文章

    5651

    浏览量

    539459
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348738
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99020
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447

原文标题:关于STM32 DMA传输的两个问题释疑

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

收藏 人收藏

    评论

    相关推荐

    使用STM32自带DMA传输数据

    使用STM32自带DMA传输数据,可以减轻CPU负担,只需设置一些参数即可发送想要发送的数据,以下是STM32F1系列芯片测试过的部分代码,可实现D
    发表于 08-17 06:30

    介绍几个是常用的DMA传输路径

    STM32 DMA简述**DMA (Direct Memory Access) ** 直接内存存储器,在做数据传输时能够大大减轻CPU的负担。DMA
    发表于 01-11 07:36

    STM32_DMA应用与性能分析

    很好的一份关于STM32DMA分析资料,可以给开发者一个借鉴
    发表于 07-01 16:45 7次下载

    STM32 DMA应用与性能分析

    STM32 DMA应用与性能分析 学习资料,感兴趣的小伙伴们可以瞧一瞧。
    发表于 09-06 17:33 11次下载

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

    有人使用STM32的定时器事件触发DMA,让其将内存数据传输到通信外设的数据寄存器进行发送,发现DMA根本就不动作。
    的头像 发表于 11-25 09:21 2w次阅读
    <b class='flag-5'>STM32</b>定时器触发<b class='flag-5'>DMA</b>数据<b class='flag-5'>传输</b>失败的原因如何解决

    STM32F429芯片带FIFO的DMA传输实现过程

    STM32系列芯片都内置DMA外设,其中很多系列的DMA配备了FIFO。这里以STM32F429芯片及开发板为例,演示一下带FIFO的DMA
    的头像 发表于 09-04 14:36 6128次阅读
    <b class='flag-5'>STM32</b>F429芯片带FIFO的<b class='flag-5'>DMA</b><b class='flag-5'>传输</b>实现过程

    STM32学习之DMA 直接寄存器读取

    关于STM32学习分享第六章 DMA 直接寄存器读取文章目录关于STM32学习分享前言二、代码1.dma_mtm.c2.dma_mtm.h3.main.c总结前言开始!开始!单片机的输
    发表于 12-16 16:58 13次下载
    <b class='flag-5'>STM32</b>学习之<b class='flag-5'>DMA</b> 直接寄存器读取

    STM32基础-----DMA

    STM32基础-------DMA
    发表于 12-20 19:35 10次下载
    <b class='flag-5'>STM32</b>基础-----<b class='flag-5'>DMA</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>

    DMA】浅谈STM32F4xx的DMA(附初始化代码)

    访问这次分析的是STM32F4xx系列的DMA,需要注意的是F4系列的DMA和F1系列的DMA在结构上有所不同!
    发表于 01-17 09:59 2次下载
    【<b class='flag-5'>DMA</b>】浅谈<b class='flag-5'>STM32</b>F4xx的<b class='flag-5'>DMA</b>(附初始化代码)

    STM32F10XXX使用DMA传输ADC转换的数据

    STM32F10XXX使用DMA传输ADC转换的数据教程说明。
    发表于 04-24 10:12 6次下载

    STM32U59 SPI DMA发送未产生传输完成中断问题分析

    某客户发现修改代码后,STM32U59 SPI DMA 发送未产生传输完成中断,但修改的代码跟 SPI 以及 DMA 毫无关联。
    的头像 发表于 09-01 12:11 4586次阅读

    DMA带中断的内存到内存传输

    :     现在按以下键生成代码:Ctrl + S 4.1 HAL 库 DMA 与 IT 流程↑ DMA 初始化在main.c中生成。 HAL_DMA_Start_IT:开始DMA缓冲
    发表于 03-23 15:23 1867次阅读
    <b class='flag-5'>DMA</b>带中断的内存到内存<b class='flag-5'>传输</b>

    STM32F1的DMA使用

    在前面我们提到过 DMA,这一章我们就来学习 STM32F1 的DMA 使 用。要实现的功能是:通过 K_UP 按键控制 DMA 串口 1 数据的传送,在传送过程中让 D2 指示灯不断
    的头像 发表于 06-22 10:23 1552次阅读
    <b class='flag-5'>STM32</b>F1的<b class='flag-5'>DMA</b>使用

    STM32DMA的五大问题

    1,DMA控制器的内部结构STM32中的DMA控制器是一种用于在外设和存储器之间传输数据的专用硬件。DMA控制器的内部结构主要包括以下几个关
    的头像 发表于 12-10 08:00 608次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>DMA</b>的五大问题