打印
[STM32L1]

STM32L151+ADC_DMA疑问,求高手解答

[复制链接]
5196|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;
...

是的,求大神帮助啊,谢谢!

使用特权

评论回复
5
wangchaoran| | 2015-4-8 20:30 | 只看该作者
采样周期太短,你把ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_4Cycles);这个采样周期设置长点,如果还不行的话联系我,我刚弄完

使用特权

评论回复
6
FAQ| | 2015-4-8 23:56 | 只看该作者
楼主你这个STM32L151多少钱一片,贵不贵。

使用特权

评论回复
7
情乐涵|  楼主 | 2015-4-9 07:51 | 只看该作者
wangchaoran 发表于 2015-4-8 20:30
采样周期太短,你把ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_4Cycles);这个采样周 ...

我试过把采样周期改长,但是还是一样不对。

使用特权

评论回复
8
情乐涵|  楼主 | 2015-4-9 07:54 | 只看该作者
FAQ 发表于 2015-4-8 23:56
楼主你这个STM32L151多少钱一片,贵不贵。

我也不知道多少钱,不是我买的…

使用特权

评论回复
9
情乐涵|  楼主 | 2015-4-9 09:26 | 只看该作者
情乐涵 发表于 2015-4-9 07:51
我试过把采样周期改长,但是还是一样不对。

问题已经解决了,存在两个问题:
1、采样周期太短。大神果然是对的。
2、数组定义的类型不对,改为unsigned short类型。

使用特权

评论回复
10
yanyanyan168| | 2015-4-9 14:11 | 只看该作者
做个记号,学习了

使用特权

评论回复
11
cph201| | 2015-10-13 12:33 | 只看该作者
楼主,目前我硬件解法是: 没外部晶振,启动内部HSI  16M晶振。  采样外部电压是 接到PA3 也就是ADC1_3. 没有外部参考电压的接法。
软件部分,采样ADC1+DMA 的初始化配置,应该没啥问题,为啥数据读出来都是0.
能不能分享下你的经验,请看到及时反馈,在线等

使用特权

评论回复
12
hugo0chen| | 2016-3-30 14:50 | 只看该作者
我也来搞搞STM32l151的DMA ADC方式

使用特权

评论回复
13
footprint01| | 2016-3-31 11:50 | 只看该作者
我的ADC采集程序和你基本一样,内部参考电压不用设定吗?用的是多少位的精度!我的计算公式是U= (Adcx*(3.3/65535)),计算出来的结果才正常,我用数据格式是右对齐.这不是说明这个是16位的精度吗?但是看资料上说L151这个系列的ADC只有12位的精度,我一直没有想明白这个问题!你都研究这么长时间了,是否有所理解?

使用特权

评论回复
14
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

粉丝