1

Тема: TIMER > OUTPUT COMPARE MODE

Сравнение вывода (output compare)
В этом режиме выбранный канал таймера будет подключен к соответствующему выводу и будет изменять его (вывода) состояние каждый раз, когда счётчик таймера досчитает до значения регистра TIM_CCRx.

void setup() {
  GPIOA->regs->CRH |= 0xB0000000; // OUTPUT PA15
  RCC_BASE->APB1ENR |= RCC_APB1ENR_TIM2EN;     // TIM2EN > включить тактирование TIM_2 (APB1 ограничен 36 МГц | CK_PSC = 36 MHz)
  RCC_BASE->APB2ENR|= RCC_APB2ENR_IOPAEN; // включить тактирование PORT_A
  TIMER2_BASE->CR1 &= ~TIMER_CR1_CEN;          // TIMx_CR1_CEN > стоп таймер
  AFIO_BASE->MAPR = 0x02000300; //  SWJ _CFG [2:0] = "010" | TIM2_REMAP = PA15 = TIM2_REMAP[1:0] = "11" >>> PA15 активен как выход, канал СН1
  TIMER2_BASE->PSC = 0; // регистр предделителя 16bit
  TIMER2_BASE->ARR = 1; // регистр переполнения 16bit
  TIMER2_BASE->CCR1  = 1;//регистр сравнения 16 bit
  TIMER2_BASE->CCMR1 = 0x00000038;// OC1M[2:0]="011" | OC1PE[3]="1" 
   // F(CH1) = CK_PSC/((PSC+1)*(ARR+1))   |    ARR >= CCR1
   // F(CH1) = 36 000 000 / ((0+1)*(1+1)) = 18 000 000 MHz
  TIMER2_BASE->CCER |= TIMER_CCER_CC1E; // КАНАЛ БЛОКА СРАВНЕНИЯ
  TIMER2_BASE->CR1 |= TIMER_CR1_CEN;           // TIMx_CR1_CEN > старт таймер
}

void loop() {}