03. Таймеры

По аналогии с уроком 2 создаем проект

Открываем документ на странице 11 и видим следующую схему

В STM32 есть 2-е основные шины для тактирования периферии APB1 и APB2 к которым подключены различные периферийные устройства (таймеры/USART, I2C) и у этих шин могут быть разные частоты тактирования.

Нас интересуют таймеры:
Есть таймер TIM1 (шина APB2)
Есть таймеры TIM2,3,4 (шина APB1)

Стоит отметить, что таймер 1 является «Advanced» — у него есть дополнительный функционал
Таймеры 2-4 являются «General» подробнее о них и их отличиях написано в документе


Выбираем базовый таймер tim4  (выбираем в CubeMX Timers -> TIM4)

Выбираем источник тактирования Internal Clock

Если частота тактирования выбрана как в предыдущем проекте (16МГц), то делаем следующие настройки
Prescaler/предделитель=15999 (16000-1) т.е. таймер будет тактироваться частотой 16МГц/16000=1000Гц
Counter Mode — направление счета (вверх/вниз)
Counter Period — период до срабатывания таймера =999 (1000-1) т.е. таймер на 1000 импульсе сработает.
Internal Clk Division — делитель внутренних часов (пока не трогаем)
Auto-reload preload — авто перезапуск при срабатывании таймера (если не включить — то таймер сработает 1 раз и в прерывании (или еще где требуется) надо вручную его перезапускать).

Mater/Slave mode — Disable
Trigger Event Selection/тип события при срабатывании таймера — выбираем событие «срабатывание при переполнении»
Другие варианты:
Reset (UG bit from TIMx_EGR) — TRGO будет послан при сбросе счётчика с помощью бита UG (Update Generation).
Enable (CNT_EN) — TRGO будет послан в момент активации счётчика и будет удерживаться до остановки таймера. Этот режим можно использовать для одновременного запуска нескольких таймеров, а так же и для других целей (см. ниже раздел про частотомер).
Compare Pulse (ОС1) — TRGO посылается в момент установки флага CC1IF (даже если он уже содержал значение 1), проще говоря, сигнал будет послан при захвате или сравнении на первом канале.
Output Compare (OCxREF) — TRGO будет послан при возникновении сигнала OCxREF, то есть когда выходной сигнал канала (x) переходит с неактивного на активный уровень.

При таких настройках таймер должен срабатывать 1 раз в секунду.

Необходимо разрешить глобальные прерывания таймера (чтобы он мог прервать основную программу)
идем во вкладку NVIC Settings ставим галочку напротив TIM4 Global interrupt.


Генерируем проект.

В файле main.c вставляем код

/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim4);
HAL_TIM_Base_Start_IT(&htim4);

/* USER CODE END 2 */

Очищаем код в вечном цикле (из прошлого урока, если остался)

В файле stm32f1xx_it.c находим функцию прерывания от таймера и добавляем туда код

void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */

/* USER CODE END TIM4_IRQn 0 */
HAL_TIM_IRQHandler(&htim4);
/* USER CODE BEGIN TIM4_IRQn 1 */

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

/* USER CODE END TIM4_IRQn 1 */
}

Компилируем и загружаем код в плату.

Светодиод должен мигать 1с вкл и 1с выкл.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *