Перейти к содержанию
    

Не получается настроить ADC1 на stm32f3discovery

Доброго времени суток! Пытаюсь настроить АЦП на плате stm32f3discovery, ничего не выходит( вроде все делал как в мануале написано, но чего-то видимо не хватает,

а чего - понять не могу. Кто подскажет буду очень признателен!:) Ниже приведен код

 

#include "stm32f30x.h"//It should be included necessary

void establish_clock();
void establish_TIM1();
void establish_int();
void establish_ports();
void TIM1_UP_TIM16_IRQHandler(void);
void USART1_IRQHandler(void);
void ADC1_2_IRQHandler(void);
void set_USART();
void set_ADC();

#define clock 8000000
#define baudrate 19200

void main()
{
 establish_clock();
 establish_ports();
 //establish_TIM1();
 establish_int();
 //set_USART();
 set_ADC();
 do{}
 while(1);  
}

void establish_clock()
{
 RCC->CR |= RCC_CR_HSION;//Сброшен бит HSE_by_pass
 RCC->CFGR = 0;
 do
 {}
 while(!(RCC->CR&RCC_CR_HSIRDY));
 RCC->AHBENR |= RCC_AHBENR_GPIOEEN|RCC_AHBENR_GPIOAEN|RCC_AHBENR_ADC12EN;
 RCC->APB2ENR |= RCC_APB2ENR_TIM1EN|RCC_APB2ENR_USART1EN;
}

void establish_TIM1()
{
 TIM1->RCR = 0;
 TIM1->PSC = 1000;
 TIM1->ARR = clock/(1*1000)-1;
 TIM1->DIER = TIM_DIER_UIE;//Прерывания разрешены
 TIM1->CR1 |= TIM_CR1_CEN;
}

void establish_int()
{
 //NVIC->ISER[0] = (1<<TIM1_UP_TIM16_IRQn);//TIM1_UP_TIM16_IRQn = 25 - позиция в таблице прерывания от TIM1_UP/TIM16
 //NVIC->ISER[1] = (1<<(USART1_IRQn-32));
 NVIC->ISER[0] = 1<<ADC1_2_IRQn;
}

void establish_ports()
{
 GPIOE->MODER |= GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0|GPIO_MODER_MODER10_0|GPIO_MODER_MODER11_
0|GPIO_MODER_MODER12_0|GPIO_MODER_MODER13_0|GPIO_MODER_MODER14_0|GPIO_MODER_MODE
R
15_0;
 GPIOA->MODER &= ~(GPIO_MODER_MODER10_0|GPIO_MODER_MODER9_0);
 GPIOA->MODER |= GPIO_MODER_MODER10_1|GPIO_MODER_MODER9_1|GPIO_MODER_MODER1;
 GPIOA->AFR[1] = (0x7<<8)|(0x7<<4);
}

void set_USART()
{
 USART1->CR1 &= ~((1<<28)|(USART_CR1_M));
 USART1->BRR = clock/baudrate;
 USART1->CR1 |= USART_CR1_RXNEIE|USART_CR1_RE|USART_CR1_TE|USART_CR1_TXEIE|USART_CR1_UE;
}

void set_ADC()
{
 ADC1->CR &= ~(ADC_CR_ADVREGEN_0|ADC_CR_ADVREGEN_1);
 ADC1->CR |= ADC_CR_ADVREGEN_0;
 for(int i=0;i<1000;i++)
 {}
 ADC1->CR &= ~(ADC_CR_ADCALDIF);
 ADC1->CR |= ADC_CR_ADCAL;
 do{}
 while(ADC1->CR&ADC_CR_ADCAL);
 for(int i=0;i<5;i++)
 {}//Delay after ADCAL bit is cleared by hardware
 ADC1->CR |= ADC_CR_ADEN;
 do{}
 while(!(ADC1->IER&ADC_IER_RDY));
 ADC1->SQR1 |= ADC_SQR1_L_0;
 ADC1->SMPR1 |= ADC_SMPR1_SMP2;
 ADC1->IER |= ADC_IER_EOC;
 ADC1->SQR1 |= ADC_SQR1_SQ1_0;
 ADC1->CR |= ADC_CR_ADSTART; 
}

 

Это код всей программы, прошу посмотреть только АЦП) Программа зацикливается в ожидании сброса бита ADC_CR_ADCAL и все

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема разрешилась тактированием АЦП от PLL. В связи с этим назрел новый вопрос. Когда пишу код:

void establish_clock()
{
  RCC->CR = 0x00001183;
  RCC->CFGR = 0;
...............
...............

значения регистров CR и CFGR не меняются никак! На си начал писать недавно и буду признателен, если кто-нибудь объяснит, почему ничего не происходит:) заранее благодарю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...