【轉】淺析STM32中SysTick在3.5固件庫中的應用

       最近一直在忙STM32的學習,在學習中遇到了很多問題,也通過各類嘗試解決問題,在這裏我經過博文的形式寫出來,也但願可以幫到碰見一樣問題的人們。對於STM32系列的芯片,有一個好處就是官方給出了一個固件庫,這個可以很方便你們夥的編程。省去了使用寄存器的方法。可是固件庫的學習也有不少讓人麻煩的地方。好比更新速度快,這樣你們能夠在一棵樹上吊死。只認一個版本的固件庫。在這裏我所用的是3.5標準固件庫。css

    STM32內核中有一個系統定時器,它是一個24位遞減計數器。工做原理是系統時基定時器設定初值並使能後,每通過1個系統時鐘週期,計數值就減,當計數值減到0時,系統定時器會從新自動重裝初值,並繼續下一次計數,同時內部的COUNTFLAG標誌位會置位。觸發中斷。html

      在很早的固件庫中,提供了不少函數,來對SysTick進行設置,可是到了3.5版本的標準固件庫中,移除了相關驅動函數,用戶必須調用CMSIS 定義的函數,其中CMSIS只提供了一個Systick設置的函數,替代了STM32原來有的全部的驅動函數,這樣作的目的,多是簡化Systick 的設置,但是下降了用戶對SysTick的可控性。編程

     在CMSIS中提供的函數是  SysTick_Config(uint32_t ticks); 該函數設置了自動重載入計數器(LOAD)的值,SysTick IRQ的優先級,復位了計數器(VAL)的值,開始計數並打開SysTick IRQ中斷。SysTick時鐘默認使用系統時鐘。函數

    其中這個函數定義在Core_cm3.h中 ,源代碼以下所示:學習

/**
 * @brief Initialize and start the SysTick counter and its interrupt.
 *
 * @param ticks number of ticks between two interrupts
 * @return 1 = failed, 0 = successful
 *
 * Initialise the system tick timer and its interrupt and start the
 * system tick timer / counter in free running mode to generate 
 * periodical interrupts.
 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
    if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                                   
    SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
    NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
    SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                       SysTick_CTRL_TICKINT_Msk   | 
                       SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
    return (0);                                                  /* Function successful */
}

從上面的函數中能夠看出,這個函數把Systick的初值,中斷優先級,使能中斷,開啓定時器都完成了。大大簡化了程序。ui

其中ticks 表明的是初值。例如系統時鐘是72Mhz 那麼要產生1ms的時基,那麼咱們能夠這樣去寫。spa

SysTick_Config(SystemCoreClock/1000);  固然也能夠寫成:SysTick_Config(72000);code

      瞭解了這些,咱們能夠用它來作一個簡單的延時函數delay_ms(u16 time);htm

        代碼以下:blog

void delay_ms(u16 time)

{
    nTime = time; /* nTime 是個全局變量 可設 extern u16 nTime; */
    while(nTime);
}

       在 中斷函數中直接  加入nTime--;

      在主函數 初始化過程當中 加入  SysTick_Config(72000);

     這樣就OK 了  試試吧。

 

原文連接:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html

--------------------------------------End--------------------------------------------------------

相關文章
相關標籤/搜索