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