详细内容可以看STM32F4开发指南-寄存器版本_V1.2.pdf的第五章与STM32F3与F4系列Coretex-M4内核编程手册.pdf
首先介绍一下SysTick定时器
 CM4内核的处理和CM3一样,内部都包含一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。
其次看下SysTick定时器寄存器
SysTick->CTRL的各位定义如图所示
SysTick-> LOAD 的定义如图所示
SysTick-> VAL 的定义如图所示
这的STK_CTRL 寄存器就是SysTick->CTRL
void delay_xms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
从delay_xms()函数的代码中,可以看出,延时不准确有可能出于SysTick->LODA存的值大于了16,777,215(2^24-1)导致,因为SysTick->LODA只取bit[23:0]。