<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        STM32中的tic與toc,用SysTick統計代碼段執行時間

        作者:劉蕊飛   來源:本站原創   點擊數:  更新時間:2014年03月02日   【字體:

        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  
        校準值寄存器: 


        這個寄存器好像目前的水平我還用不到,大體意思明白點,把英文說明放這吧:
        31 NOREF 1=沒有外部參考時鐘(STCLK 不可用)0=外部參考時鐘可用
        30 SKEW1=校準值不是準確的1ms 0=校準值是準確的1ms
        [23:0] Calibration value
        Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.

        類似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++;
        }


         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮