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

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

3天内不再提示

dma传输adc值中间出现0

分享:

在使用DMA传输ADC数据时出现中间值为0的情况,可能由以下原因导致。请根据以下方向逐步排查:


1. 硬件问题

  • ADC输入引脚接触不良:检查传感器或输入信号是否稳定,ADC引脚是否虚焊或接触不良。
  • 信号干扰:模拟信号线附近是否有高频噪声源(如PWM、时钟线),导致ADC误采样为0。
  • 电源/地线问题:ADC参考电压(VREF)是否稳定?模拟地和数字地是否分开布局并单点共地?

2. DMA配置问题

  • 传输长度错误:DMA配置的传输数据量(NDTR寄存器)是否小于实际ADC数据量?未传输区域可能保留初始值0。
  • 内存地址未对齐:ADC数据位宽(如12位)与DMA接收缓冲区类型(如uint16_t)是否匹配?内存对齐错误可能导致数据错位。
  • 缓冲区溢出:DMA接收缓冲区是否太小?数据覆盖时可能残留0值。
  • 传输模式错误:是否启用循环模式(Circular Mode)?单次模式(One-Shot)传输后DMA停止,后续数据可能丢失。

3. ADC配置问题

  • 采样时序冲突:ADC采样时间过短,导致转换未完成时DMA已读取旧数据(包括0)。
  • 多通道扫描顺序错误:多通道采样时,若某通道未使能或扫描顺序错乱,可能读取到未初始化的寄存器(值为0)。
  • 触发源配置错误:ADC是否配置为连续转换模式?若为外部触发,触发信号是否正常?

4. 数据同步问题

  • DMA启动时机不当:在ADC尚未开始转换时启动DMA,初始内存区域可能为0。
  • 数据寄存器未复位:ADC数据寄存器(DR)在首次读取前可能包含残留值0,需确保在DMA传输前清除。

5. 中断干扰

  • 高优先级中断抢占:若DMA传输被其他高优先级中断打断,可能导致传输不完整。
  • 中断服务程序(ISR)错误:在DMA传输完成中断(TC)中错误地复位了缓冲区或配置。

排查步骤

  1. 检查硬件连接:用万用表测量ADC输入引脚电压,确认信号正常。
  2. 使用调试器观察内存:在DMA传输过程中实时查看接收缓冲区,确认0值出现的位置规律。
  3. 简化代码测试:关闭其他外设,仅保留ADC+DMA传输,排除资源冲突。
  4. 配置交叉验证:参考芯片手册核对ADC和DMA的寄存器配置(如STM32的DMA_CCRxADC_CR2等)。

示例代码修正(STM32)

// 确保ADC和DMA配置顺序正确:
// 1. 启动DMA
HAL_DMA_Start(&hdma_adc, ADC1->DR, (uint32_t)adc_buffer, BUFFER_SIZE);
// 2. 启动ADC并开始转换
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, BUFFER_SIZE);

// 检查DMA传输位宽(例如12位ADC应使用16位缓冲区)
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // 16位
hdma_adc.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;

如果问题仍未解决,建议提供具体芯片型号和代码片段,以便进一步分析。

ADC采集加入DMA传输后,原本正常的ADC采集的变小了

){ //一下三行调试时用,方便观测ADC是否开启u16 adc;adc = Get_Adc(ADC_CH0); //规则序列中的第一个转换 // !!!!!这里采集来的在用DMA传输前后不一致,大概

wyerywsfsf 2019-06-20 04:35:09

如何通过ADC-DMA多通道获得适当的ADC

我希望通过 ADC-DMA 多通道获得适当的 ADC 。这些 ADC-DMA 有 4 个通道:试图从 3 个外部端口获取 3 个电压数据,从一个内部端口获取温度数据。但我意识到我从外部端口得到的

Tussi 2023-01-17 08:23:37

如何用ADC测量内部温度传感器的并用DMA方式传输

ADC具体配置步骤有哪些?如何用ADC测量内部温度传感器的并用DMA方式传输呢?

ChristineGu 2021-11-25 07:48:56

28335 ADCDMA传输如何实现?

ADC在连续采集模式下,通过DMA传输数据,假设SEQ1一次采集4个通道,循环采集10次,在这种情况下,是否只需要1次SEQ1INT触发DMA传输,还是SEQ1复位时需要清除SEQ1INT,以便下一次触发DMA传输

wupei1024 2020-05-12 08:14:33

STM32 DMA传输的问题分析

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

2023-12-01 09:19:48

DMA传输ADC采样数据总是上一次的数据是为什么?

的,我通过模拟看门狗检测电压变化,当超限时将DMAADC采样到的数据传输出去,但是经过debug调试和示波器的观察,我可以明显的看出ADC[]数组里面的是上一次电压变化的。 而开机后,第一次触发看门狗进行DMA传输ADC[]的都为0.

yisen282 2023-08-09 08:16:27

DMA传输ADC采样数据为什么总是上一次的数据?

的,我通过模拟看门狗检测电压变化,当超限时将DMAADC采样到的数据传输出去,但是经过debug调试和示波器的观察,我可以明显的看出ADC[]数组里面的是上一次电压变化的。 而开机后,第一次触发看门狗进行DMA传输ADC[]的都为0.

wo4456 2023-08-04 09:46:44

怎么从DMA读取ADC

) AD1CON1bits.AD12B = 1; // 12-bit ADC operation ////?? AD1CON1bits.ADDMABM = 0; // DMA buffers are built

ianwhoani 2019-05-28 11:21:16

STM32G0开发笔记:多通道ADCDMA的使用

使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为多通道ADCDMA的使用。

2023-01-17 10:41:03

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

现在共用到ADC1模块的4个ADC通道,即1个片内Vrefint通道和其它三个外部通道CH8,CH10,CH17。下面测试代码中使用DMA传输,定时器触发ADC.

2020-08-10 16:22:29

DMA与由定时器触发的ADC结合使用时的报错问题求解

,当我探测 LED 上的信号时,它显示 500 Hz(它切换每个 ADC 转换,所以这是有道理的)。当我尝试使用 DMA 通道将数据从 ADC 通道传输到循环缓冲区时,我的问题就出现了。我将 DMA

jiangwenwen 2023-01-30 06:47:07

MM32 用DMA读取ADC数据

.h"uint16_t AD_value[10];//ADC采样的数据经过DMA传输的数据放在这里 unsigned short LI_ADCflag=0;//ADC I/O口初始化void

老天最爱的崽 2021-05-15 16:42:57

CH32V307 ADC DMA多通道采集

)ADC_ConvertedValue; //配置存储器地址为读取ADC地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//配置数据源为外设,即DMA传输方式

l爱学习 2023-03-22 19:17:09

S32K342模数转换器模块无法获得DMA传输类型的原因?

我同时将 ADC0 配置为中断,将 ADC1 配置为 DMA 传输类型。对于中断,我可以在寄存器中获得转换后的结果。但我无法获得 DMA 传输类型的。 使用 DMA 没有得到结果的原因是

南中南 2023-03-15 08:48:04

MSP432的DMA乒乓模式怎么使用来连续传输ADC采集数据?

| DMA_CH7_ADC14UDMA_MODE_PINGPONG (void*)ADC14->MEM[0]data_array1 DAM_SIZE); //设置通道传输参数ADC映射主

gvjhvbc 2023-10-07 09:05:28

STM32U5 ADC+DMA配置演示

随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。

2023-07-29 16:19:13

请问CH32V307的ADC2能用DMA传输数据吗?

各位大佬,我最近在用CH32V307,想要使用DMA传输ADC2的数据,但是一直不成功。传输ADC1的数据正常。debug的时候,看ADC2的ADC_CTLR2寄存器的[DMA]位一直是0,且不能被置1.所以来社区请教,ADC2能不能用DMA传输数据?

hjfjsdgfjdsf 2022-05-27 06:10:44

使用CubeMX生成的代码来配置ADCDMADMA遇到传输错误怎么处理?

我正在尝试使用循环 DMA 将数据从 ADC1 传输到缓冲区,使用 CubeMX 生成的代码来配置 ADCDMADMA 流在传输第一项时遇到传输错误。该设备是 STM32H743。使用调试器

qi12345 2022-12-15 09:02:52

请问DMA传输ADC数据至存储器,再将存储其数据传至lwip向上位机传送时传输出错该怎么办?

程序经过多次测试发现问题存在DMA传输部分,最终传输结果全为零,求解这是DMA设置:在主程序中,调用了DMA程序,并且设置初始化了LWIP(借鉴的寄存器版本开发指南),进行传输:(以下省略了LWIP

奋斗的头发 2019-07-22 00:08:10

如何在dma w/adc传输的开头添加“帧开始”字节?

。然后PC机通过加载功能自动将ADC数据流到PC机。采样将无限期地持续下去。作为示例,我正在采样具有0~100的数字的线性电压扫描。每次我从PC触发命令,我们将采样线性扫描。我们可以把每个扫描称为“框架

淡口味妻儿等我看 2019-09-16 14:03:07

怎样使用循环DMA将数据从ADC1传输到MCU SRAM中的缓冲区呢

我们正在尝试使用循环 DMA 将数据从 ADC1 传输到 MCU SRAM 中的缓冲区,使用 CubeMX 生成的代码来配置 ADCDMADMA 流在传输第一项时遇到传输错误。我尝试在

horayte 2022-12-16 06:14:03

用于 ADCDMA 乒乓

说明用于 ADCDMA 乒乓示例演示了如何使用 DMA 在两个不同的缓冲区之间传输 ADC 数据,这也称为 DMA“乒乓”。DMA 乒乓通常用于将数据传输到一个缓冲器,同时 CPU 使用另一个

dfasda 2023-04-13 11:07:03

基于APM32F411 DMA_ADC Handler模式分析及解决

最近在编写DMA_ADC例程的过程中出现了一个中断配置的问题,在ADC采集过程中,结合手册进行ADC连续转换模式配置采集,手册上给出需要进行中断配置的信息,但是真实情况不需要进行中断配置也可以进行

2025-06-24 14:30:37

求助!为什么使用ADC+DMA+外部定时器触发时,会一直循环在DMA中断里

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 2, ADC_SampleTime_239Cycles5 ); //通道 2,规则采样顺序为 2,采样时间为

天小涯 2020-11-16 20:29:48

请问谁有adc多通道dma传输数据的例程吗?

谁能给一份adc多通道dma传输数据的例程呢,跪谢啦!!!

低调青芒 2019-08-16 00:57:20

CH32FV2x的ADC2为什么不能单独通过DMA传输数据?

刚刚看了《CH32FV2x_V3xRM.pdf》,发现ADC2不能单独通过DMA传输数据,还是像STM32F103里一样,只有ADC1有独立的DMAADC2只能通过双ADC模式,利用ADC1的DMA功能传输

一巷清苑 2022-05-25 07:45:16

关于ADC多通道DMA配置的顺序

ADC多通道DMA配置的顺序:Enable DMA时钟 -> 配置ADC -> 配置DMA -> 开启传输 1、配置ADCADC_ChannelConfT...

hgimtk 2021-08-04 06:10:13

STM32的ADC外设通过DMA通道来传输数据

笔者之前用STM32的ADC外设通过DMA通道来传输数据,通常有两种方法,一个是直接通过DMA通道传输数据,二是通过定时器触发。相较而言,后者在实际中比较常使用,因为ADC读取传感器数据需要一段时间

小点zze 2021-08-19 09:18:43

STM32G030C8T6 使用STM32CUDE MX(LL库)配置初始化ADC DMA传输后,DR寄存器正常,DMA输出数据不正确

;ADC1->DR); // 内存地址LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1, (uint32_t)&AdcData.Buffer[0

哈哈幸福来啦 2021-07-14 10:26:10

求助,DMA传输错误的原因是什么?

,cc3脉冲为22。CC1 驱动 DMA1 stream4,它被设置为从内存传输到 GPIO BSSR 寄存器,cs assertCC2 驱动 DMA1 流 5 写入 16 位到 SPI Tx

摩托罗拉 2022-12-15 06:24:39

加载更多
相关标签