目录
概述
Systick是一个定时器,Cortex M3,M4的芯片中都有
Systick定时器通常用于实现延时函数,节约MCU资源
Systick定时器就是系统滴答定时器,是一个24位的倒计时定时器,计到0为止
从RELOAD寄存器中自动装载定时初始值
只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作
Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常
Systick中断的优先级可以设置
Systick的寄存器
CTRL | Systick控制和状态寄存器 |
LOAD | Systick自动重装载寄存器 |
VAL | Systick当前值寄存器 |
CALB | Systick校准值寄存器 |
CTRL
ENABLE 使能
TICKINT 是否产生中断
CLKSOURCE 时钟源,外部时钟源是HCLK的1/8,内核时钟是HCLK
COUNTFLAG 一个FLAG
LOAD
VAL
CALIB
不常用
相关函数
Systick_CLKSourceConfig
在固件库中的misc.c文件中(misc.c主要是用于中断管理)
函数实现如下
SysTick定义如下
core_cm3.h
同一个文件中,查看其结构体类型
查看Systick_CLKSourceConfig函数入口参数的可选项,点击断言
可以看到,可选性分别是
- SysTick_CLKSource_HCLK_Div8
-
SysTick_CLKSource_HCLK
因此:
内核级别的SysTick_Config
SysTick_Config
core_cm3.h(用于内核级别的函数)
入口参数是两个中断之间的时间间隔
判断有效性
设定装载值
设定优先级,且初值为0
设置时钟源,开启中断,使能定时器
设定了两个Systick中断之间的间隔,也就是说每过这么多的时间,systick的中断服务函数就要运行一次
一种实现方法
static _IO uint32_t TimingDelay;
void Delay(_IO uint32_t nTime){
TimeDely = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void){
if (TimingDelay != 0x00){
TimingDelay--;
}
}
这样子,每次Systick定时器减1,都需要进入一次中断服务函数,这样会对CPU造成很大的浪费
另一种实现方法
SYSTEM文件下的
delay.c delay.h
若使用操作系统,则使能该宏
delay_init函数
delay_us
注意:nus或nms不能大于LOAD的最大值,即2的24次方-1