Нестабильность генерации, microsы и такты

Вот код для Ардуино ИДЕ (нужно поставить аддон STM32Duino https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json )

#define analogPin   PA0

void setup() {

  // 1. Включаем тактирование для GPIOA и TIM1
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_TIM1EN;

  delayMicroseconds(10);  // Даём время на стабилизацию тактирования

  // 2. Настраиваем PA8 как альтернативную функцию для ШИМ
  // Для PA8 используем регистр CRH (пины 8–15)
  GPIOA->CRH &= ~(0x0F << ((8 - 8) * 4));  // Очищаем биты для PA8 (позиция 0 в CRH)
  GPIOA->CRH |= (0x0A << ((8 - 8) * 4));   // CNF8=10, MODE8=11

  // 3. Настройка параметров таймера
  TIM1->PSC = 1;        // Предделитель = 2 (тактовая = 72 МГц)
  TIM1->ARR = 640;    // Период: 640 тактов → 50 кГц

  // 4. Настройка канала 1 для ШИМ Mode 1
  TIM1->CCMR1 &= ~TIM_CCMR1_OC1M;  // Очищаем поле OC1M
  TIM1->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;  // OC1M = 110 (PWM Mode 1)
  TIM1->CCMR1 |= TIM_CCMR1_OC1PE;  // Включаем буферизацию (OC1PE = 1)

  // 5. Включение выхода канала 1
  TIM1->CCER |= TIM_CCER_CC1E;  // CC1E = 1 (разрешаем выход канала 1)

  // 6. Установка коэффициента заполнения 50 %
  TIM1->CCR1 = 320;

  // 7. ЗАПУСК ТАЙМЕРА: включаем счётчик и буферизацию ARR
  TIM1->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE;

  // 8. ЗАПУСК ВЫХОДА: для TIM1 ОБЯЗАТЕЛЬНО включаем основной выход
  TIM1->BDTR |= TIM_BDTR_MOE;
}

void loop() {
  static uint16_t oldValue;
  uint16_t reg = analogRead(analogPin);
  reg = map(reg, 0, 4096, 320, 32000);

// Думал вот так изменять частоту ШИМ, но у меня почему-то ошибка: error: expression cannot be used as a function
// @МММ больше в STM32 разбирается, может поможет.
/*
  if (reg != oldValue) {
    oldValue = reg;
    TIM1->ARR = reg;          // новое значение частоты
    TIM1->CCR1 = (reg / 2);   // сохраняем заполнение 50%
    TIM1->CNT = 0;            // сброс счетчика
*/
  }
}

Так-то генерация есть, но у меня почему-то не получилось реализовать изменение частоты при чтении с аналогового порта (может сам разберешься или поможет кто). На твои “плюшки” времени не хватило… )

При счете 320 - максимальная частота (~100кГц), при счете 32000 - минимальная (~1кГц).