SysTick¶
SysTick — это 24-битный системный таймер, входящий в состав ядра Cortex-M (ARMv7-M и ARMv8-M) и некоторых других архитектур ARM. Он предназначен для генерации периодических прерываний с фиксированным интервалом, которые используются операционными системами реального времени (RTOS) и прикладным программным обеспечением для отсчёта времени, планирования задач и реализации задержек.
¶Архитектура и устройство
SysTick является частью блока System Control Block (SCB) ядра Cortex-M. Он представляет собой простой счётчик, который декрементируется (уменьшается на единицу) с каждым тактом процессора или с заданной частотой, кратной тактовой. Когда значение счётчика достигает нуля, он автоматически перезагружается из регистра перезагрузки (RELOAD) и генерирует запрос на прерывание (IRQ). Прерывание SysTick имеет фиксированный приоритет, который может быть настроен пользователем.
¶Регистры
SysTick управляется через три основных регистра, доступных в адресном пространстве памяти:
- SYST_CSR (Control and Status Register) — регистр управления и состояния. Содержит биты для включения таймера (ENABLE), разрешения прерывания (TICKINT), выбора источника тактового сигнала (CLKSOURCE) и флаг срабатывания (COUNTFLAG). Бит CLKSOURCE может указывать на тактовый сигнал процессора (обычно 1) или на внешний тактовый сигнал (обычно 0), который может быть менее частым.
- SYST_RVR (Reload Value Register) — регистр значения перезагрузки. Содержит 24-битное значение, которое загружается в счётчик при его обнулении или при записи в регистр текущего значения.
- SYST_CVR (Current Value Register) — регистр текущего значения счётчика. При чтении возвращает текущее значение счётчика. Запись любого значения в этот регистр сбрасывает его в ноль, а также очищает флаг COUNTFLAG.
¶Принцип работы
- Программист задаёт значение перезагрузки в SYST_RVR, которое определяет интервал времени между прерываниями.
- Таймер запускается установкой бита ENABLE в SYST_CSR.
- Счётчик SYST_CVR начинает декрементироваться с каждым тактом выбранного источника (CLKSOURCE).
- Когда SYST_CVR достигает нуля:
- Флаг COUNTFLAG в SYST_CSR устанавливается в 1.
- Если бит TICKINT установлен, генерируется прерывание SysTick.
- Значение из SYST_RVR автоматически копируется в SYST_CVR, и счётчик продолжает отсчёт.
- Процесс повторяется бесконечно, пока таймер включён.
¶Применение
SysTick является стандартным механизмом для реализации временных интервалов в микроконтроллерах на базе ARM Cortex-M. Его основное применение:
- Тик операционной системы реального времени (RTOS): Большинство RTOS, таких как FreeRTOS, RT-Thread, Zephyr и другие, используют SysTick для генерации периодических прерываний (тиков). Каждый тик запускает планировщик, который проверяет, какие задачи готовы к выполнению, и переключает контекст. Частота тика обычно составляет от 1 до 1000 Гц.
- Программные задержки: В приложениях, не использующих RTOS, SysTick может служить для создания точных задержек (например,
delay_ms()). Программный код ожидает определённое количество тиков, проверяя флаг COUNTFLAG или используя прерывание. - Измерение времени: SysTick может использоваться для измерения интервалов времени между событиями, например, для профилирования кода или измерения длительности импульсов. Для этого считывается текущее значение счётчика до и после события.
- Часы реального времени (RTC): В простых случаях SysTick может быть настроен на генерацию прерываний с частотой 1 Гц, что позволяет реализовать простые часы.
¶Настройка и использование
Настройка SysTick обычно выполняется на этапе инициализации системы. В средах разработки, таких как Keil MDK, IAR EWARM или STM32CubeIDE, часто предоставляются готовые библиотеки или функции для настройки таймера. Примерный алгоритм настройки:
- Выбор источника тактового сигнала: Определяется битом CLKSOURCE в SYST_CSR. Обычно используется тактовый сигнал процессора (Core Clock).
- Расчёт значения перезагрузки: Значение для SYST_RVR вычисляется по формуле:
RELOAD = (Частота_тактов / Частота_тиков) - 1. Например, если частота процессора 72 МГц, а желаемая частота тиков 1000 Гц (1 мс), тоRELOAD = 72000000 / 1000 - 1 = 71999. - Разрешение прерывания: Устанавливается бит TICKINT в SYST_CSR, если требуется прерывание.
- Запуск таймера: Устанавливается бит ENABLE в SYST_CSR.
После этого таймер начинает работать, и при каждом обнулении счётчика генерируется прерывание. В обработчике прерывания (обычно называется SysTick_Handler) выполняется код, необходимый для работы RTOS или приложения.
¶Особенности и ограничения
- 24-битная разрядность: Максимальное значение счётчика — 16 777 215 (2^24 - 1). Это ограничивает максимальный интервал времени, который можно задать без переполнения. Например, при частоте процессора 72 МГц максимальный интервал составляет около 233 мс. Для более длительных интервалов требуется программное расширение (например, подсчёт количества переполнений).
- Зависимость от тактовой частоты: Точность SysTick напрямую зависит от стабильности тактового сигнала. Если используется внутренний RC-генератор, точность может быть низкой. Для критичных по времени приложений рекомендуется использовать внешний кварцевый резонатор.
- Однозадачность: SysTick — это единственный аппаратный таймер, предназначенный для системного тика. В сложных системах может потребоваться использование других таймеров (например, общего назначения) для дополнительных временных задач.
- Стандартизация: Благодаря тому, что SysTick является частью ядра Cortex-M, код, использующий его, легко переносится между микроконтроллерами разных производителей (STM32, NXP, Nordic, Silicon Labs и др.), поддерживающих это ядро.
¶Альтернативы
В некоторых микроконтроллерах, не имеющих ядра Cortex-M (например, на базе ARM7TDMI, AVR, PIC), SysTick отсутствует. В таких случаях для реализации системного тика используются:
- Таймеры общего назначения (например, TIM в STM32, TMR в PIC).
- Программные циклы (менее точные и ресурсоёмкие).
- Внешние часы реального времени (RTC).
¶Источники
- ARM Cortex-M3 Technical Reference Manual (ARM DDI 0337I)
- ARM Cortex-M4 Technical Reference Manual (ARM DDI 0439C)
- ARMv7-M Architecture Reference Manual (ARM DDI 0403E)
- Документация на микроконтроллеры STM32 (RM0008, RM0090 и др.)
- FreeRTOS Reference Manual
- "The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors" by Joseph Yiu
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


