你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 AD DMA采集到的数据都为0

[复制链接]
wangwkb 提问时间:2020-7-1 22:06 /
最近在使用STM32F103开发项目,使用到了AD的多通道采集功能,相关例程网上很多,通过参考相关代码对ADC和DMA进行配置,但是程序运行起来后采集到的数据都为0,当前问题困扰了多天,请诸位帮忙分析下,谢谢,配置部分代码如下:

其中:SCAPChannel_Max = 12,SCAP_BufferSize = 10


static void SCAP_GPIOConfiguration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* 打开GPIO A/B/C 部件的系统激励时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

/* 初始化GPIO A端口 */
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 初始化GPIO B端口 */
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* 初始化GPIO C端口 */
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
static void SCAP_DMAConfiguration(SCAPType_t *sCap)
{
DMA_InitTypeDef DMA_InitStructure;

/* 打开DMA部件的系统激励时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* 设置DMA参数 */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&ADC1->DR);    /* 设置外设基地址 */
DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)(&sCap->m_value);   /* 设置内存基地址 */
DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;    /* 外设作为数据的来源 */
DMA_InitStructure.DMA_BufferSize         = SCAPChannel_Max * SCAP_BufferSize; /* 内存大小 */
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_ITConfig(DMA1_Channel1, DMA_IT_TC, DISABLE);

/* 使能DMA开始工作 */
DMA_Cmd(DMA1_Channel1, ENABLE);
}
static void SCAP_ADCConfiguration(void)
{
ADC_InitTypeDef ADC_InitStructure;
/* 打开ADC部件的系统激励时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* 复位ADC1,将外设重置成缺省值 */
ADC_DeInit(ADC1);
/* 复位ADC1,将外设重置成缺省值 */
ADC_InitStructure.ADC_Mode     = ADC_Mode_Independent;  /* 独立工作模式 */
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   = SCAPChannel_Max;
ADC_Init(ADC1, &ADC_InitStructure);
/* 配置ADC时钟为PCLK2 1/6   12MHz */
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

// /* 内部温度传感器使能 */
// ADC_TempSensorVrefintCmd(ENABLE);

/* 对ADC采集通道进行注册 */
/* 注册试剂样品台温度采集通道 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7,  3, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6,  4, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 5, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 6, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 7, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 8, ADC_SampleTime_239Cycles5);
/* 注册其他的温度采集通道 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_8,  9, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 11, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 12, ADC_SampleTime_239Cycles5);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
/* 使能ADC采集的DMA模块 */
ADC_DMACmd(ADC1, ENABLE);
/* 打开ADC采集模块 */
ADC_Cmd(ADC1, ENABLE);

/* 重置ADC校准寄存器 */
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));

/* 开始ADC校准 */
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
/* 使能ADC模块开始转换 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

收藏 评论2 发布时间:2020-7-1 22:06

举报

2个回答
butterflyspring 回答时间:2020-7-8 11:09:22
分两步来,先单独用ADC 采集,看看ADC转换是否正常,问题是不是出在这里面的软硬件上。正常后再设置DMA吧

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

wangwkb 回答时间:2020-7-9 15:08:50
butterflyspring 发表于 2020-7-8 11:09
分两步来,先单独用ADC 采集,看看ADC转换是否正常,问题是不是出在这里面的软硬件上。正常后再设置DMA吧 ...

还是很感谢你,问题已经解决了,是我二了,keil里边调试那边设置成软件模拟模式了,so 。。。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版