【简介】
在ARM CortexM 的处理器中都存在一个Systick 的定时器,该定时器的在使用RTOS的场景时通常作为系统任务的调度的时间基础定时器使用,在不使用RTOS 的裸机环境时也可以用作delay 延时实现的定时器。Systick 设计的还是比较优雅的只有以下四个寄存器。
通过CTRL 的控制寄存器选择Systick 的时钟源,及计数使能和中断输出控制。
LOAD 寄存器来自动加载至 VAL寄存器,VAL寄存器数值从1->0 时会产生中断信号
如下的校验寄存器的使用暂时未理解,使用过成中未使用过该寄存器的值,对应寄存器的三个信号均为read only 属性,暂时的理解是芯片内部逻辑使用该寄存器实现计数校准。
本地查看下手里现有的板子该寄存器数值的定义。
GD32VF427
STMC092
NXP MCXC444
【FreeRTOS】Systick Timer 使用
FreeRtos 在CortexM的处理器的适配上,通常回使用其作为系统任务调度定时器来使用,在启动调度器时会配置Systick 定时器中断来触发任务调度切换。
以下是配置代码
/* * Setup the systick timer to generate the tick interrupts at the required * frequency. */ __weak void vPortSetupTimerInterrupt( void ) { /* Calculate the constants required to configure the tick interrupt. */ #if( configUSE_TICKLESS_IDLE == 1 ) { ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); } #endif /* configUSE_TICKLESS_IDLE */ /* Stop and clear the SysTick. */ portNVIC_SYSTICK_CTRL_REG = 0UL; portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; /* Configure SysTick to interrupt at the requested rate. */ portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); }
Thread-x 在内核启动low_level_int 接口中会对系统时钟systick 进行配置relaod 值并使能systick 及 中断使能
RT-thread 在board init 初始化配置systick
在Zephyer 系统中Systick 的初始化是放在PRE_KERNEL_2 阶段调用,对应的代码如下
函数调用路径如下
看了几个操作系统的systick 的代码都没有使用到校准寄存器,也很好奇对应的校准寄存器的使用方法,如有了解的大佬希望驻足讲解下。