首先看SysTick->CTRL控制寄存器:寄存器内有4个位具有意义
第0位:ENABLE,Systick使能位(0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick中断使能位(0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择(0:使用HCLK/8作为Systick时钟;1:使用HCLK作为Systick时钟)
第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位将自动清零
SysTick_LOAD重载寄存器:
SysTick_VAL当前值寄存器:
也是个24位的寄存器,读取时返回当前倒计数的值;写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。
SysTick_CALRB校准值寄存器:
这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:
位31NOREF:1=没有外部参考时钟(STCLK不可用)0=外部参考时钟可用
位30SKEW:1=校准值不是准确的1ms0=校准值是准确的1ms
位[23:0]:Calibrationvalue
IndicatesthecalibrationvaluewhentheSysTickcounterrunsonHCLKmax/8asexternalclock.Thevalueisproductdependent,pleaserefertotheProductReferenceManual,SysTickCalibrationValuesection.WhenHCLKisprogrammedatthemaximumfrequency,theSysTickperiodis1ms.Ifcalibrationinformationisnotknown,calculatethecalibrationvaluerequiredfromthefrequencyoftheprocessorclockorexternalclock.
类似matlab里的tic与toc函数,用来统计程序代码执行需要的时间:
uint16_t OverFlowTimes=0;
void tic(void) //程序开始计时
{
SysTick->CTRL |= (1<<2); //时钟选择,HCLK
SysTick->CTRL |= (1<<1); //中断使能
SysTick->VAL=0X00; //当前数值寄存器清零,并清除溢出标志位
SysTick->LOAD=0XFFFFFF; //计数器赋初值
SysTick->CTRL |= (1<<0); //开启计数器
}
void toc(void) //结束计时
{
float ElaspTime;
uint32_t ClkNum;
SysTick->CTRL &= ~(1<<0);//关闭计数器
ClkNum=SysTick->VAL;//读取计数器的值
ElaspTime=(OverFlowTimes*((float)0xffffff/SystemCoreClock)+(float)(0xffffff-ClkNum)/SystemCoreClock); //计算时间
OverFlowTimes=0;
printf("\r\nEscaple time is %f\r\n",ElaspTime);
}
/*溢出的次数*/
void SysTick_Handler(void)
{
OverFlowTimes++;
}