OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4858|回复: 1

ADC+DMA问题再次求助

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2012-12-31
在线时间
0 小时
发表于 2014-6-24 16:26:32 | 显示全部楼层 |阅读模式
5金钱
续昨天的帖子,经正点兄指点,继续上论坛学习,经仔细对照自己的代码和别人已经可以用的代码,还是没有发现问题出在哪里,还请大家帮忙看看。
代码想实现如下功能:用战舰开发板对GPIOA端口1(也就是P3:的ADC口)输入的波形进行采样并在lcd上画出;ADC直接读取没问题,但是DMA不行,DMA结果要么是大于4096的数值,要门是0;请大家帮忙看看:
include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"  
#include "adc.h"
#include "dma.h"
//ALIENTEK????STM32??·?°????é17
//ADC ???é  
//?????§????www.openedv.com
//?????????í??×?????????????  

 int main(void)
 {
  u16  adcx[32];
    u8 i;
  u8  x_position;
    u32 dipvalue;
 u16 adc_disp_v;
// float temp;
delay_init();     //???±??????????  
NVIC_Configuration(); //?è??NVIC????·?×é2:2??????????????2???ì????????
uart_init(9600); //?®??????????9600
  LED_Init();     //LED??????????
LCD_Init();
 
  //   MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)&adcx,32);//DMA1?¨??1,???è??ADC1,?????÷??adcx,?¤??32.
Adc_Init();
// MYDMA_Enable(DMA1_Channel1);   //????DMA??
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 
 
x_position=0;
for(i=0;i<32;i++) adcx=Get_Adc(ADC_Channel_1); //?±??????ADC×??????????·,????DMA×????±??×???????????

   
for(i=0;i<32;i++)

// printf("\r\n AD1=%d\n",adcx);
 dipvalue=adcx;
 LCD_ShowxNum(156,x_position,dipvalue,4,16,0);//????ADC????  
 adc_disp_v=(adcx*240)/4096;
    LCD_ShowString( adc_disp_v,x_position,200,16,16,"*");
 x_position+=10;
 LED0=!LED0;  
 delay_ms(100);
}
 }
 #include "adc.h"
 #include "delay.h"
//////////////////////////////////////////////////////////////////////////////////  
//±????ò???©?§?°??????????×÷???í???????????????ü????????
//ALIENTEK????STM32??·?°?
//ADC ?ú??   
//??????×?@ALIENTEK
//????????:www.openedv.com
//????????:2012/9/7
//°?±???V1.0
//°??¨?ù??????°?±?????
//Copyright(C) ?????????í??×????????????? 2009-2019
//All rights reserved  
////////////////////////////////////////////////////////////////////////////////// 
  
  
//??????ADC
//???????????????ò?¨??????
//???????????????¨??0~3   
void  Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );  //????ADC1?¨???±??
 

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //?è??ADC·????ò×?6 72M/6=12,ADC×??ó?±??????????14M

//PA1 ×÷???????¨??????????                         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //????????????
GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1);  //????ADC1,?????è ADC1 ???????????÷???è???±????

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC?¤×÷????:ADC1??ADC2?¤×÷??????????
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //????×????¤×÷?????¨??????
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //????×????¤×÷??????×??????? ->?????¨zshxie?©
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //×??????í??????????????·?????
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC??????????
ADC_InitStructure.ADC_NbrOfChannel = 1; //???ò???????ò×?????ADC?¨????????
ADC_Init(ADC1, &ADC_InitStructure); //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷  


//?è?????¨ADC?????ò×é?¨?????????ò???????ù?±??
   
  ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//?±?????¨?¨?? zshxie

// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????

   //??zshxie ??±?????????????????47 49????????
  // ADC_DMACmd(ADC1,ENABLE);  
  
ADC_Cmd(ADC1, ENABLE); //???????¨??ADC1

ADC_ResetCalibration(ADC1); //??????????×?  
 
while(ADC_GetResetCalibrationStatus(ADC1)); //??????????×??á??

ADC_StartCalibration(ADC1); //????AD??×?
 
while(ADC_GetCalibrationStatus(ADC1)); //??????×??á??
 
//ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????

}  
//????ADC??
//ch:?¨???? 0~3
u16 Get_Adc(u8 ch)   
{
  //?è?????¨ADC?????ò×é?¨?????????ò???????ù?±??
// ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC?¨??,???ù?±????239.5????      
  
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????
 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//????×????á??

return ADC_GetConversionValue(ADC1); //·???×??ü????ADC1???ò×é??×????á??
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}  

#include "dma.h"
//////////////////////////////////////////////////////////////////////////////////  
//±????ò???©?§?°??????????×÷???í???????????????ü????????
//ALIENTEK????STM32??·?°?
//DMA ?ú??   
//??????×?@ALIENTEK
//????????:www.openedv.com
//????????:2012/9/8
//°?±???V1.0
//°??¨?ù??????°?±?????
//Copyright(C) ?????????í??×????????????? 2009-2019
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////

DMA_InitTypeDef DMA_InitStructure;

u16 DMA1_MEM_LEN;//±???DMA???????????????¤??    
//DMA1???÷?¨??????
//???????????????????¨??,???????ù?????????é????????
//???????÷->???è????/8???????í??/?????÷????????
//DMA_CHxMA?¨??CHx
//cpar:???è???·
//cmar:?????÷???·
//cndtr:?????????? 
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //????DMA????

    DMA_DeInit(DMA_CHx);   //??DMA???¨??1?????÷???è???±????
DMA1_MEM_LEN=cndtr;
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA???èADC?ù???·
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA?????ù???·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //????????·??ò?????è×÷??DMA????????????
DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA?¨????DMA???????ó??
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //???è???·?????÷??±?
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //???????·?????÷????   
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //?????í????8??8->32 by  zsxhie;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; //?????í????8??
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //?¤×÷??????????????
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA?¨?? x???????????? 
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA?¨??x?????è??????????????????
DMA_Init(DMA_CHx, &DMA_InitStructure);  //?ù??DMA_InitStruct?????¨????????????DMA???¨??USART1_Tx_DMA_Channel?ù±ê?????????÷
 

//????????DMA????
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

DMA_Cmd(DMA_CHx, DISABLE );  //??±?USART1 TX DMA1 ?ù???????¨??      
  DMA_SetCurrDataCounter(DMA1_Channel1,DMA1_MEM_LEN);//DMA?¨????DMA???????ó??
  DMA_Cmd(DMA_CHx, ENABLE);  //????USART1 TX DMA1 ?ù???????¨?? 
}  


后面又选择论坛上的帖子里的实验24:4通道ADC+DMA实验的源码,将4通道改为单通道,并将接口改为GPIOA1,发现该代码也存在问题:在0、或3.3v的情况下,结果正确。若采集输入的正弦波形,则是一堆杂乱的结果。下面是代码:

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "led.h"
#include "adc.h"
#include "dma.h"

 #define ADC1_DR_Address    ((uint32_t)0x4001244C)
  u16 AD_Value[32];    
  float volta[32];
  u8 i,x_position, adc_disp_v;
  int main()
  {
  SystemInit();
  delay_init(72);     //???±??????
 NVIC_Configuration();
    uart_init(9600); 
 LED_Init();     //LED?????
 LCD_Init();

 DMA_Config(DMA1_Channel1,(u32)ADC1_DR_Address,(u32)&AD_Value,32);//cndtr?????ù??????????
  Adc_Init();
  DMA_Cmd(DMA1_Channel1, ENABLE);      //????DMA?¨??
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //?í??????AD×???
x_position=0;
   while(1)
{
for(i=0;i<32;i++) //???·6??×???AD??
{
volta =(float) AD_Value/4095*3.3;  
  LCD_ShowxNum(156,x_position,AD_Value,4,16,0);
// LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);
x_position+=10;
  adc_disp_v=(AD_Value*240)/4096;
      LCD_ShowString( adc_disp_v,x_position,200,16,16,"*");
  LED0=!LED0;  
  delay_ms(100);

 

}
 /*  printf("AD1=%d\n",AD_Value[0]); printf("\r\n volta1 = %f V \r\n",volta[0]);
printf("AD2=%d\n",AD_Value[1]); printf("\r\n volta2 = %f V \r\n",volta[1]);
printf("AD3=%d\n",AD_Value[2]); printf("\r\n volta3 = %f V \r\n",volta[2]);
printf("AD4=%d\n",AD_Value[3]); printf("\r\n volta4 = %f V \r\n",volta[3]);
printf("AD5=%d\n",AD_Value[4]); printf("\r\n volta5 = %f V \r\n",volta[4]);
printf("AD6=%d\n",AD_Value[5]); printf("\r\n volta6 = %f V \r\n",volta[5]);*/
 }
   
  }

#include "adc.h"
  
void  Adc_Init(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
   ADC_InitTypeDef  ADC_InitStructure; 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_ADC1 , ENABLE );   
  //RCC_APB2Periph_GPIOx,x=GPIOx
   RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC×??ó?±??????????14M    
//PA0--ADC_IN0  A1--ADC_IN1  A2--ADC_IN2  A3--ADC_IN3  A4--ADC_IN4  A5--ADC_IN5  A6--ADC_IN6  A7--ADC_IN7  
//PB0--ADC_IN8  B1--ADC_IN9  C0--ADC_IN10  C1--ADC_IN11  PC2--ADC_IN12  PC3--ADC_IN13  PC4--ADC_IN14  PC5--ADC_IN15                   
//PA0~3  4?·×÷???????¨??????????                         
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA0/1/2/3 ×÷???????¨??????????
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                
    GPIO_Init(GPIOA, &GPIO_InitStructure);

//------------------------------------ADC?è??--------------------------------------------------------

    ADC_DeInit(ADC1);  //?????è ADC1 ???????????÷???è???±????
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC?¤×÷????:ADC1??ADC2?¤×÷??????????
        ADC_InitStructure.ADC_ScanConvMode =DISABLE;        //?à?????¨?è????
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //????×????¤×÷??????×???????
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   //??????·?×?????±?
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC??????????
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //??????6???????¨????????1~16?©
        ADC_Init(ADC1, &ADC_InitStructure);        //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷
        
//ADC????????????
        //ADC1,ADC?¨??x,???ò???ù???ò????y,???ù?±????239.5????
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );                
     //   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );
    //    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );                
     //   ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );
     //   ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_239Cycles5 );
     //   ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_239Cycles5 );
        
         // ????ADC??DMA?§???¨??????DMA?????????è????????DMA?¨?????????©
          ADC_DMACmd(ADC1, ENABLE);       //????ADC1??DMA????         
         ADC_Cmd(ADC1, ENABLE);           //???????¨??ADC1
         ADC_ResetCalibration(ADC1);        //???????¨??ADC1????×??????÷
         while(ADC_GetResetCalibrationStatus(ADC1));        //????ADC1??????×??????÷??×???,?è??×????ò????
         ADC_StartCalibration(ADC1);                //???????¨ADC1????×?×???
         while(ADC_GetCalibrationStatus(ADC1));                //???????¨ADC1????×????ò,?è??×????ò????
}  

#include "dma.h"
#include "usart.h"

//DMA_Channel1-->ADC1    
//cndtr?????ù????????????  
void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{ DMA_InitTypeDef DMA_InitStructure;    
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 
  DMA_DeInit(DMA_CHx);   //??DMA???¨??1?????÷???è???±????
    DMA_InitStructure.DMA_PeripheralBaseAddr =  cpar;  //DMA???èADC?ù???·
    DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA?????ù???·
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //????×÷??????????????????
    DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA?¨????DMA???????????????ó??
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //???è???·?????÷??±?
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //???????·?????÷????
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //?????í????16??
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //?????í????16??
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //???·?¤×÷????
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA?¨?? x???????????? 
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA?¨??x?????è??????????????????
    DMA_Init(DMA_CHx, &DMA_InitStructure);  //?ù??DMA_InitStruct?????¨????????????DMA???¨??
}








实验24 单通道ADC (DMA传输).rar

4.98 MB, 下载次数: 128

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2012-12-31
在线时间
0 小时
 楼主| 发表于 2014-6-24 16:32:03 | 显示全部楼层
第一段代码对应下面的附件ADC实验-test.rar;第一个帖子中的附件 实验24 单通道DMA 对应第二段代码

ADC实验 - test.rar

2.59 MB, 下载次数: 94

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 02:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表