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

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

        第三講 STM32 SysTick---系統滴答定時器

        作者:鵬心飛漾   來源:轉自鵬心飛漾   點擊數:  更新時間:2014年07月28日   【字體:

        一、Systick簡介

            Systick也叫系統滴答定時器,滴答定時器就是一個非;镜牡褂嫊r定時器。它存在的意義是為系統提供一個時基,能夠給操作系統提供一個硬件上的中斷。使用Systick能夠精準延時,對于時間要求嚴格的場所,意義十分重大,我將寫一個流水燈改進版----精確延時(可調控)的流水燈。
        二、Systick timer
            Systick是一個24位的定時器,一次最多可以計數2^24個時鐘脈沖,這個脈沖計數值保存在當前計數值寄存器STK_VAL(Systick current value register)中,只能向下計數,每接收到一個時鐘脈沖,STK_VAL的值就會向下減1,當減到0時,硬件會自動把重裝載寄存器STK_LOAD(Systick reload value register)中保存的數據加載到STK_VAL,重新開始向下計數。如果STK_VAL的值被減至0時,會觸發異常產生中斷。
        三、相關寄存器介紹
        除了上面說的STK_VAL,下面帶大家了解相關的寄存器和寄存器位。
        1.  SysTick_CSR       控制狀態寄存器
         


        Bit0: ENABLE
                  SysTick timer的使能位,1使能Systick timer,0關閉Systick timer
        Bit1: TICKINT
                  異常觸發使能位,TICKINT=1,STK_VAL計數到0觸發異常;TICKINT=0,不觸發異常
        Bit2: CLKSOURCE
                  Systick時鐘選擇位,SysTick = 1,時鐘為AHB時鐘;0時鐘位AHB/8
        Bit16:COUNTFLAG
                  計數為0標志位, 當STK_VAL計數到0,此標志位會被置1       
         

        2. SysTick_LOAD      重裝載寄存器
         
        0-23 24位的重裝值,這也是為什么只能計數到2^24
        3.  SysTick_VAL    當前值寄存器


         
         
        4.  SysTick_CALRB    校準寄存器

         
        由于我們要寫精確延時的LED流水燈,所以我們需要使用Systick進行精確延時,理論上它的最小計時單位為AHB的時鐘周期,1/72000000秒,72分之一微秒。
         
        我們在昨天流水燈的基礎上,新建兩個文件,SysTick.c和SysTick.h
        具體代碼如下
        SysTick.h
        #ifndef __SYSTICK_H__
        #define __SYSTICK_H__
        #include "stm32f10x.h"
        void SysTick_Init(void);
        void Delay_us(__IO u32 nTime);
        #endif
         
        SysTick.c
        #include "SysTick.h"
        #include "stm32f10x.h"
        static __IO u32 TimingDelay;
        void SysTick_Init(void)
        {
         if(SysTick_Config(SystemCoreClock/100000))
         {
          while(1);
         }
         //關閉滴答定時器
         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
        }
        void TimingDelay_Decrement(void)
        {
         if(TimingDelay != 0x00)
         {
          TimingDelay--;
         }
        }
        void Delay_us(__IO u32 nTime)
        {
         TimingDelay = nTime;
         
         //使能滴答定時器
         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
         
         while(TimingDelay != 0);
        }
         
        中斷函數,在stm32f10xit.c
        void SysTick_Handler(void)
        {
         TimingDelay_Decrement();
        }
         
        修改main.c如下
        #include "stm32f10x.h"
        #include "led.h"
        #include "SysTick.h"


        int main(void)
        {
         //LED端初始化
         LED_GPIO_Config();
         
         //配置SysTick為10us中斷一次
         SysTick_Init();
         
         while(1)
         {
          LED1(0);
          Delay_us(50000);
          LED1(1);
          
          LED2(0);
          Delay_us(50000);
          LED2(1);
          
          LED3(0);
          Delay_us(50000);
          LED3(1);
          
          LED4(0);
          Delay_us(50000);
          LED4(1);
         }
        }
        這里面只有兩個函數,SysTick_Init()和Delay_us(),一個是配置SysTick定時器,一個是進行精確延時
        中斷函數也只是運行了一個自定義函數,看看不難理解
        SysTick_Config(SystemCoreClock/100000);
        SystemCoreClock是系統時鐘的宏,SystemCoreClock = 72000000
        我們的計時總時間 T = tick * (1/f),tick為SysTick_Config()的輸入參數
         
        1/f為SysTick timer使用的時鐘源的時鐘周期,f為該時鐘源的時鐘頻率。
        上面的語句中:tick = SystemCoreClock/100000=720,表示720個時鐘周期中斷一次,1/f是時鐘周期的時間,1/f = 1/72us,所以T = 720*(1/72) = 10us
        SysTick_CTRL_ENABLE_Msk,這是一個宏,用來指示寄存器的特定位置或進行位屏蔽用的,那么他是如何定義的呢?


        其中的寄存器位指示宏:SysTick_xxx_Pos, 宏展開后為xxx在相應寄存器中的位置,如控制SysTick時鐘源的SysTick_CTRL_CLKSOURCE_Pos,宏展開后為2,正好是SysTick_CSR中的Bit2
        寄存器的位屏蔽宏:SysTick_xxx_Msk,宏展開是xxx的位全部置1后,左移SysTick_xxx_Pos位,1ul使之無符號長整型,上圖中SysTick_CTRL_CLKSOURCE_Msk,宏展開為1ul<<SysTick_CTRL_CLKSOURCE_Pos,即1左移2位,得到的只有Bit2:CLKSOURCE位被置1,而其它位為0,這樣搭配& | 能夠很方便的修改寄存器的某些位,這樣就程序就不難理解了.就說這么多吧,已經講得很多了,不懂得自己想想,琢磨一下就通了。

         

        關閉窗口

        相關文章

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