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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版