1

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

2

Re: 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 |= RCC_APB1ENR_TIM2EN;     // TIM2EN > включить тактирование tim_2 
  TIMER2_BASE->CR1 &= ~TIMER_CR1_CEN;          // TIMx_CR1_CEN > стоп таймер
  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 |= TIMER_DIER_UIE;         // TIMx_DIER_UIE > разрешить прерывание по переполнению
  TIMER2_BASE->DIER |= TIMER_DIER_CC1IE;       // TIMx_DIER_CC1IE > разрешить прерывание по сравнению 1
  TIMER2_BASE->CR1 |= TIMER_CR1_CEN;           // TIMx_CR1_CEN > старт таймер
}

void loop() {}

void led1(){
  digitalWrite(PA1, HIGH); 
  TIMER2_BASE->SR &=~ TIMER_SR_UIF;            // TIMx_SR_UIF > сбрасываем флаг прерывания
}
void led(){  //обработчик прерывания 
  digitalWrite(PA1, LOW); 
  TIMER2_BASE->SR &=~ TIMER_SR_UIF;            // TIMx_SR_UIF > сбрасываем флаг прерывания
}

3

Re: 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 = 72-1;   // TIMx_PSC > значение пред делителя -1 === F = 72 000 000 / 72 = 1 000 000 Hz
  TIMER2_BASE->ARR = 100-1;  // TIMx_ARR > считать до установленого числа и обнулить === F = 1 000 000 / 100 = 10 000 Hz 
  TIMER2_BASE->CCR1 = 50-1;  // TIMx_CCR1 > регистр сравнения 1  
  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 > сбрасываем флаг прерывания
}