Вот код для Ардуино ИДЕ (нужно поставить аддон 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кГц).