硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 1043|回复: 10
收起左侧

[ADC] H750-代码在片外执行ADC的DMA读取和转换速度与片内有差异

[复制链接]

3

主题

15

回帖

24

积分

新手上路

积分
24
发表于 2025-11-28 10:55:18 | 显示全部楼层 |阅读模式
用QSPI内存映射之后跳转到外部Flash执行代码,发现卡在定时中断里出不来了,测量ADC的DMA读取和发起下一次转换的代码执行时间发现差距很大,QSPI没有配置使用DMA。ADC的DMA配置和读取函数如下,ADC1读取了4个通道的数。片内运行时,用了3us执行片外运行时,用了8us执行可能是什么原因导致这样的差异,现在排查找不到方向
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2025-11-28 15:27:26 | 显示全部楼层
内容不知道为啥不见了,QSPI进入内存映射模式之后,跳转到片外执行APP,发现片外执行ADC的DMA转换以及浮点计算的时间变长。C:\Users\Tim\Desktop\ADC的DMA.png
ADC的DMA.png
回复

使用道具 举报

13

主题

532

回帖

571

积分

金牌会员

积分
571
发表于 2025-11-28 15:48:08 | 显示全部楼层
不是很正常么,片内片外速度不一样,
回复

使用道具 举报

5

主题

337

回帖

352

积分

高级会员

积分
352
发表于 2025-11-29 09:05:08 | 显示全部楼层
qspi肯定要慢点的,可以看下qspi的读指令是不是Fast Read Quad I/O,qspi的sck时钟是不是提到最高了,然后把mpu设置下,把外部flash地址设置成bufferable、cacheable、not shareable
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124425
QQ
发表于 2025-11-29 10:16:47 | 显示全部楼层
lpc980408 发表于 2025-11-28 15:27
内容不知道为啥不见了,QSPI进入内存映射模式之后,跳转到片外执行APP,发现片外执行ADC的DMA转换以及浮点 ...

1、你这个代码实现有点问题,从代码来看,没有看到你的START ADC DMA后等待传输完成就读取数据了,不太合理。

2、开QSPI最高性能,左上角这个配置


回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2025-11-29 14:31:00 | 显示全部楼层
DX3906 发表于 2025-11-29 09:05
qspi肯定要慢点的,可以看下qspi的读指令是不是Fast Read Quad I/O,qspi的sck时钟是不是提到最高了,然后 ...

好的,之前用的单线读取,是会慢一些的,我检查下
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2025-11-29 14:32:49 | 显示全部楼层
eric2013 发表于 2025-11-29 10:16
1、你这个代码实现有点问题,从代码来看,没有看到你的START ADC DMA后等待传输完成就读取数据了,不太合 ...

好的硬汉哥,因为放在50us的定时中断里操作,所以是先读取然后发起下一次转换了。MPU这块好像没配,我去试一下
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2026-1-14 09:59:32 | 显示全部楼层
发现一个新问题,if(HAL_ADC_Start_DMA(&ADCHandle1, (uint32_t *)ADC1ValuesGet,ADC1_CHS)!= HAL_OK)除了第一次返回的是HAL_OK,之后返回的都是HAL_BUSY。像是标志位没清除,这个应该调用什么函数重置它的状态。之前是这么写的,后来找官方例程里函数调用,也没成。之前程序里不管片内片外,直接转换读取也都是能正常工作的,这个标志不清楚会带来什么影响。
HAL_BUSY.png
中断处理.png
中断处理2.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124425
QQ
发表于 2026-1-15 09:47:12 | 显示全部楼层
lpc980408 发表于 2026-1-14 09:59
发现一个新问题,if(HAL_ADC_Start_DMA(&ADCHandle1, (uint32_t *)ADC1ValuesGet,ADC1_CHS)!= HAL_OK)除了 ...

这个操作姿势不对,存在之前的转换还没有完成,就发起新操作的问题,你需要ADC中断和DMA中断都打开,中断里面仅写HAL的处理函数。

然后你的处理要在ADC的传输完成回调里面处理。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2026-1-15 11:56:19 | 显示全部楼层
eric2013 发表于 2026-1-15 09:47
这个操作姿势不对,存在之前的转换还没有完成,就发起新操作的问题,你需要ADC中断和DMA中断都打开,中断 ...

我后来改成只在DMA中断里清状态,在ADC完成的回调里读数了,但是返回的状态还是BUSY。用示波器抓取,从执行ADC转换到DMA中断结束,这个里面包含的转换时间是远小于定时中断时间的,应该不会在上次转换没完成就发起下次转换吧。
在ADC完成中断里读取数据.png
示波器抓取时序.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124425
QQ
发表于 2026-1-16 10:45:59 | 显示全部楼层
lpc980408 发表于 2026-1-15 11:56
我后来改成只在DMA中断里清状态,在ADC完成的回调里读数了,但是返回的状态还是BUSY。用示波器抓取,从执 ...

不行的话,参考我们V7的例子改下吧,做了定时器触发ADC+DMA双缓冲实现。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-24 08:44 , Processed in 0.947964 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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