前提
最近,在学习STM32的嵌入式开发,使用的是STM32F103C8T6,在使用延时函数时注意到SysTick模块,故进行学习。STM32F103C8T6使用的是M3内核,本文亦是参考M3内核文档PM0056和STM32寄存器手册RM0008完成。
SysTick是单片机内核中的一个计数器,可与总线时钟并行,时钟计数精确且不影响总线上代码的运行。
寄存器介绍
The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads (wraps to) the value in the LOAD register on the next clock edge, then counts down on subsequent clocks.
处理器有一个24位的系统计数器,名叫SysTick。该计数器首先从装载数递减计数至零,然后在下一个时钟沿重新装载LOAD寄存器中的数,如此往复。
When the processor is halted for debugging the counter does not decrement.
当处理器调试宕机时,计数器不再递减计数。
CTRL
LOAD
VAL
CALIB
延时函数
void Delay_us(u32 i)
{
u32 temp;
SysTick->LOAD = 9*i; //设置重装数值,函数延时单位为us
SysTick->CTRL = 0X01;//使能计数器,减到零是无动作,采用外部时钟源(72MHz/8 = 9MHz)
SysTick->VAL = 0;//计数器清零
do
{
temp = SysTick->CTRL;//读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL = 0X00;//关闭计数器
SysTick->VAL = 0;//计数器清零
}