STM32 ADC 多通道 DMA 问题??

以下是DMA的配置
void DMA1_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;

DMA_DeInit(DMA1_Channel1); //初始化DMA

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&DMA_ADC1; //内存地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据的来源
DMA_InitStructure.DMA_BufferSize = 50;
// DMA_InitStructure.DMA_BufferSize = 2;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不递增
DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable;//内存地址递增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度半个字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存数据宽度半个字

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //没有设置为内存到内存

DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化DMA1
DMA_Cmd(DMA1_Channel1,ENABLE);
}

设置内存地址为递增,但是在调试时,我发现每次写入的地址都不变,没有递增,请问这是什么原因?纠结了很长时间???求教呀。。。

直接给你个能用的,你自己研究研究

vu16 ADC_ConvertedValue[Sample_Num][Channel_Num];
void ADC_DMA_Config(void)
{
 DMA_InitTypeDef DMA_InitStructure;
             
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 DMA_DeInit(DMA1_Channel1);
 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num;
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不变
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址递增
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 DMA_Cmd(DMA1_Channel1,ENABLE);
}
void ADC1_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 ADC_InitTypeDef ADC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 ADC_DMA_Config();
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// ADC_DeInit(ADC1);
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
 ADC_InitStructure.ADC_ScanConvMode = ENABLE;//多通道
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件启动转换
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换结果右对齐
 ADC_InitStructure.ADC_NbrOfChannel = Channel_Num;//通道数目
 ADC_Init(ADC1, &ADC_InitStructure); 
// ADC_TempSensorVrefintCmd(ENABLE);//使能片内温度传感器
 
 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //PCLK 6分频
 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);//通道,转换次序,转换时间
 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);
 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 6, ADC_SampleTime_239Cycles5);
 
 ADC_DMACmd(ADC1, ENABLE);
 
 ADC_Cmd(ADC1, ENABLE);
 ADC_ResetCalibration(ADC1);
 while(ADC_GetResetCalibrationStatus(ADC1));
 ADC_StartCalibration(ADC1);//开始校准
 while(ADC_GetCalibrationStatus(ADC1));
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC的软件转换启动功能
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-07-03
可以,多通道数据采集不只是dma一种方式,具体你可以看一下野火stm32的pdf文件

STM32CubeMX配置-ADC多通道配置(DMA)
设置ADC通道及其参数:在STM32CubeMX中,通过Sequencer参数来控制通道顺序,比如Rank1、2、3分别对应不同的采样通道。配置DMA:启用DMA能有效提高数据传输效率,确保采集数据的快速处理。在ADC配置中,要确保相关DMA通道被正确配置。配置引脚:确保ADC的输入引脚连接正确,这对于数据采集至关重要。在实际编程中...

stm32 adc多通道采集 使用dma 为什么只显示一个通道的值
\/* ADC DMA request in circular mode *\/ 5、 ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);这5个地方如果配置正确,那么就能采集到循环数据 按照顺序配置,先配置端口→配置DMA→配置ADC→配置通道ADC_ChannelConfig()→ADC校准→允许DMA→配置循环模式 ADC_DMARequestModeConfig()→允许AD...

stm32 adc多通道采集 使用dma 为什么只显示一个通道的值
ADC_InitStructure.ADC_ScanConvMode = ENABLE;\/\/扫描方式,这个一定要打开 ADC_RegularChannelConfig(ADC1, ADC_Channel_0 , 1, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);设置好采集顺序,dma会先发送先采集的通道的数据,后发送后采集...

stm32 adc多通道采集 使用dma 为什么只显示一个通道的值
一个ADC就是一个转换电路。多通道其实是通过将这个电路的输入与不同引脚连接。所以只有一个通道的值是对的。你可以查询一下STM32F10x参考手册,有中文版

STM32的ADC和DAC
同时,多通道ADC使用时需考虑通道间串扰问题,可通过增加采样间隔时间来缓解。I\/O引脚的串扰也可能干扰ADC输入,此时可能需要使用前置放大器来改善信号质量。DAC则负责将数字信号转换为模拟信号。STM32的DAC集成了缓冲功能,但可能产生失真,需根据输出要求调整输出阻抗和是否使用缓冲。使用时,输出频率和波形...

STM32U5 ADC+DMA配置演示
针对STM32U5系列MCU中的ADC1与ADC4的DMA配置演示,本文将详细解说基于标准请求模式与链表模式的实现过程,提供参考示例。首先,我们以ADC1为例进行标准请求模式的配置演示。选取ADC1的四个通道,设置为扫描模式与连续转换,通过DMA传输转换结果,并让DMA工作在外设字到内存字的循环传输模式。配置过程中,...

STM32 ADC多通道转换详解(附源代码)
STM32ADC多通道转换描述:通过ADC连续采集11路模拟信号,并由DMA传输至内存。配置ADC为扫描并连续转换模式,设置ADC时钟为12MHZ。每次转换完成,DMA循环将数据传输至内存。ADC可连续采集N次以计算平均值。最终,通过串口输出最终转换结果。程序如下:为大家提供以下资料供参考:- ADC读取光照传感器 - 深度...

stm32 adc多通道采集可以不采用dma吗
这样是很低效的。DMA就是搬运工,你只要告诉他从哪搬到哪,搬多少。搬完了是否要向CPU报告。一个ADC就是1个转化电路,多通道其实是通过开关切换到不同的引脚上。你接到哪个脚,对于的寄存器就是哪个脚的值(前提是你启动转换并且已经转换完成了。)不用DMA你自己读了处理就是了。

STM32之ADC通道顺序设置
STM32F10X系列MCU的说明文档中对ADC通道顺序设置上说的比较简单,在做多通道采集项目且用DMA作为数据传输时,若是没有设置好通道顺序,那么有些通道的数据可能会采集不到,本人在做ADC实验时就遇到此问题,因此写下来作为总结 在使用STM32的ADC多通道采样时,需要为每一个使用到的通道配置对应的转换顺序...

【STM32H7教程】第46章 STM32H7的ADC应用之DMA方式多通道采样
包括上电启动和主功能部分。7. **实验例程说明**:给出了MDK和IAR编译器下的具体实现步骤,如串口设置和主程序结构。8. **总结**:ADC多通道采样在实际项目中有广泛应用,对初学者来说是一个实用的技术。通过这个章节,学习者将掌握STM32H7如何通过DMA优化多通道ADC采集,以提升系统性能。

相似回答