STM32 — Генератор тактовых сигналов с использованием таймера — сгенерированный код STM32CubeMX

Я пытаюсь сгенерировать тактовую частоту 1,4 МГц, используя STM32F103C8Tx, используя STM32CubeMX.

Прежде всего, в моем коде у меня есть контакт PB13 в качестве выхода, и в основном я переключаю его каждые две секунды. Это работает.

Теперь более важная часть. Вещи, которые я настроил в CubeMX:

  • Я установил базовую частоту устройства на 28 МГц.
  • TIM3 Канал 2: сравнение выхода CH2 Генерация ШИМ CH2
  • Внутренние часы
  • Таймер3:Введите описание изображения здесь

Я скомпилировал сгенерированный код в IDE из OpenSTM32 и загрузил его. Светодиод мигает с заданным интервалом, но у меня нет выхода на пин B5 A7 (Timer3 канал 2). Это проверяется на осциллографе.

Код(основной):

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM3_Init();

  //These two lines were manually added
  HAL_TIM_Base_Start(&htim3);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

  while (1)
  {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        HAL_Delay(5000);
  }
}

Остальные можно найти здесь .

Я думаю, что сравнение вывода канала таймера не означает физический вывод на контакт. Он просто сравнивает (выходное) значение таймера с некоторым предустановленным значением и генерирует прерывание или что-то еще, если совпадает.
Теперь я использую выход ШИМ в режиме 1.
В моем случае я обнаружил, что HAL_TIM_Base_Start(&htim3);линия не нужна (я тоже не думаю, что это больно).
Сгенерированный тактовый сигнал должен быть ровно 1,4 МГц или допустимы какие-то другие значения?
@Бенс Кауликс: Да, ты прав. Делить на 20 вместо 19 ближе (на самом деле ровно 1,4 МГц, если точно 28 МГц). Я скорректировал свой ответ.

Ответы (1)

Вы должны установить период для таймера в поле "Период счетчика (Регистр автоперезагрузки - значение 16 бит)" (третья строка). Это вместе с предделителем (первая строка) и частотой APB1 определяет частоту таймера.

Настройка «Импульс» для выходов ШИМ определяет рабочий цикл . Все выходы ШИМ для таймера 3 имеют одинаковую частоту (частоту таймера), но независимые настройки рабочего цикла (один на выход ШИМ).

Скриншот от STM32CubeMx, для платы STM32 Nucleo STM32F042K6, таймер 3

Имейте в виду, что легко допустить ошибку один за другим. Это относится как к предделителю (например, 0 означает деление на 1), так и к периоду таймера. Например, в этом примере, где частота APB1 составляет 48 МГц, частота составляет 48 МГц / 3 / 51 = 313,725 кГц (а не, например, 48 МГц / 3 / 50 = 320 кГц). С другой стороны, для настройки ШИМ настройка представляет собой фактическое эффективное значение (не +1). Рабочий цикл составляет 45,1%, 64,7%, 13,7% и 5,9% соответственно.

(У меня есть аналогичная установка для другого процессора STM32, но я также настроен с STM32CubeMX и скомпилирован/запущен под OpenSTM32. Я проверил частоту и все четыре рабочих цикла на осциллографе (в пределах точности измерения).)

В вашем случае, предполагая, что частота APB1 на самом деле составляет 28 МГц, период счетчика 19 даст ровно 1,4000000 МГц (28 МГц/1/20) - хотя, если вы используете внутренний генератор, гарантируется не более трех значащих цифр (I обнаружил, что мой ошибся примерно на 0,37%, в пределах спецификации 1%). Если вы установите импульс ШИМ на 10, то рабочий цикл должен стать 50,0%.

Большое спасибо за Вашу помощь. Проблема в том, что в настоящее время выход застрял на «HIGH». Я пришлю вам несколько скриншотов проекта Cube, может быть, вы сможете заметить мою ошибку. imgur.com/a/HI9fI Я также добавил перед «пока (1)» в main следующие строки: HAL_TIM_Base_MspInit(&htim2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
Я забыл упомянуть, что на этот раз я использовал TIM2 на канале 2, который является контактом PA1, если это имеет значение.
Я только что сделал восстановление, и теперь он работает. спасибо вам
@Cezar Chirila: Вы должны установить «Период счетчика» (третья строка), а не пределитель, на 18. Предварительный делитель (первая строка) должен оставаться на 0.
@Cezar Chirila: Это работало для «Периода счетчика», равного 0, но предварительный делитель отличен от нуля?
Да. Это работало для «Предделителя», равного 0, и «Периода счетчика» 18.
Мне нужно спросить, почему я должен изменить «Счетчик периода». Разве 28МГц/1/19 не равно 28МГц/19/1.
@Cezar Chirila: Если вы хотите изменить рабочий цикл (мелкозернистым образом), то он должен быть «Предделитель» равным 0, а «Период счетчика» равен 18. В противном случае возможен только один рабочий цикл ШИМ. (50%?) - если вообще работает.
Я нашел кое-что интересное. Я не могу генерировать сигнал на TIM3 или TIM4. Только на ТИМ2. Все остальное то же самое, за исключением того, что Clocksource Internal — это флажок (который я проверил). Все остальное то же самое. Я добавил строки: HAL_TIM_Base_MspInit(&htim3); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_Base_MspInit(&htim4); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
Неважно, мне пришлось перестраивать его два раза, странно. Мне нужно настроить свой Workbench получше, сейчас я только строю его там и загружаю бин через ST-Link Utility.