Systick :系统心跳定时器,提供系统节拍
裸机程序中可作为独立的延时定时器 一:用途 1.产生操作系统的时钟节拍 2.便于不同处理器之间程序移植 SysTick定时器被捆绑在NVIC中,异常号15 3.作为一个闹铃测量时间用于测量时间,但当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作
二:时钟树
以AHB时钟或者AHB/8作为运行时钟。
三:寄存器
它有四个寄存器
STK_CSR, 0xE000E010 -- 控制寄存器 STK_LOAD, 0xE000E014 -- 重载寄存器 STK_VAL, 0xE000E018 -- 当前值寄存器 STK_CALRB, 0xE000E01C -- 校准值寄存器 stm32的时钟源 选择外部时钟源时,则Systick时钟为HCLK /8 选择内核时钟源时,则Systick时钟为HCLK 延时原理systick定时器是24位的递减计数器,设定初值并使能它后,脉冲计数值被保存到当前值寄存器(STK_VAL)
它会每个系统时钟周期计数器减1,计数到0 时,触发中断,将从RELOAD 寄存器中自动重装载定时初值到STK_VAL。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息.
四:代码
AHB时钟1/72 000 000 ,
初始化:初始化已经把嘀嗒定时器打开了,为了可控,代码中关闭了定时器。
SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;主程序调用打开嘀嗒。
void SysTick_Init(void){ /* SystemFrequency / 1000 1ms中断一次 * SystemFrequency / 100000 10us中断一次 * SystemFrequency / 1000000 1us中断一次 */// if (SysTick_Config(SystemFrequency / 100000)) // ST3.0.0库版本 if (SysTick_Config(SystemCoreClock / 100000)) // ST3.5.0库版本 { /* Capture error */ while (1); } // 关闭滴答定时器 SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
// 打开闭滴答定时器 //SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;
}
中断:
stm32f10x_it.c中的接口代码
void SysTick_Handler(void){ TimingDelay_Decrement(); }
void TimingDelay_Decrement(void){ if (TimingDelay != 0x00) { TimingDelay--; }}裸机中嘀嗒并不是一直开启的,延时可以这样做。
void Delay_us(__IO u32 nTime){ TimingDelay = nTime; // 使能滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; while(TimingDelay != 0);}