Всем доброго времени суток! Сегодня мы снова будем исследовать возможности STM32CubeMx и рассмотрим таймеры в STM32. Вот предыдущие статьи мини-цикла:
Без лишних слов, перейдем сразу к делу!
В предыдущей статье мы разобрались как настраивать и использовать порты ввода-вывода в STM32CubeMx, а сегодня рассмотрим конфигурацию таймера и прерываний. Пусть будет такая задача – задействуем таймер таким образом, чтобы он генерировал прерывания, допустим, каждые 500 мс, и в прерывании помигаем диодиком для наглядной демонстрации работы. В принципе, ничего сложного, так что приступаем!
Выполняем привычную нам последовательность действий – создаем и настраиваем новый проект в STM32CubeMx. И для начала нам нужно активировать таймер. Пусть в нашем примере будет использоваться TIM3:
Для активации таймера в разделе TIM3 нам нужно в поле Clock Source выбрать источник тактирования. Кроме того, я тут настроил вывод PD12 на работу в режиме выхода, чтобы управлять светодиодом на плате для демонстрации работы программы. Вроде бы все понятно, но с таймером не все так просто. Его нужно как минимум еще и настроить 🙂 Для этого переходим на вкладку Configuration:
Дважды нажимаем на TIM3 и открывается новое окно, в котором мы уже можем более гибко настроить параметры таймера:

Таймер сидит на шине APB1, частота которой составляет 16 МГц (это настройка по умолчанию – как изменить тактовые частоты при помощи Cube я расскажу в следующей статье). Выбираем делитель частоты равным 16000 (в Cube необходимо установить значение, меньшее на 1). В итоге получаем (16 МГц / 16000) = 1000 Гц. То есть один тик таймера будет соответствовать 1 мс. Установив период 500, получим прерывания по переполнению таймера каждые 500 мс – то, что нам и надо. В этом же окне во вкладке NVIC Settings нужно, собственно, включить нужное нам прерывание, и на этом настройки заканчиваются. Генерируем код и получаем готовый проект для IAR.
Теперь осталось совсем немного – запустить наш таймер (STM32CubeMx занимается только инициализацией, все активные действия мы должны совершать сами). Кроме того, в прерывании по переполнению таймера мы будем менять состояние светодиода. Кстати, сам обработчик прерывания Cube создал за нас и найти его совсем несложно – для всех прерываний генерируется отдельный файл stm32f4xx_it.c.
Давайте все это поэтапно осуществим. Для начала идем в main() и запускаем таймер:
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM3_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END 2 */ /* USER CODE BEGIN 3 */ /* Infinite loop */ while (1) { } /* USER CODE END 3 */ }
Поскольку мы будем использовать прерывания, то нам нужна функция HAL_TIM_Base_Start_IT(). Переходим к следующему этапу – а именно к изменению состояния светодиода в прерывании. Для этого даже есть специальная функция HAL_GPIO_TogglePin():
void TIM3_IRQHandler(void) { /* USER CODE BEGIN TIM3_IRQn 0 */ /* USER CODE END TIM3_IRQn 0 */ HAL_TIM_IRQHandler(&htim3); /* USER CODE BEGIN TIM3_IRQn 1 */ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); /* USER CODE END TIM3_IRQn 1 */ }
Теперь мы можем скомпилировать код, собрать проект и прошить микроконтроллер. Сразу же увидим мигающий диод, причем мигает он каждые 500 мс – задача успешно реализована!
Как видите, STM32CubeMx оказывается довольно-таки удобным инструментом для создания своих проектов и это заметно даже в небольших проектах, поэтому в следующих статьях мы продолжим его изучение, оставайтесь на связи!