STM32基於cubeMX實現定時器點燈

2021-10-19 14:30:31 字數 1876 閱讀 8204

stm32的常見的定時器資源: 系統嘀嗒定時器systick、看門狗定時器watchdog、實時時鐘rtc、基本定時器、通用定時器、高階定時器。

系統嘀嗒定時器systick :這是乙個整合在cortex m3核心當中的定時器,它並不屬於晶元廠商的外設,也就是說使用arm核心的不同廠商,都擁有基本結構相同的系統定時器。主要目的是給rtos提供時鐘節拍做時間基準。

基本定時器:tim6、tim7。

通用定時器:tim2、tim3、tim4、tim5。在基本定時器的基礎上,實現輸出比較、輸入捕獲、pwm生成、單脈衝模式輸出等功能。這類定時器最具代表性,使用也最廣泛。

高階定時器:tim1、tim8。

stm32的通用定時器,是乙個通過可程式設計預分頻器(prescaler)驅動的16位自動重灌主計數器(counter period)構成。可以對內部時鐘或觸發源以及外部時鐘或觸發源進行計數。

首先,定時器時鐘訊號送入16位可程式設計預分配器(prescaler),該預分配器係數為0~65535之間的任意數值。預分配器溢位後,會向16位的主計數器(counter period)發出乙個脈衝訊號。

預分頻器,本質上是乙個加法計數器,預分頻係數實際上就是加計數的溢位值。

定時器發生中斷時間的計算方法:

定時時間 = (可程式設計預分頻器+1 ) x (主計數器+1) x 1/ 定時器時鐘頻率

例:假設時鐘訊號為1khz,可程式設計預分頻器係數為9,主計數器係數為9。此時定時器為0.1秒

時鐘樹種系統時鐘是72mhz

別忘了在nvic settings中允許定時器中斷

這兩部分別是配置分頻係數和定時器週期的

由上面的時鐘數可以看到我們配置的時鐘頻率是72mhz,也就是72000000hz。

這個時候我們的分頻係數配置為7199(其實就是7200,至於為什麼一會我會講到),也就相當於告訴cpu:將原來7200個頻率脈衝看成乙個頻率脈衝。這樣的話,分頻後定時器 6 的時鐘頻率為 72000000/7200=10000hz,也就是它每1/10000秒會來乙個脈衝。

然後我們將定時器週期設定為9999(其實就是10000,至於為什麼一會我會講到),這樣的話,定時器6就會檢測到每過10000個脈衝的話就會觸發定時器中斷。結合上面定時器每1/10000秒會來乙個脈衝就可以得到:每過10000*(1/10000)=1s就會觸發一次定時器中斷

至於為什麼要將分頻係數和定時器週期設定為7199和9999而不是7200和10000呢,原因是stm32的暫存器是從0開始計數的,即0~7199正好是7200個。定時器週期同理

如果覺得上面的解釋太枯燥的話,可以記憶下面這個公式:

(分頻係數/時鐘頻率)定時器週期 = 需要的時間

以1s為例:1s = (7199+1)/72000000(9999+1)

以0.5s為例:0.5s = (7199+1)/72000000*(4999+1)

當然,分頻係數、時鐘頻率、定時器週期 可以根據實際情況設定,不一定僅侷限於某個數,比如0.5s也可以這麼計算:0.5s = (3599+1)/72000000*(9999+1)

在main函式中啟動定時器

hal_tim_base_start_it

(&htim2)

;//啟動定時器2

編寫 tim2 更新中斷服務程式

void

hal_tim_periodelapsedcallback

(tim_handletypedef *htim)

}

stm32基於CUBEMX使用LL庫操作spi

keil v5 cubemx v5 mcu stm32f429igt6 因為專案中需要快速採集外部spi介面adc的資料,所以研究使用ll庫讀取spi資料。cube中開啟spi功能 設定為ll庫 spi讀取可以自己實現 while spi1 sr 1 1 0 wait for tx buf empt...

STM32的韌體庫和CubeMX

標準外設庫std standard peripheral libraries peripheral英 p r f r l 美 p r f r l adj.外圍的 次要的 神經 末梢區域的 n.外部裝置 hal hardware abstraction layer 硬體抽象層 庫 hal庫是st未來主...

stm32晶元休眠模式 stm32實現待機喚醒

stm32的低功耗模式有3種 1 睡眠模式 cm3核心停止,外設仍然執行 2 停機模式 所有時鐘都停止 3 待機模式 1.8v核心電源關閉 進入待機模式的方法,以及設定wk up引腳用於把stm32從待機模式喚醒的方法 一般步驟如下 1 設定sleepdeep位 scb scr的第二位 2 使能電源...