最近一直在忙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--------------------------------------------------------