<thead id="hmjeg"><listing id="hmjeg"></listing></thead>
      
      
      <dl id="hmjeg"></dl>
    1. <strike id="hmjeg"></strike>
        您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
        4新聞資訊
        您的位置: 首頁 ->  新聞資訊 -> 單片機(jī)

        ?STM32 SysTick 精確延時(非中斷方式)

        文章出處:單片機(jī) 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時間:
        2020
        11-10

        SysTick是Cortex-M內(nèi)核自帶的一個24位定時器,所以我們可以在core_cm3.h或core_cm4.h頭文件中看到它的寄存器定義和配置函數(shù)SysTick_Config()。SysTick的功能非常簡單,僅僅提供一個時基功能,支持中斷請求,因此它的寄存器寥寥無幾。

        以下是手冊上對SysTick寄存器的介紹:


        CTRL為控制寄存器:

        ENABLE:使能位

        TICKINT: 中斷的開關(guān),當(dāng)計數(shù)溢出且TICKINT=1時SysTick將發(fā)出中斷申請。

        CLKSOURCE:時鐘選擇位,CLKSOURCE=1時選擇系統(tǒng)時鐘,如果是M3則為72MHz,M4則為168MHz。否側(cè)選擇外部時鐘作為時鐘源。

        COUNTFLAG: 溢出標(biāo)志位,計數(shù)到0時置1,而且硬件自動清零。

        LOAD為重載值寄存器:

        當(dāng)計數(shù)到0時SysTick自動將此寄存器的值加載到VAL寄存器中。注意它是24位的,所以最大值為0XFFFFFF。

        VAL為當(dāng)前值寄存器:

        SysTick是從上往下計數(shù)的,所以此寄存器的值是遞減的。

        那么,了解了SysTick的寄存器之后就可以配置它了。首先將CLKSOURCE位置1,選擇系統(tǒng)時鐘作為時鐘源,以M4內(nèi)核為例,就是168MHz。為了讓SysTick每1us溢出一次,就須要把重載值設(shè)置為167(168-1)。當(dāng)需要延時n(us)時,就將ENABLE位置1,讓SysTick開始計時,然后等待n次COUNTFLAG標(biāo)志之后退出就行了。

        下面是示例代碼:

        #include "delay.h"  

          

        void delay_config(void)  

        {  

            SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;     //時鐘源為系統(tǒng)時鐘168MHz  

            SysTick->LOAD = 167;                 //重載值為168-1,每1us溢出一次  

        }  

          

        void delay_ms(vu32 nTime)  

        {  

            nTime *= 1000;  

            SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;        //使能SysTick,開始計數(shù)  

            while(nTime--){  

                while((SysTick->CTRL&0X010000) == 0);        //等待COUNTFLAG標(biāo)志位置1  

            }  

            SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);     //失能SysTick,停止計數(shù)  

        }  

          

        void delay_us(vu32 nTime)  

        {  

            SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;  

            while(nTime--){  

                while((SysTick->CTRL&0X010000) == 0);  

            }  

            SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);  

        }  


        上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

        CopyRight 2020-2025 m.nntrj.com All rights reserved   滬ICP備2021005866號

        在线观看理论片国产,久久精品成视频播放,国产在线国语对白,国产拍拍拍无码免费视频
        <thead id="hmjeg"><listing id="hmjeg"></listing></thead>
            
            
            <dl id="hmjeg"></dl>
          1. <strike id="hmjeg"></strike>