[STM32H7] STM32H743 ADC DMA 数据传输丢数

[复制链接]
 楼主| 日生光军 发表于 2019-9-26 10:51 | 显示全部楼层 |阅读模式

STM32H743 ADC DMA 数据传输丢数 请高手指点  详见图,我使用ADC3 IN14和IN15两个通道连续采集数据,使用在HAL_ADC_ConvHalfCpltCallback函数中调用SCB_InvalidateDCache_by_Addr((uint32_t *) &ADC3_DATA[0], ADC_CONVERTED_DATA_BUFFER_SIZE);转移数据;
在HAL_ADC_ConvCpltCallback函数中,SCB_InvalidateDCache_by_Addr((uint32_t *) &ADC3_DATA[ADC_CONVERTED_DATA_BUFFER_SIZE/2], ADC_CONVERTED_DATA_BUFFER_SIZE);转移数据,但是出现了图片上的数据缺失,请高手指点,不胜感激。。
8cb22fe225bd49fcf8ba6ddf51b7dd8.jpg
kingkits 发表于 2019-9-26 13:17 | 显示全部楼层
那不是数据丢失,那只是两次采样数据是一样的(没变化)
香水城 发表于 2019-9-26 15:12 | 显示全部楼层
想知道你的数组的内存地址安排在哪里? 用的是哪个DMA?
caoenq 发表于 2019-9-26 17:10 | 显示全部楼层
我在使用STM32F1的时候遇到了类似的问题:ADC1,7个规则通道,Scan+DMA+ discontinus,每隔100ms开启一次转换扫描,会出现数据串道的问题,网上说是单片机硬件问题,无法解决。
caoenq 发表于 2019-9-26 17:11 | 显示全部楼层
kingkits 发表于 2019-9-26 13:17
那不是数据丢失,那只是两次采样数据是一样的(没变化)

即使两次采集到的数据一样,也是会触发DMA搬数据的,不应该是0
caoenq 发表于 2019-9-26 17:12 | 显示全部楼层
香水城 发表于 2019-9-26 15:12
想知道你的数组的内存地址安排在哪里? 用的是哪个DMA?

我在使用STM32F1的时候遇到了类似的问题:ADC1,7个规则通道,Scan+DMA+ discontinus,每隔100ms开启一次转换扫描,会出现数据串道的问题,网上说是单片机硬件问题,无法解决。我想向城主求证一下,如果真如网上所说,我也就放弃了,不再浪费时间。
香水城 发表于 2019-9-26 17:50 | 显示全部楼层
caoenq 发表于 2019-9-26 17:12
我在使用STM32F1的时候遇到了类似的问题:ADC1,7个规则通道,Scan+DMA+ discontinus,每隔100ms开启一次 ...

怎么可能呢? 我都测试过了。 你还是没告诉我问你的问题。
不过刚好从你的截图中看到一些我需要的信息了。
回头我再做个测试代码。
caoenq 发表于 2019-9-27 08:50 | 显示全部楼层
香水城 发表于 2019-9-26 17:50
怎么可能呢? 我都测试过了。 你还是没告诉我问你的问题。
不过刚好从你的截图中看到一些我需要的信息了。 ...

你好,城主。这个问题确实存在,网上也有很多人反映过这个问题。https://bbs.21ic.com/icview-224505-1-1.html
 楼主| 日生光军 发表于 2019-9-27 09:03 | 显示全部楼层
香水城 发表于 2019-9-26 15:12
想知道你的数组的内存地址安排在哪里? 用的是哪个DMA?

我用的ADC3  DMA1_Stream1通道
微信截图_20190927090423.png
 楼主| 日生光军 发表于 2019-9-27 09:06 | 显示全部楼层
香水城 发表于 2019-9-26 15:12
想知道你的数组的内存地址安排在哪里? 用的是哪个DMA?

数组地址直接定义的全局变量,没有指定存放地址的。
微信截图_20190927090600.png
香水城 发表于 2019-9-27 14:15 | 显示全部楼层
本帖最后由 香水城 于 2019-9-27 16:28 编辑

看看你不是你代码配置或硬件连接方面。
我这边用STM32H743就ADC1/ADC3同时做了测试,使用DMA传输没有发现问题。

ADC1我开启了8个通道,分3次间断扫描转换,DMA传输。通过定时器触发转换。

ADC3我开启了你说的那两个通道,分别接地和AVDD。软件启动,循环转换,DMA传输。数据放在长度为20的一个内存数组。

HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) ;
HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) ;

HAL_ADC_Start_DMA(&hadc1, Adc1_Data,  8);

HAL_ADC_Start_DMA(&hadc3, Adc3_Data,  20);

HAL_TIM_Base_Start(&htim3);

本来下面有配置贴图的,不知怎么变成那样子了。 其实配置也没什么特别的。

香水城 发表于 2019-9-27 14:56 | 显示全部楼层
香水城 发表于 2019-9-27 16:36 | 显示全部楼层
nstel 发表于 2019-9-28 07:01 | 显示全部楼层
STM32系列确实有这个问题。AD转换周期极快状态,DMA丢数据,AD转换周期太慢,DMA也丢数据。只在中间的范围,DMA不丢数据。
 楼主| 日生光军 发表于 2019-9-28 09:36 | 显示全部楼层
本帖最后由 日生光军 于 2019-9-28 09:38 编辑

非常感谢。我使用ADC3,通道是IN14和IN15,DMA使用的是DMA1_stream1,在转换一半中断拷贝数据和转换全部完成拷贝数据,另外我使用的编译器是STM32cubeIDE。
ADC3配置.png
DMA初始化.png
初始化.png
数据转移.png
 楼主| 日生光军 发表于 2019-9-28 09:43 | 显示全部楼层
nstel 发表于 2019-9-28 07:01
STM32系列确实有这个问题。AD转换周期极快状态,DMA丢数据,AD转换周期太慢,DMA也丢数据。只在中间的范围 ...

您好,您也碰到过么?是不是我ADC转换太快了?图片是我给配的时钟树。
时钟树1.png
时钟树2.png
 楼主| 日生光军 发表于 2019-9-28 10:29 | 显示全部楼层
本帖最后由 日生光军 于 2019-9-28 10:33 编辑

又发现一个新问题,,外接基准2.5V的。ADC3的IN15外接电位器调节到0V,重启MCU后调节点位器,到最大只能调节输出1V的。意思是重启后只能0V~1V的。在次重启后,输出2.5V,再次调节到最小只能输出1.5V,见图。在重启就输出0V了。。。  将代码丢上来吧,我也是测试ADC看看好不好用。。。
微信图片_20190928102944.jpg
微信图片_20190928102950.jpg

H743_ADC_Multichannel.rar

1.32 MB, 下载次数: 15

tangdianbing@16 发表于 2019-11-11 20:40 | 显示全部楼层
香水城 发表于 2019-9-27 14:15
看看你不是你代码配置或硬件连接方面。
我这边用STM32H743就ADC1/ADC3同时做了测试,使用DMA传输没有发现问 ...

你好,能不能把您的代码传上来参考一下,我也在调STM32H743的ADC 用DMA 传输的,但是DMA总是没有中断信号,调试几天了,暂时没什么进展!
香水城 发表于 2019-11-12 16:16 | 显示全部楼层
tangdianbing@16 发表于 2019-11-11 20:40
你好,能不能把您的代码传上来参考一下,我也在调STM32H743的ADC 用DMA 传输的,但是DMA总是没有中断信号 ...

关于ADC的DMA传输,库里面有参考代码。我的测试代码要去找找,经常会被更新,不一定有了。

你注意下你安排的内存是DMA可以访问到的,再就是注意Cache问题,保证读取数据时是更新过的。

实在不行,你邮件到mcu.china@st.com.描述下的你的情况。
tangdianbing@16 发表于 2019-11-12 19:14 | 显示全部楼层
本帖最后由 tangdianbing@16 于 2019-11-12 19:20 编辑
香水城 发表于 2019-11-12 16:16
关于ADC的DMA传输,库里面有参考代码。我的测试代码要去找找,经常会被更新,不一定有了。

你注意下你安 ...

谢谢回复,我再研究下,刚开始搞这个H743对HAL库里面的一些操作和函数调用还不太明白.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

104

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部