Тема: TIMER Прерывания по сравнению
void setup() {
pinMode(PA1, OUTPUT);
timer_attach_interrupt(TIMER2, TIMER_UPDATE_INTERRUPT, led1); // прерывание по переполнению
timer_attach_interrupt(TIMER2, TIMER_CC1_INTERRUPT, led); // прерывание по сравнению 1
RCC_BASE->APB1ENR|= (1<<0); // TIM2EN > включить тактирование tim_2
TIMER2_BASE->CR1=0; // TIMx_CR1 > стоп таймер
TIMER2_BASE->PSC = 7200-1; // TIMx_PSC > значение пред делителя -1 === F = 72 000 000 / 7200 = 10000 Hz
TIMER2_BASE->ARR = 10000-1; // TIMx_ARR > считать до установленого числа и обнулить === F = 10000 / 10000 = 1 Hz | T = 1 s
TIMER2_BASE->CCR1 = 5000-1; // TIMx_CCR1 > регистр сравнения 1 === F = 10000 / 5000 = 2 Hz | T = 0.5 s
TIMER2_BASE->DIER |= (1<<0); // TIMx_DIER > разрешить прерывание по переполнению
TIMER2_BASE->DIER |= (1<<1); // TIMx_DIER > разрешить прерывание по сравнению 1
TIMER2_BASE->CR1|=(1<<0); // TIMx_CR1 > старт таймер
}
void loop() {}
void led1(){
digitalWrite(PA1, HIGH);
TIMER2_BASE->SR &=~(1<<0); // TIMx_SR > сбрасываем флаг прерывания
}
void led(){ //обработчик прерывания
digitalWrite(PA1, LOW);
TIMER2_BASE->SR &=~(1<<0); // TIMx_SR > сбрасываем флаг прерывания
}