STM32中的tic与toc,用SysTick统计代码段执行时间
SysTick_CALRB校准值寄存器:

这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:
位31NOREF:1=没有外部参考时钟(STCLK不可用)0=外部参考时钟可用
位30SKEW:1=校准值不是准确的1ms0=校准值是准确的1ms
位[23:0]:Calibrationvalue
IndicatesthecalibrationvaluewhentheSysTickcounterrunsonHCLKmax/8asexternalclock.Thevalueisproductdependent,pleaserefertotheProductReferenceManual,SysTickCalibrationValuesection.WhenHCLKisprogrammedatthemaximumfrequency,theSysTickperiodis1ms.Ifcalibrationinformationisnotknown,calculatethecalibrationvaluerequiredfromthefrequencyoftheprocessorclockorexternalclock.
本文引用地址:https://www.eepw.com.cn/article/201612/324399.htm
类似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("Escaple time is %f",ElaspTime);
}
/*溢出的次数*/
void SysTick_Handler(void)
{
OverFlowTimes++;
}
评论