Isaev_ivan 0 23 февраля, 2017 Опубликовано 23 февраля, 2017 (изменено) · Жалоба Доброго времени суток! Пытаюсь настроить АЦП на плате 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 и все Изменено 24 февраля, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 24 февраля, 2017 Опубликовано 24 февраля, 2017 · Жалоба Проблема разрешилась тактированием АЦП от PLL. В связи с этим назрел новый вопрос. Когда пишу код: void establish_clock() { RCC->CR = 0x00001183; RCC->CFGR = 0; ............... ............... значения регистров CR и CFGR не меняются никак! На си начал писать недавно и буду признателен, если кто-нибудь объяснит, почему ничего не происходит:) заранее благодарю! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться