SysTick 定时器简介 OS 要想支持多任务,就需要周期执行上下文切换,这样就需要有定时器之类的硬件资源打断程序执行。当定时器中断产生时,处理器就会在异常处理中进行 OS 任务调度,同时还会进行 OS 维护的工作。Cortex-M0 处理器中有一个称为 SysTick 的简单定时器,用于产生周期性的中断请求。SysTick 为 24 位的定时器,并且向下计数。定时器的计数减到 0 后,就会重新装载一个可编程的数值,并且同时产生 SysTick 异常(异常编号为 15),该异常事件会引起SysTick 异常处理的执行,这个过程是 OS 的一部分。对于不需要 OS 的系统,SysTick 定时器也可以用作其他用途,比如定时、计时或者为需要周期执行的任务提供中断源。SysTick 异常的产生是可控的,如果异常被禁止,仍然可以用轮询的方法使用SysTick定时器,比如检查当前的计数值或者轮询溢出标志。
设置 SysTick
由于 SysTick 定时器的重载值和当前值在复位时都是未定义的,为了防止产生异常结果,对 SysTick 的配置需要遵循一定的流程:
Step1:配置 SysTick->CTRL. ENABLE 为 0,禁止 SysTick。
Step2:配置 SysTick->CTRL. CLKSOURCE,选择 SysTick 的时钟源。
Step3:配置 SysTick->LOAD,选择 SysTick 的溢出周期。
Step4:向 SysTick->VAL 写入任意值,清零 SysTick->VAL 及 SysTick->CTRL.COUNTFLAG。
Step5:配置 SysTick->CTRL. TICKINT 为 1,使能 SysTick 中断。
Step6:配置 SysTick->CTRL. ENABLE 为 1,使能 SysTick。
Step7:在中断服务程序中读取 SysTick->CTRL 以清除溢出标志。 注:Systick 溢出周期为 SysTick->LOAD+1,配置示例如下:
时钟源 SysTick->LOAD 溢出周期
RCH 4M 3999 1ms
|