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

STM32L051 ADC模块采不到值

[复制链接]
谁知道呢 提问时间:2015-12-7 14:43 /
第一次使用STM32L051,涉及到AD转换功能,以前用过STM32F103的AD功能,调通了,但是L051的AD模块就是怎么也不好用,程序可以编译通过,但是就是采不到模拟端口的值,下面是我的main函数,望大神帮忙看一下,谢过了!!!(单步调试时,ADC_ISR始终为0,ADC_DR始终为0)
/**main.c**/



#include "LMP91000.h"

#include<stdio.h>

#include"stm32l0xx_hal_rcc_ex.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC_Init(void);


/* Private function prototypes -----------------------------------------------*/
void Delay(__IO uint32_t nCount);  //延时函数
static void Error_Handler(void);
/* ADC handle declaration */
ADC_HandleTypeDef        hadc;

/* ADC channel configuration structure declaration */
ADC_ChannelConfTypeDef   sConfig;

/* Converted value declaration */
uint32_t                 uwConvertedValue;
/* Input voltage declaration */
uint32_t                 uwInputVoltage;


int main(void)
{


/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  I2C_GPIO1_Config();
  I2C_GPIO2_Config();
  LMP91000_PortInit(1,0);
  Delay(0X00FFFF);

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */

  hadc.Instance = ADC1;
  hadc.Init.OversamplingMode = DISABLE;
       
//        hadc.Init.OversamplingMode         = ENABLE;
//  hadc.Init.Oversample.Ratio         = ADC_OVERSAMPLING_RATIO_128;
//  hadc.Init.Oversample.RightBitShift = ADC_RIGHTBITSHIFT_3;
//  hadc.Init.Oversample.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
       
       
  hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION12b;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  hadc.Init.ScanDirection = ADC_SCAN_DIRECTION_UPWARD;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.EOCSelection = EOC_SINGLE_CONV;
  hadc.Init.Overrun = OVR_DATA_PRESERVED;
  hadc.Init.LowPowerAutoWait = ENABLE;
  hadc.Init.LowPowerFrequencyMode = ENABLE;
  hadc.Init.LowPowerAutoOff = DISABLE;
  HAL_ADC_Init(&hadc);
       
  /* Initialize ADC peripheral according to the passed parameters */
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
   /* ### -2 - Channel configuration ######################################## */
  /* Select Channel 0 to be converted */
        sConfig.Channel = ADC_CHANNEL_0;
  HAL_ADC_ConfigChannel(&hadc, &sConfig);
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }


  /* ### - 3 - Start calibration ############################################ */
  if (HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED) != HAL_OK)
  {
    Error_Handler();
  }

       
       
       

  /* ### - 4 - Start conversion ############################################# */
  if (HAL_ADC_Start(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
       
         HAL_ADC_PollForConversion(&hadc, 10);  //等待转换结束

         if(HAL_ADC_GetState(&hadc)==HAL_ADC_STATE_EOC)
         {
               Delay(0x00FFFF);
         //uwConvertedValue = HAL_ADC_GetValue(&hadc);
           uwConvertedValue = hadc.Instance->DR;
         /* Convert the result from 16 bit value to the voltage dimsension */
        /* Vref = 3.3 V */
        uwInputVoltage = (uwConvertedValue * 3300) / 0xFFF0;
    }

  while (1)
  {


  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = 0;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOA_CLK_ENABLE();


  /*Configure GPIO pin : PA9(KEY1) PA3(MENB_O2)*/
  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
       
        /*Configure GPIO pin : PA0(AN_O2_1) PA6(L1_VOLT)  AD模拟输入*/
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
}

/* USER CODE BEGIN 4 */
/********************************************************************************************
延时函数void Delay(__IO uint32_t nCount)
*******************************************************************************************/
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}


/* USER CODE END 4 */
static void Error_Handler(void)
{
  while(1)
  {
  }
}





#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */

/**
  * @}
*/

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


收藏 评论4 发布时间:2015-12-7 14:43

举报

4个回答
munsterzl 回答时间:2015-12-7 19:26:04
不懂,没有过L0系列的。。帮顶。。。 STMCU-Logo.png
suoma 回答时间:2015-12-7 20:23:10
enable ADC
还有看一下SC(状态控制寄存器)、标志位的配置
ccmm520 回答时间:2018-3-17 11:48:32
请问,为什么 uwInputVoltage = (uwConvertedValue * 3300) / 0xFFF0; 这里,除以的是0xFFF0,而不是0x0FFF,或者4096(12bit)呢
lydzzhx 回答时间:2018-4-23 00:34:47
我也在学习这款芯片 手头有现成的例程 一起分享吧 QQ:46439147

所属标签

相似问题

官网相关资源

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