SysTickTimer - 24-битный таймер процессора Cortex-M3


Процессор оснащен 24-разрядным системным таймером SysTick, который ведет обратный отсчет от значения перезагрузки до нуля. При достижении значения 0 он устанавливает значение COUNTFLAG в регистре STK_CTRL равным 1 и, если разрешено исключение (прерывание) битом TICKINT, активирует исключение. Затем автоматически перезагружает значение из регистра STK_LOAD в регистр STK_VAL на следующем такте, и ведет новый обратный отсчет на последующих тактах.

Когда процессор останавливается для отладки, системный таймер останавливает счет (счетчик не уменьшается).

Системный таймер работает в соответствии с тактовой частотой процессора. Если этот тактовый сигнал отключен в режиме пониженного энергопотребления, системный таймер останавливается.

Начальное значение счетчика, записываемое в регистр STK_LOAD может быть в диапазоне 0x0000'0001-0x00FF'FFFF. Начальное значение равное 0 не имеет смысла, поскольку запрос исключения SysTick и флаг COUNTFLAG активируются при переходе счетчика STK_VAL от 1 до 0

Максимальное значение счетчика, записанное в регистр ограничено 24 битами беззнакового целого (uint32_t) и равно, в десятичной системе: 16'777'215.

Текущее значение счетчика системного таймера находится в регистр STK_VAL и доступно для чтения. При записи любого значения в регистр STK_VAL его значение обнуляется (CURRENT[23:0]=0) и сбрасывается флаг COUNTFLAG в регистре STK_CTRL.

Функция CMSIS настройки и запуска системного таймера

//-core_cm3.h

#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)

/**
  \brief   System Tick Configuration
  \details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
           Counter is in free running mode to generate periodic interrupts.
  \param [in]  ticks  Number of ticks between two interrupts.
  \return          0  Function succeeded.
  \return          1  Function failed.
  \note    When the variable __Vendor_SysTickConfig is set to 1, then the
           function SysTick_Config is not included. In this case, the file device.h
           must contain a vendor-specific implementation of this function.
 */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}

#endif