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

新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

[复制链接]
wang496952046 提问时间:2012-8-7 14:58 /
用STM32F051调试AD转换程序,出来的数据一直是0.0V,不知道哪边有问题,以下是程序代码,请游过的大虾帮帮忙呗,万分感激!!
#include "stm32f0xx.h"        //这个头文件包括STM32F0xx所有外围寄存器、位、内存映射的定义
#include "delay.h"
#include "type_def.h"
#include

#define                USART1_BaudRate                        115200
#define ADC1_DR_Address                0x40012440
vu16  AD_Value;       //用来存放ADC转换结果,也是DMA的目标地址

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


/*GPIO管脚的配置
选用ADC的通道9,分别对应的管脚为PB1
串口使用USART1其中TX为PA9,RX为PA10 */
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
               
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

        //PB1 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;                //模拟输入引脚
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*USART1管脚的配置
串口使用USART1其中TX为PA9,RX为PA10 */
void USART_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
               
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
               
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);       
        /*
        *  USART1_TX -> PA9 , USART1_RX ->        PA10
        */                               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;                
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
        USART_InitStructure.USART_BaudRate = USART1_BaudRate;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);

        USART_Cmd(USART1, ENABLE);
}

/*配置ADC1*/
void ADC1_Configuration(void)
{
        ADC_InitTypeDef  ADC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );

        ADC_DeInit(ADC1);                                                                                                                          //将外设 ADC1 的全部寄存器重设为缺省值
        ADC_StructInit(&ADC_InitStructure);
        /* ADC1 configuration ------------------------------------------------------*/
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                                //ADC1分辨率12位
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                                                        //模数转换工作在连续转换模式
        ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;        //外部触发转换关闭
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                                //ADC数据右对齐      
        ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;                        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);                                                                                        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
        ADC_ChannelConfig(ADC1, ADC_Channel_9, ADC_SampleTime_239_5Cycles );        
        ADC_GetCalibrationFactor(ADC1);
        /* Enable ADC1 */
        ADC_Cmd(ADC1, ENABLE);                                                                                                   //使能指定的ADC1
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));                                                //获取指定ADC1的校准程序,设置状态则等待
        ADC_StartOfConversion(ADC1);      
}

/*配置DMA*/
void DMA_Configuration(void)
{
        /* ADC1  DMA1 Channel Config */
        DMA_InitTypeDef DMA_InitStructure;       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        DMA_DeInit(DMA1_Channel1);   //将DMA的通道1寄存器重设为缺省值
        DMA_InitStructure.DMA_PeripheralBaseAddr =  (u32)ADC1_DR_Address;  //DMA外设ADC基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)AD_Value;  //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //内存作为数据传输的目的地
        DMA_InitStructure.DMA_BufferSize = 2;  //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(DMA1_Channel1, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道
        DMA_Cmd(DMA1_Channel1, ENABLE);
        ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
        ADC_DMACmd(ADC1, ENABLE);
}


//配置所有外设
void Init_All_Periph(void)
{                  
        GPIO_Configuration();
        USART_Configuration();
        DMA_Configuration();
        ADC1_Configuration();          
}


/*获取ADC的值,将二进制换算为十进制*/
u16 GetVolt(u16 advalue)   
{  
   return (u16)(advalue * 330 / 4096);   //求的结果扩大了100倍,方便下面求出小数
}


PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
  return ch;
}

int main(void)
{     
        u16 value;
    Init_All_Periph();
    while(1)
        {
                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失      
                value = GetVolt(AD_Value);
                printf("value:\t%d.%dv\n  ",value/100,value%100) ;
                Delay_ms(100);              
        }
}
收藏 评论9 发布时间:2012-8-7 14:58

举报

9个回答
火木 回答时间:2012-8-8 14:00:17

回复:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)AD_Value;  //DMA内存基地址
这句话有问题,你应该把AD-Value的地址赋值过去,而不是把AD_Value的内容赋值过去,改成这样试试 DMA_InitStructure.DMA_MemoryBaseAddr = (&AD_Value);
wang496952046 回答时间:2012-8-7 15:01:00

RE:新手求助~~~STM32F051 ADC出来的数据一直为0

自己顶啊
wang496952046 回答时间:2012-8-7 15:02:28

RE:新手求助~~~STM32F051 ADC出来的数据一直为0

在线等大婶的到来
阿呆 回答时间:2012-8-8 10:43:57

回复:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

社区第3期悬赏问答活动开始咯~详见:https://www.stmcu.org.cn/bbs/article_1188_456334.html
无论你是大神还是大婶,都快来帮忙吧!
yjwpm 回答时间:2012-8-8 10:54:48

RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

不知到你有没有好好的看一下,官方的例程呢
 
#define ADC1_DR_Address    0x40012440
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint16_t  ADC1ConvertedValue = 0, ADC1ConvertedVoltage = 0;
__IO uint16_t RegularConvData_Tab[4];
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file
     */
  /* LCD Display init  */
  Display_Init();
  
  /* ADC1 and DMA configuration */
  ADC1_DMA_Config();
  /* Infinite loop */
  while (1)
  {
    /* Test DMA1 TC flag */
    while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
   
    /* Clear DMA TC flag */
    DMA_ClearFlag(DMA1_FLAG_TC1);
   
    /* Display converted data on the LCD */
    Display();
  }
}
/**
  * @brief  ADC1 channel with DMA configuration
  * @param  None
  * @retval None
  */
void ADC1_DMA_Config(void)
{
  ADC_InitTypeDef     ADC_InitStructure;
  GPIO_InitTypeDef    GPIO_InitStructure;
  DMA_InitTypeDef   DMA_InitStructure;
  /* ADC1 DeInit */ 
  ADC_DeInit(ADC1);
 
  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
 
   /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
 
  /* Configure ADC Channel11 as analog input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /* DMA1 Channel1 Config */
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 4;
  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);
  /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);
 
  /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
 
  /* Enable ADC_DMA */
  ADC_DMACmd(ADC1, ENABLE); 
 
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
 
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* Convert the ADC1 Channel 1 with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_11 , ADC_SampleTime_55_5Cycles);  
 
 
  /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles); 
  ADC_TempSensorCmd(ENABLE);
 
  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
  ADC_VrefintCmd(ENABLE);
 
  /* Convert the ADC1 Vbat with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_Vbat , ADC_SampleTime_55_5Cycles); 
  ADC_VbatCmd(ENABLE);
 
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
 
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);    
 
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
 
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);
}
/**
  * @brief  Display ADC converted value on LCD
  * @param  None
  * @retval None
  */
void Display(void)
{
  uint32_t v=0,mv=0;
  uint8_t text[50],index;
 
  /* Set the LCD Back Color and Text Color*/
  LCD_SetBackColor(White);
  LCD_SetTextColor(Green);
  for(index=0;index
航天航海 回答时间:2012-8-8 17:32:32

RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

不懂,学习学习。
zykzyk-93033 回答时间:2012-8-9 20:30:35

RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

尝试吧DMA关掉,然后一步一步调试观察。
liuqs-359554 回答时间:2012-8-18 10:33:11

RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

6楼说的对,我看官方的是个数组,数组名本身就是个地址,而你的AD_VALUE只是个数据!所以没有数据传到AD_VALUE这个变量,只能是0,DMA只是负,内存和CPU ,内存和内存,内存和外设通道之间的数据传输,其实你想得到的AD_VALUE值,是DMA负责从AD通道寄存器那取回来的,其实你也可以自己取,等它AD转换完,你自己手动就可以数据寄存器中拿回来!
高山-404205 回答时间:2013-6-2 10:32:25

RE:新手求助~~~STM32F051 ADC出来的数据一直为0【悬赏问答】

我用没问题,1年了,不知道是否还需要回答?

所属标签

相似问题

官网相关资源

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