Тема: 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 > сбрасываем флаг прерывания
}