硬汉嵌入式论坛

 找回密码
 立即注册
查看: 839|回复: 6
收起左侧

[STM32H7] 怎么对DMA/BDMA的搬运位置做初始化

[复制链接]

8

主题

33

回帖

57

积分

初级会员

积分
57
发表于 2024-7-19 10:38:15 | 显示全部楼层 |阅读模式
我用定时器触发ADC转换,然后使用DMA/BDMA搬运,中间定时器触发会停止,下次启动时BDMA的搬运位置好像还是上次停止的,求解?


下图时半转换完成,转换完成跟这个差不多,都是把数据拷贝走


第一次触发后正常,后面的都就不正常了


回复

使用道具 举报

8

主题

33

回帖

57

积分

初级会员

积分
57
 楼主| 发表于 2024-7-19 12:06:45 | 显示全部楼层
图片怎么不见了, 换句话问:DMA外设地址计数怎么复位?
回复

使用道具 举报

5

主题

25

回帖

40

积分

新手上路

积分
40
发表于 2024-7-19 14:12:29 | 显示全部楼层
我都是直接写寄存器,将NDTR值清零。((DMA_Stream_TypeDef *)hdma_uart4_rx.Instance)->NDTR=(u32)datalength;

评分

参与人数 1金币 +2 收起 理由
capw + 2 很给力!

查看全部评分

回复

使用道具 举报

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
发表于 2024-7-19 16:31:59 | 显示全部楼层
Alex_Alex 发表于 2024-7-19 14:12
我都是直接写寄存器,将NDTR值清零。((DMA_Stream_TypeDef *)hdma_uart4_rx.Instance)->NDTR=(u32)dataleng ...

是不是有个什么循环模式你没有使能 ?
回复

使用道具 举报

5

主题

25

回帖

40

积分

新手上路

积分
40
发表于 2024-7-19 17:16:08 | 显示全部楼层
hpdell 发表于 2024-7-19 16:31
是不是有个什么循环模式你没有使能 ?

不管是循环模式还是单次搬运,楼主的是使用TIMER将DMA搬运停止的,如果不充值NDTR值的话,下次再启动搬运还是从上次停止的地方搬运。只有将NDTR值清零,才会搬运到设定的目标地址的开始。
回复

使用道具 举报

8

主题

33

回帖

57

积分

初级会员

积分
57
 楼主| 发表于 2024-7-19 20:31:58 | 显示全部楼层
Alex_Alex 发表于 2024-7-19 17:16
不管是循环模式还是单次搬运,楼主的是使用TIMER将DMA搬运停止的,如果不充值NDTR值的话,下次再启动搬运 ...

U Are Right!
原因就是每次timer停止触发后,DMA的NDTR有未搬走的长度值,所以每次开始前先把NDTR设置为搬运长度初始值。 HAL库可以使用宏__HAL_DMA_SET_COUNTER,但在设置前先要禁用DMA。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-7-20 09:09:16 | 显示全部楼层
capw 发表于 2024-7-19 12:06
图片怎么不见了, 换句话问:DMA外设地址计数怎么复位?

图片这个是论坛的bug,直接复制粘贴不行,得专门编辑里面上传。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-29 06:21 , Processed in 0.302507 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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