大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。故而需要一个定时器来产生周期性的中断,以维持操作系统“心跳”的节律。
CM3 内核的处理器,它的内部包含了一个 SysTick 定时器,SysTick 是一个 24 位的倒计数定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。
Systick定时器(系统滴答定时器)常用来作延时,节省MCU资源。
有这一下4个寄存器控制这System寄存器
1.SysTick控制及状态寄存器(地址:0xE000_E010) (SysTick->CTRL)
2.SysTick重装载数值寄存器(地址:0xE000_E014)(SysTick-> LOAD)
3.SysTick当前数值寄存器(地址:0xE000_E018)(SysTick-> VAL)
4.SysTick校准数值寄存器(地址:0xE000_E01C) (SysTick-> CALIB)(不常用)
delay_init函数:
两个重要参数:fac_us 以及 fac_ms;同时把 SysTick 的时钟源选择为外部时钟,如果需要支持操作系统(OS),只需要在 sys.h 里面,设置 SYSTEM_SUPPORT_OS 宏的值为 1 即可,然后,该函数会根据 delay_ostickspersec 宏的设置,来配置 SysTick 的中断时间,并开启 SysTick 中断。具体代码如下:
delay_ms和delay_us支持 OS 需要用到的三个宏定义:delay_osrunning,用于标记 OS 是否正在运行,当 OS 已经开始运行时,该宏定义
值为 1,当 OS 还未运行时,该宏定义值为 0。
delay_ ostickspersec,用于表示 OS 的时钟节拍,即 OS 每秒钟任务调度次数。
delay_ osintnesting,用于表示 OS 中断嵌套级别,即中断嵌套次数,每进入一个
中断,该值加 1,每退出一个中断,该值减 1。
delay_ms和delay_us支持OS需要用到的4个函数:
delay_osschedlock,用于 delay_us 延时,作用是禁止 OS 进行调度,以防打断 us 级
延时,导致延时时间不准。
delay_osschedunlock,同样用于 delay_us 延时,作用是在延时结束后恢复 OS 的调度,继续正常的 OS 任务调度。
delay_ostimedly,则是调用 OS 自带的延时函数,实现延时。该函数的参数为时钟节
拍数。
SysTick_Handler,则是 systick 的中断服务函数,该函数为 OS 提供时钟节拍,同时
可以引起任务调度。
更为详细的信息,自行翻阅
《STM32F1开发指南-寄存器版本》
《Cortex-M3权威指南》