Короткая версия:
Нужна помощь с программированием на C для выбора каналов / каналов для АЦП в STM32F3 (плата Dicovery). Пожалуйста, найдите код, который я написал на данный момент в конце вопроса. Было бы здорово, если бы кто-нибудь мог обратиться к некоторым ресурсам по программированию на голом металле.
Длинная версия:
Я изучаю программирование контроллеров ARM; у меня есть плата ST32F303 Discovery, и я полагаю, что метод, который я пробую, называется программированием с нуля. У меня есть опыт написания простого C-кода для микроконтроллеров AVR, но это было довольно просто, и почти все регистры были одинаковыми на протяжении всей серии. Но когда дело дошло до ARM, я был совершенно удивлен, увидев количество вещей (файлов), которые мы должны получить, чтобы правильно скомпилировать код. Кстати, у меня система Linux, поэтому я собрал набор инструментов gnu arm с Eclipse.
После некоторых исследований и многочисленных видео на Youtube я закончил работу над двумя материалами
- STM32Snippets
- 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
}
}