STM32F030 первые попытки запустить ADC (заметка)

Самый простой пример работы АЦП модуля в STM32F030.

файл ADC.h:

#ifndef ADC_H_
#define ADC_H_
#include "stm32f0xx_adc.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#define ADC_INPUT_1 GPIO_Pin_0
#define ADC_INPUT_PORT GPIOB
void ADC_GPIO_Configuration(void);
void ADC1_Configuration(void);
#endif /* ADC_H_ */

файл ADC.c:

#include "ADC.h"
void ADC_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin = ADC_INPUT_1;     // PB.0 ADC IN8
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(ADC_INPUT_PORT, &GPIO_InitStructure);
}
void ADC1_Configuration(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  ADC_DeInit(ADC1);/* ADC1 DeInit */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);/* ADC1 Periph clock enable */
  ADC_StructInit(&ADC_InitStructure);   /* Initialize ADC structure */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;/* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  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_Upward;
  ADC->CCR |= ADC_CCR_VBATEN;
  ADC_Init(ADC1, &ADC_InitStructure);/* Convert the ADC1 input with N Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_8, ADC_SampleTime_28_5Cycles); // PB0 - IN8
  ADC_GetCalibrationFactor(ADC1);   /* ADC Calibration */
  ADC_Cmd(ADC1, ENABLE);/* Enable ADC1 */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));/* Wait the ADCEN falg */
  ADC_StartOfConversion(ADC1);/* ADC1 regular Software Start Conv */
}
В главном цикле следующий код:
    ADC_GPIO_Configuration();//Настройка пинов АЦП
    ADC1_Configuration();//настройка АЦП
    uint16_t ADC1ConvertedValue;//переменная для результата измерения
    /* Проверка на готовность АЦА */
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    /*Преобразование данных */
    ADC1ConvertedValue = ADC_GetConversionValue(ADC1);

You may also like...

2 Responses

  1. Snippets для F0 вам в руки! )) Да — не SPL/HAL/LL, а просто CMSIS, но чем он плох?

  2. Айрат:

    подскажите, пожалуйста, как переключать каналы в данном случае? надо в ADC_ChannelConfig указать все используемые каналы, а АЦП по кругу будет их замерять? Или как?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>