Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не получается настроить ADC1 на stm32f3discovery
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Isaev_ivan
Доброго времени суток! Пытаюсь настроить АЦП на плате stm32f3discovery, ничего не выходит( вроде все делал как в мануале написано, но чего-то видимо не хватает,
а чего - понять не могу. Кто подскажет буду очень признателен!:) Ниже приведен код

CODE
#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 и все
Isaev_ivan
Проблема разрешилась тактированием АЦП от PLL. В связи с этим назрел новый вопрос. Когда пишу код:
Код
void establish_clock()
{
  RCC->CR = 0x00001183;
  RCC->CFGR = 0;
...............
...............

значения регистров CR и CFGR не меняются никак! На си начал писать недавно и буду признателен, если кто-нибудь объяснит, почему ничего не происходитsm.gif заранее благодарю!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.