1

Тема: TIMER Прерывания по переполнению

volatile bool LED = 0;


void setup() {
  pinMode(PA1, OUTPUT);
  
  timer_attach_interrupt(TIMER2, TIMER_UPDATE_INTERRUPT, led); // прерывание по переполнению
  RCC_BASE->APB1ENR|= (1<<0);  // TIM2EN > включить тактирование tim_2 
  TIMER2_BASE->CR1=0;          // TIMx_CR1 > стоп таймер
  TIMER2_BASE->PSC = 72-1;   // TIMx_PSC > значение пред делителя 72 === F = 72 000 000 / 72 = 1 000 000 Hz
  TIMER2_BASE->ARR = 50-1;   // TIMx_ARR > считать до установленного числа и обнулить === F = 1 000 000 / 50 = 20 000 Hz
  TIMER2_BASE->DIER |= (1<<0); // TIMx_DIER > разрешить прерывание по переполнению
  TIMER2_BASE->CR1|=(1<<0);    // TIMx_CR1 > старт 
}

void loop() {}

void led(){  //обработчик прерывания 
  digitalWrite(PA1, (LED = !LED)); //меняем состояние порта на противоположное
  TIMER2_BASE->SR &=~(1<<0); // TIMx_SR > сбрасываем флаг прерывания
}