STM32中的tic与toc,用SysTick统计代码段执行时间
SysTick_CTRL,0xE000E010--控制寄存器
SysTICK_LOAD,0xE000E014--重载寄存器
SysTick_VAL,0xE000E018--当前值寄存器
SysTick_CALRB,0xE000E01C--校准值寄存器
首先看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("Escaple time is %f",ElaspTime);
}
/*溢出的次数*/
void SysTick_Handler(void)
{
OverFlowTimes++;
}
STM32中tictocSysTick执行时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)