Программирование на STM32F3 C: Застрял в выборе канала при реализации АЦП - PullRequest
0 голосов
/ 09 мая 2018

Короткая версия:

Нужна помощь с программированием на C для выбора каналов / каналов для АЦП в STM32F3 (плата Dicovery). Пожалуйста, найдите код, который я написал на данный момент в конце вопроса. Было бы здорово, если бы кто-нибудь мог обратиться к некоторым ресурсам по программированию на голом металле.

Длинная версия:

Я изучаю программирование контроллеров ARM; у меня есть плата ST32F303 Discovery, и я полагаю, что метод, который я пробую, называется программированием с нуля. У меня есть опыт написания простого C-кода для микроконтроллеров AVR, но это было довольно просто, и почти все регистры были одинаковыми на протяжении всей серии. Но когда дело дошло до ARM, я был совершенно удивлен, увидев количество вещей (файлов), которые мы должны получить, чтобы правильно скомпилировать код. Кстати, у меня система Linux, поэтому я собрал набор инструментов gnu arm с Eclipse.

После некоторых исследований и многочисленных видео на Youtube я закончил работу над двумя материалами

  1. STM32Snippets
  2. NewbieHack - Это главы Youtube серии , что для

Конечно, я тоже обращаюсь к справочному руководству по контроллеру. Но проблема в том, что оба вышеперечисленных ресурса не являются прямыми для stm32F3, но я использую тот же рабочий процесс для написания для F3. Сейчас я застрял с АЦП, так как не могу понять, как выбрать канал для конвертации, и некоторые советы и рекомендации будут полезны

Вот код, который я написал до сих пор

  /*
   * ADC in ARM
   *
   * Author : Easwaran
   *
   */
  #include "stm32f30x_conf.h"

  int main (void)
  {
      //ADC calibration
      ADC1->CR &= ~ADC_CR_ADEN; //Disables ADC; 0 in ADCEN to disable ADC.

  //    ADC1->CR
      ADC1->CR |= ADC_CR_ADCAL; //put a 1 in calibration register |  CR is the control register for ADC1
      while ((ADC1->CR & ADC_CR_ADCAL) != 0)
        {
          //waiting till the calibration is over; ie the bit turns 0
        }

      //select a clock source
      RCC->AHBENR |= RCC_AHBENR_ADC12EN; // enables both ADC1 & 2
      RCC->CR |= RCC_CR_HSEON;
      while((RCC->CR & RCC_CR_HSERDY) != 1)
        {
          //to make sure the clock has started
        }
      ADC1->CR = ADC12_CCR_CKMODE; // this is weird

      // enable ADC

      ADC1-> CR = ADC_CR_ADEN;
      while((ADC1->ISR & ADC_ISR_ADRD) == 0)
        {
          //waiting to get ready
        }

      //sampling time

      ADC1->SMPR1 |= ADC_SMPR1_SMP0_0 | ADC_SMPR1_SMP0_1 | ADC_SMPR1_SMP0_2;

      //set the channel - here internal temp register

      while(1)
      {
          //start conversion
      }

  }
...