Решил реализовать задачу из разряда "Hello World" - термометр. Реализация с прерывание отлично работает, но (скорее из академического интереса) решил избавится от прерывания и вот тут случилась засада, программа работает совсем не так, как должна. Чувствую что решение где то близко, но видимо знания для решения не хватает.
Ход моих мыслей следующий - таймер TIM3 отсчитывает 5сек, после чего срабатывает триггер, который запускает обработку сигнала от датчика температуры АЦП. В main производится проверка если АЦП закончил преобразование, данные оправляются в функцию, которая вычисляет значение температуры и выводит данные (тут я расписывать ее не стал), после чего последовательность действий должна повториться.
Прошу подскажите где я ошибаюсь?
Код: Выделить всё
void Timer_ini(){
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->ARR = 48000-1;
TIM3->PSC = 5000;
TIM3->CR2 |= TIM_CR2_MMS_1; // MMS Update mode
TIM3->DIER |= TIM3_DIER_TIE;
TIM3->CR1 |= TIM_CR1_ARPE;
TIM3->CR1 |= TIM_CR1_CEN;
}
void ADC_ini(){
RCC->CR2 |= RCC_CR2_HSI14ON;
while (!(RCC->CR2 & RCC_CR2_HSI14RDY));
RCC->APB2ENR = RCC_APB2ENR_ADCEN;
ADC1->CHSELR = ADC_CHSELR_CHSEL16; //Канал датчика температуры
ADC1->CR |= ADC_CR_ADCAL; // Калибровка датчика температуры
while ((ADC1->CR & ADC_CR_ADCAL) != 0);
ADC1->SMPR |= ADC_SMPR_SMP_0 | ADC_SMPR_SMP_1 | ADC_SMPR_SMP_2;
ADC1->CFGR1 |= ADC_CFGR1_EXTEN_0;
ADC1->CFGR1 |= ADC_CFGR1_EXTSEL_0 | ADC_CFGR1_EXTSEL_1; //Выбор триггера TIM3
ADC->CCR |= ADC_CCR_TSEN;
ADC1->CR |= ADC_CR_ADEN;
while ((ADC1->ISR & ADC_ISR_ADRDY) == 0);
ADC1->CR |= ADC_CR_ADSTART;
}
void main(){
ADC_ini();
Timer_ini();
while(1){
if (!(ADC1->ISR & ADC_ISR_EOC)){
Temp_show(ADC->DR);
//Судя по Reference manual бит EOC должен сбрасываться по прочтению данных из ADC->DR,
//но этого не происходит, по этой причине добавлен "насильный" сброс
ADC1->ISR |= ADC_ISR_EOC;
}
}
}

