SysTick в STM32

Каждый микроконтроллер STM32 имеет в составе ядра Cortex-M, системный таймер или по другому SysTick. Основная задача SysTick в STM32, это генерировать временные тики для функций HAL, а также для операционной системы реального времени FreeRTOS.

SysTick в STM32: Основные сведения

Если вы используете кодогенератор CubeMX, то системный таймер будет настроен автоматически, иначе разработчику необходимо настроить его самостоятельно. Основной настройкой  SysTick  является настройка генерирования исключений с частотой в 1мс. Это значит, что при срабатывании исключения от системного таймера, будет увеличиваться глобальная переменная uint32_t. Что бы прочитать ее содержимое, вызовите функцию HAL_GetTick().  SysTick в STM32 является  24-разрядным таймером. Его счетчик декрементируется (считает сверху вниз), и когда досчитает до нуля происходит исключение. Тактируется системный таймер шиной AHB, это значит, что таймер имеет такую же частоту как и HCLK.

Настройка SysTick

Для настройки SysTick в STM32 в HAL имеются следующие функции:


void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)


с ее помощью к тактовой частоте таймера можно применить делитель на 8.
CLKSource определен двумя константами:

  • SYSTICK_CLKSOURCE_HCLK, устанавливает делитель равный 1, при котором частота равна частоте HCLK.
  • SYSTICK_CLKSOURCE_HCLK_DIV8, устанавливает делитель равный 8, при котором, как вы уже поняли, основная частота делиться на 8.

Функцией uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) настраивается частота генерирования исключений. Для этого на вход функции TicksNumb необходимо записать стартовое значение счетчика. В качестве примера, настроим таймер на генерирования исключений каждую миллисекунду. Для это можно вызвать функцию HAL_SYSTICK_Config с следующими параметрами:


HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000)


Это будет работать, если тактовая частота SysTick равна частоте HCLK.
Еще одной отличительной особенностью функции конфигурации системного таймера, является автоматическое включение таймера и разрешение исключений от таймера  SysTick_IRQn40.
Если не используете CubeMX, то константой TICK_INT_PRIORITY можно установить приоритет исключения.

ВНИМАНИЕ! Есть два важных моментов при работе SysTick в STM32. Первое, это при возможности не использовать медленный код в процедуре обратного вызова  HAL_SYSTICK_Callback(). В противном случае временной отрезок в 1 мс может быть не точен. Это будет влиять на функции HA, которые критически зависят от системного таймера.
Второе, это необходимо внимательно использовать функцию задержки HAL_Delay(). Если эта функция используется в прерывании, то приоритет системного таймера обязательно должен быть выше приоритета прерывания, в котором используется эта функция.


Так же разработчики HAL предусмотрели функцию остановки системного таймера HAL_SuspendTick(), а также функцию продолжающую его работу HAL_ResumeTick().

Одним из использований SysTick является реализация задержек меньше 1 миллисекунды, подробнее об этом рассказано в этой статье.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии