声明:内容来自正点原子PPT
Systick定时器就是系统滴答定时器,一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值。只有不把它在SysTick控制及状态寄存器中的使能位清楚,就永不停息,即使在睡眠模式下也能工作。
4个Systick寄存器:
CTRL SysTick 控制和状态寄存器
LOAD SysTick 自动重装载除值寄存器 ---(设置后自动重载值固定,最大2^24)
VAL SysTick 当前值寄存器 ---(每个时钟周期减1,减到0重新装载LOAD的值)
CALIB SysTick 校准值寄存器
SysTick 控制和状态寄存器- CTRL:
对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8
内核时钟是 HCLK时钟
配置函数:SysTick_CLKSourceConfig();
SysTick 重装载数值寄存器- LOAD
SysTick 当前值寄存器- VAL
固件库中的Systick相关函数:
SysTick_CLKSourceConfig() //Systick时钟源选择 misc.c文件中
SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断 //core_cm3.h/core_cm4.h文件中
Systick中断服务函数:
void SysTick_Handler(void);
滴答定时器用中断的方式实现delay延时
滴答定时器不用中断实现延时:
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; // 系统时钟1/8,1uS时钟周期数
fac_ms=(u16)fac_us*1000; // 1mS时钟周期数
}
//延时nus
//nus为要延时的us数
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载,最大值2^24
SysTick->VAL=0x00; // 清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; // 开始计数
do
{
temp=SysTick->