[STM32L1] STM32L151+ADC_DMA疑问,求高手解答

[复制链接]
5885|14
 楼主| 情乐涵 发表于 2015-4-8 17:18 | 显示全部楼层 |阅读模式
STM32L151多通道ADC采样,DMA输出,通过串口打印出来,数据不正常。求高手帮忙。
代码如下:

uint32_t ADC_Converted_Value_Table[6] = {0,0,0,0,0,0};

void ADC_DMA_Init(void)
{
                DMA_InitTypeDef DMA_InitStructure;
                GPIO_InitTypeDef GPIO_InitStructure;
                ADC_InitTypeDef ADC_InitStructure;
               
                /*Enable DMA1 Clock*/
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
               
                /*DMA1 Channel1 Configuration*/
                DMA_DeInit(DMA1_Channel1);
                DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;
                DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Converted_Value_Table;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
                DMA_InitStructure.DMA_BufferSize = 6;
                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);
       
                /*ENABLE DMA1 CHANNEL1*/
                DMA_Cmd(DMA1_Channel1,ENABLE);
               
                /*------------ADC1 configuration with DMA enabled---------*/
                /*Enable the HSI oscillator*/
                RCC_HSICmd(ENABLE);
               
                /*Enable GPIOA Clock*/
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
                /*Enable GPIOB Clock*/
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
                /*Enable GPIOC Clock*/
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
               
                /*Configuration PA.5/6/7 on analog mode*/
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_Init(GPIOA,&GPIO_InitStructure);
               
                /*Configuration PB.0/1 on analog mode*/
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
                GPIO_Init(GPIOB,&GPIO_InitStructure);
               
                /*Configuration PC.0 on analog mode*/
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
                GPIO_Init(GPIOC,&GPIO_InitStructure);
               
                /*Check that HSI oscillator is ready*/
                while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
               
                /*Enable ADC1 Clock*/
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
               
                ADC_DeInit(ADC1);
                /*ADC1 configuration*/
                ADC_InitStructure.ADC_ScanConvMode = ENABLE;
                ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
                ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
                ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
                ADC_InitStructure.ADC_NbrOfConversion = 6;
                ADC_Init(ADC1,&ADC_InitStructure);
               
                /*ADC1 regular channel10 configuration*/
                ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_4Cycles);
                ADC_RegularChannelConfig(ADC1,ADC_Channel_6,2,ADC_SampleTime_4Cycles);
                ADC_RegularChannelConfig(ADC1,ADC_Channel_7,3,ADC_SampleTime_4Cycles);
                ADC_RegularChannelConfig(ADC1,ADC_Channel_8,4,ADC_SampleTime_4Cycles);
                ADC_RegularChannelConfig(ADC1,ADC_Channel_9,5,ADC_SampleTime_4Cycles);
                ADC_RegularChannelConfig(ADC1,ADC_Channel_10,6,ADC_SampleTime_4Cycles);
                ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
               
                /*Enable ADC1 DMA*/
                ADC_DMACmd(ADC1,ENABLE);
               
                /*Enable ADC1*/
                ADC_Cmd(ADC1,ENABLE);
               
                /*Wait until the ADC1 is ready*/
                while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADONS) == RESET);
               
                /*Start ADC1 Software Conversion*/
                ADC_SoftwareStartConv(ADC1);
}
串口只能打印数组中第一个数据,而且还不正确,后面的数据都为0。
mmuuss586 发表于 2015-4-8 18:41 | 显示全部楼层

多通道ADC DMA采集吧;
我有空到另外电脑,看下,前段时间刚弄过16通道ADC DMA;
mmuuss586 发表于 2015-4-8 18:41 | 显示全部楼层

多通道ADC DMA采集吧;
我有空到另外电脑,看下,前段时间刚弄过16通道ADC DMA;
 楼主| 情乐涵 发表于 2015-4-8 20:11 | 显示全部楼层
mmuuss586 发表于 2015-4-8 18:41
多通道ADC DMA采集吧;
我有空到另外电脑,看下,前段时间刚弄过16通道ADC DMA;
...

是的,求大神帮助啊,谢谢!
wangchaoran 发表于 2015-4-8 20:30 | 显示全部楼层
采样周期太短,你把ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_4Cycles);这个采样周期设置长点,如果还不行的话联系我,我刚弄完
FAQ 发表于 2015-4-8 23:56 | 显示全部楼层
楼主你这个STM32L151多少钱一片,贵不贵。
 楼主| 情乐涵 发表于 2015-4-9 07:51 来自手机 | 显示全部楼层
wangchaoran 发表于 2015-4-8 20:30
采样周期太短,你把ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_4Cycles);这个采样周 ...

我试过把采样周期改长,但是还是一样不对。
 楼主| 情乐涵 发表于 2015-4-9 07:54 来自手机 | 显示全部楼层
FAQ 发表于 2015-4-8 23:56
楼主你这个STM32L151多少钱一片,贵不贵。

我也不知道多少钱,不是我买的…
 楼主| 情乐涵 发表于 2015-4-9 09:26 | 显示全部楼层
情乐涵 发表于 2015-4-9 07:51
我试过把采样周期改长,但是还是一样不对。

问题已经解决了,存在两个问题:
1、采样周期太短。大神果然是对的。
2、数组定义的类型不对,改为unsigned short类型。
yanyanyan168 发表于 2015-4-9 14:11 | 显示全部楼层
做个记号,学习了
cph201 发表于 2015-10-13 12:33 | 显示全部楼层
楼主,目前我硬件解法是: 没外部晶振,启动内部HSI  16M晶振。  采样外部电压是 接到PA3 也就是ADC1_3. 没有外部参考电压的接法。
软件部分,采样ADC1+DMA 的初始化配置,应该没啥问题,为啥数据读出来都是0.
能不能分享下你的经验,请看到及时反馈,在线等
hugo0chen 发表于 2016-3-30 14:50 | 显示全部楼层
我也来搞搞STM32l151的DMA ADC方式
footprint01 发表于 2016-3-31 11:50 | 显示全部楼层
我的ADC采集程序和你基本一样,内部参考电压不用设定吗?用的是多少位的精度!我的计算公式是U= (Adcx*(3.3/65535)),计算出来的结果才正常,我用数据格式是右对齐.这不是说明这个是16位的精度吗?但是看资料上说L151这个系列的ADC只有12位的精度,我一直没有想明白这个问题!你都研究这么长时间了,是否有所理解?
dwq175 发表于 2016-3-31 11:58 | 显示全部楼层
uint32_t ADC_Converted_Value_Table[6] = {0,0,0,0,0,0};//这里是32位的。
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//这里是16位的。
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
改成 uint16_t ADC_Converted_Value_Table[6] = {0,0,0,0,0,0};应该没有问题了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

2

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