Код
CODE
// Инициализация АЦП
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_CAL;
while ((ADC1->CR2 & ADC_CR2_CAL) != 0);
ADC1->CR1 |= ADC_CR1_EOCIE;
NVIC_EnableIRQ(ADC1_2_IRQn);
ADC1->CR2 |= ADC_CR2_EXTTRIG | ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1;
...
// Инициализация таймера
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 32000 - 1;
TIM2->ARR = 199;
TIM2->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;
TIM2->CCR2 = TIM2->ARR;
TIM2->CR1 |= TIM_CR1_CEN;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1->CR2 |= ADC_CR2_ADON;
ADC1->CR2 |= ADC_CR2_CAL;
while ((ADC1->CR2 & ADC_CR2_CAL) != 0);
ADC1->CR1 |= ADC_CR1_EOCIE;
NVIC_EnableIRQ(ADC1_2_IRQn);
ADC1->CR2 |= ADC_CR2_EXTTRIG | ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1;
...
// Инициализация таймера
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 32000 - 1;
TIM2->ARR = 199;
TIM2->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1;
TIM2->CCR2 = TIM2->ARR;
TIM2->CR1 |= TIM_CR1_CEN;
Запуск АЦП в ручном режиме (через повторный ADC_CR2_ADON) работает. Если у таймера разрешить прерывание CC2IF — срабатывает когда надо. В чём ошибка?
Похоже, проблема в настройке события CC2 от таймера. АЦП прекрасно запускается от таймера 3 при такой инициализации:
CODE
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = 32000 - 1;
TIM3->ARR = 199;
TIM3->CR2 |= TIM_CR2_MMS_1;
TIM3->CR1 |= TIM_CR1_CEN;
TIM3->PSC = 32000 - 1;
TIM3->ARR = 199;
TIM3->CR2 |= TIM_CR2_MMS_1;
TIM3->CR1 |= TIM_CR1_CEN;
Тогда как следует настраивать таймер 2?
Ну блиииин... Всё настроил, а включить забыл. Проблема решилась добавлением строчки
TIM2->CCER |= TIM_CCER_CC2E;
Надо пойти пообедать =)