微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32中的tic与toc,用SysTick统计代码段执行时间

STM32中的tic与toc,用SysTick统计代码段执行时间

时间:12-01 来源:互联网 点击:
STM32中的systick,一共有4个寄存器,名称和地址分别是:

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++;

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top