前言
定時(shí)器有三種,基本定時(shí)器,通用定時(shí)器,以及高級(jí)定時(shí)器。
這篇博客以最簡單的基本定時(shí)器為例,實(shí)現(xiàn)LED的閃爍。
后面兩種定時(shí)器的用法后面再寫。
實(shí)現(xiàn)功能:
TIM6控制LED每隔0.5s變一次狀態(tài)。
TIM7控制LED1常量2s后熄滅。
1. 電路原理圖理解
因?yàn)槎际怯玫絃ED,所以和上一篇基于STM32CubeMX與keil采用按鍵外部中斷方式控制LED與蜂鳴器類似。
這里就直接復(fù)制粘貼了。
LED部分:
3.3V電壓經(jīng)過一個(gè)電阻R12連到DS0發(fā)光二極管,如果VCC和LED0對(duì)應(yīng)的引腳之間存在壓降,則DS0導(dǎo)通,發(fā)光。
3.3V電壓經(jīng)過一個(gè)電阻R14連到DS1發(fā)光二極管,如果VCC和LED1對(duì)應(yīng)的引腳之間存在壓降,則DS1導(dǎo)通,發(fā)光。
因此我們要先讓LED發(fā)光的話,要讓LED0和LED1標(biāo)號(hào)對(duì)應(yīng)的引腳輸出低電平,才能確保LED0和LED1發(fā)光,但由于我們默認(rèn)狀態(tài)是LED亮的,所以這里都先要制為高電平。
2. 基本定時(shí)器
STM32F407ZET6芯片中
TIM6,TIM7是基本定時(shí)器
TIM2-5,TIM9~14是通用定時(shí)器
TIM1,TIM8是高級(jí)定時(shí)器
2.1 STM32定時(shí)器中斷的流程:
定時(shí)器配置
:首先,您需要配置定時(shí)器的參數(shù),例如時(shí)鐘源、預(yù)分頻系數(shù)和計(jì)數(shù)器的自動(dòng)重裝載值。這些參數(shù)決定了定時(shí)器的計(jì)數(shù)速度和定時(shí)間隔。
中斷配置
:接下來,您需要配置定時(shí)器中斷。在STM32中,每個(gè)定時(shí)器都有一個(gè)中斷使能位和一個(gè)中斷標(biāo)志位。通過設(shè)置中斷使能位,您可以啟用或禁用定時(shí)器中斷。中斷標(biāo)志位用于指示中斷事件是否已經(jīng)發(fā)生。您可以在中斷處理函數(shù)中清除中斷標(biāo)志位。
中斷處理函數(shù)
:當(dāng)定時(shí)器達(dá)到設(shè)定的計(jì)數(shù)值時(shí),將觸發(fā)定時(shí)器中斷,并跳轉(zhuǎn)到相應(yīng)的中斷向量表入口處執(zhí)行中斷處理函數(shù)。您需要實(shí)現(xiàn)該中斷處理函數(shù)來執(zhí)行所需的操作。在中斷處理函數(shù)中,可以進(jìn)行一些定時(shí)相關(guān)的任務(wù),例如更新變量、發(fā)送數(shù)據(jù)或觸發(fā)其他事件。
中斷優(yōu)先級(jí)
:在多個(gè)中斷同時(shí)發(fā)生時(shí),優(yōu)先級(jí)決定了哪個(gè)中斷先被處理。STM32提供了優(yōu)先級(jí)組的設(shè)置,您可以根據(jù)需要配置不同的中斷優(yōu)先級(jí)。
定時(shí)器相關(guān)參數(shù)詳解參考:
2.2 部分參數(shù)詳解
2.2.1 時(shí)鐘源
STM32微控制器系列提供了多種時(shí)鐘源選項(xiàng),以滿足不同的應(yīng)用需求。以下是一些常見的時(shí)鐘源選項(xiàng):
HSI(High-Speed Internal)內(nèi)部高速時(shí)鐘:
HSI是STM32內(nèi)部集成的高頻振蕩器,通常為16MHz。它是默認(rèn)的系統(tǒng)時(shí)鐘源,在芯片上電后自動(dòng)啟動(dòng)。HSI適用于大多數(shù)應(yīng)用場景,提供相對(duì)較高的精度和穩(wěn)定性。HSE(High-Speed External)外部高速時(shí)鐘:
HSE使用外部晶體振蕩器或時(shí)鐘源提供穩(wěn)定的時(shí)鐘信號(hào)。HSE的頻率范圍可以根據(jù)具體的芯片型號(hào)而變化,通常為4MHz到25MHz。外部時(shí)鐘源相對(duì)于內(nèi)部時(shí)鐘提供更高的精確性和穩(wěn)定性。LSI(Low-Speed Internal)內(nèi)部低速時(shí)鐘:
LSI是低頻振蕩器,通常為32kHz。它用于一些低功耗應(yīng)用,例如RTC(實(shí)時(shí)時(shí)鐘)或獨(dú)立看門狗定時(shí)器(IWDG)。LSE(Low-Speed External)外部低速時(shí)鐘:
LSE使用外部晶體振蕩器或時(shí)鐘源提供低速時(shí)鐘信號(hào)。它通常為32.768kHz,用于RTC和低功耗模式。PLL(Phase-Locked Loop)鎖相環(huán):
PLL是一種用于產(chǎn)生高頻時(shí)鐘的電路。它可以通過將輸入時(shí)鐘信號(hào)(如HSI或HSE)經(jīng)過倍頻和分頻來產(chǎn)生更高頻率的時(shí)鐘。PLL提供了靈活的時(shí)鐘頻率調(diào)整能力,適合高性能應(yīng)用。
請(qǐng)注意,具體的時(shí)鐘源選項(xiàng)和配置方法可能因芯片型號(hào)和系列而有所不同。在使用特定型號(hào)的STM32芯片時(shí),您應(yīng)查閱芯片的數(shù)據(jù)手冊(cè)和參考手冊(cè),以獲取詳細(xì)的時(shí)鐘源配置信息。
2.2.2 預(yù)分頻系數(shù)
預(yù)分頻系數(shù)用于設(shè)置定時(shí)器時(shí)鐘頻率的分頻比。它確定了定時(shí)器計(jì)數(shù)器每個(gè)時(shí)鐘周期遞增的步長,從而影響定時(shí)器的計(jì)數(shù)速度和定時(shí)間隔。
具體的預(yù)分頻系數(shù)選項(xiàng)和配置方法可能因芯片型號(hào)和系列而有所不同。以下是一些常見的預(yù)分頻系數(shù)配置:
APB分頻系數(shù)(PCLKx):APB(Advanced Peripheral Bus)是STM32中用于連接外設(shè)的總線。通過配置APB分頻系數(shù),可以將系統(tǒng)時(shí)鐘(SYSCLK)分頻得到適合外設(shè)工作的時(shí)鐘頻率。常見的預(yù)分頻系數(shù)選項(xiàng)包括2、4、8和16。
TIMx預(yù)分頻系數(shù):定時(shí)器模塊(TIM)有自己的預(yù)分頻器,可以將時(shí)鐘源的頻率進(jìn)一步分頻。具體的預(yù)分頻系數(shù)選項(xiàng)和配置方法因芯片型號(hào)和定時(shí)器模塊而異。
PLL倍頻系數(shù)(PLLM、PLLN、PLLP):如果使用PLL鎖相環(huán)來產(chǎn)生高頻時(shí)鐘,可以通過設(shè)置不同的倍頻系數(shù)來調(diào)整PLL輸出時(shí)鐘的頻率。PLLM為輸入分頻器系數(shù),PLLN為倍頻器系數(shù),PLLP為輸出分頻器系數(shù)。
2.2.3 自動(dòng)重裝載值
自動(dòng)重裝載值(Auto-reload value)是一個(gè)重要的參數(shù),用于控制定時(shí)器計(jì)數(shù)器的溢出和重新加載。
定時(shí)器計(jì)數(shù)器在每個(gè)時(shí)鐘周期遞增,當(dāng)達(dá)到自動(dòng)重裝載值時(shí),計(jì)數(shù)器將重新加載為初始值,并觸發(fā)中斷(如果已啟用)。這種重新加載的操作使定時(shí)器可以周期性地生成中斷或觸發(fā)其他事件。
自動(dòng)重裝載值的大小決定了定時(shí)器的定時(shí)間隔。通常,自動(dòng)重裝載值的設(shè)置可以通過以下公式計(jì)算:
自動(dòng)重裝載值 = (定時(shí)周期 / 時(shí)鐘周期) - 1
,這里減一是因?yàn)閺?開始算,例如0~9實(shí)際上計(jì)數(shù)了10個(gè).
其中,定時(shí)周期是所需的定時(shí)間隔,時(shí)鐘周期是定時(shí)器的時(shí)鐘頻率。通過更改自動(dòng)重裝載值,可以調(diào)整定時(shí)器的定時(shí)間隔。
在STM32中,自動(dòng)重裝載值可以存儲(chǔ)在定時(shí)器的自動(dòng)重裝載寄存器(ARR)中。通過將自動(dòng)重裝載寄存器設(shè)置為所需的值,可以實(shí)現(xiàn)定時(shí)器的周期性操作。
需要注意的是,自動(dòng)重裝載值應(yīng)適當(dāng)選擇,以確保不會(huì)發(fā)生溢出。應(yīng)根據(jù)所需的定時(shí)間隔和定時(shí)器的時(shí)鐘頻率來選擇合適的值,避免溢出或過長的定時(shí)間隔。
3. STM32CubeMX參數(shù)配置
3.1GPIO配置
3.2 時(shí)鐘配置
為了便于我們計(jì)算,我們這里最終的時(shí)鐘設(shè)置為100MHz,前面的時(shí)鐘源以及分頻系數(shù)等都會(huì)自動(dòng)設(shè)置好。給到定時(shí)器的時(shí)鐘其實(shí)是APB1和APB2中獲取的,因?yàn)槲疫@篇博客寫的是基本定時(shí)器的博客所以我們要找到的基本定時(shí)器TIM6,TIM7對(duì)應(yīng)的時(shí)鐘,這里是APB1。
STM32F407ZET3的其他的定時(shí)器所在總線等這里列個(gè)表
定時(shí)器類型 | 定時(shí)器名稱 | 定時(shí)器所在總線 |
---|---|---|
基本定時(shí)器 | TIM6、TIM7 | APB1 |
通用定時(shí)器 | TIM2~5,TIM12~14 | APB1 |
通用定時(shí)器 | TIM9~11 | APB2 |
高級(jí)定時(shí)器 | TIM1,TIM8 | APB2 |
3.3 配置定時(shí)器相關(guān)參數(shù)
這里分頻系數(shù)是49999,即0~49999,長度為50000,我們APB1總線傳過來的時(shí)鐘是50MHz,所以說明每一個(gè)時(shí)鐘周期都是1ms。
A
P
B
1
時(shí)鐘
T
I
M
6
分頻系數(shù)
=
50
?
1
0
6
H
z
5
?
1
0
4
=
1
K
H
z
=
1
T
(
時(shí)間
)
=
>
T
=
1
m
s
\frac{APB1時(shí)鐘}{TIM6分頻系數(shù)}=\frac{50*10^6Hz}{5*10^4}=1KHz=\frac{1}{T(時(shí)間)}=>T=1ms
TIM6分頻系數(shù)APB1時(shí)鐘?=5?10450?106Hz?=1KHz=T(時(shí)間)1?=>T=1ms
對(duì)于TIM6控制的LED,我們的目標(biāo)是0.5s轉(zhuǎn)換一次LED的狀態(tài),所以這里這里的計(jì)數(shù)重載是500-1,因?yàn)閺?開始計(jì)數(shù)。
寫到這,簡單點(diǎn)理解就是,從時(shí)鐘源分頻時(shí)鐘到總線,定時(shí)器從總線再分頻,用來作為時(shí)間的分度值,這個(gè)說法可能不恰當(dāng),但意思就是一個(gè)時(shí)鐘周期多少秒,接著用計(jì)數(shù)重載值 * 剛才的分度值就是我們想要的時(shí)間。即每隔多少時(shí)間,干什么。
TIM7的設(shè)置也同樣,只不過計(jì)數(shù)重載值為1999,這里就不貼全圖了。
3.4 Debug配置
3.5 中斷配置
其實(shí)時(shí)鐘配置里面的NVIC打開了之后,這里其實(shí)就自動(dòng)勾選配好了。優(yōu)先級(jí)搶占和響應(yīng):當(dāng)兩個(gè)中斷發(fā)生且優(yōu)先級(jí)不同時(shí),優(yōu)先級(jí)高的中斷會(huì)搶占正在執(zhí)行的低優(yōu)先級(jí)中斷。如果多個(gè)中斷具有相同的優(yōu)先級(jí),則根據(jù)搶占式(Preemption)和響應(yīng)式(Response)的設(shè)定來確定中斷的順序。先看搶占式優(yōu)先級(jí),前面數(shù)值越小,優(yōu)先級(jí)越高,如果一樣則看后面的優(yōu)先級(jí),數(shù)值也是越小越優(yōu)先。
這篇博客其實(shí)對(duì)優(yōu)先級(jí)要求不是那么高,不會(huì)怎么涉及搶占優(yōu)先級(jí)等情況。所以這里默認(rèn)0 , 0就行。
還有一個(gè)就是代碼生成的時(shí)候是否生成對(duì)應(yīng)的中斷服務(wù)函數(shù)之類的,都默認(rèn)勾選上。
3.6 代碼生成
4. keil代碼編寫
打開生成的項(xiàng)目中的stm32f4xx_it.c文件
再最下面直接添加下列代碼
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM6)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
if(htim->Instance==TIM7)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
}
說明一下為什么重寫這個(gè)函數(shù),當(dāng)定時(shí)器達(dá)到設(shè)定的計(jì)數(shù)值時(shí),將觸發(fā)定時(shí)器中斷,并跳轉(zhuǎn)到相應(yīng)的中斷向量表入口處執(zhí)行中斷處理函數(shù)。您需要實(shí)現(xiàn)該中斷處理函數(shù)來執(zhí)行所需的操作。
計(jì)數(shù)值超過500就會(huì)觸發(fā)中斷,調(diào)用功能這個(gè)回調(diào)函數(shù),這里我們看函數(shù)名就知道了。PeriodElapseCallback和我們?cè)O(shè)置的那個(gè)值對(duì)應(yīng)。
最后就是燒錄程序了,這個(gè)和我這個(gè)專欄第一篇都一樣,具體參考這篇博客文章來源:http://www.zghlxwxcb.cn/news/detail-766005.html
總結(jié)
這篇博客詳細(xì)記錄了定時(shí)器的簡單使用,從目標(biāo)出發(fā)到原理闡釋再到配置與代碼編寫,一步一步實(shí)現(xiàn)功能。難度不是很大,中斷處理部分與上一篇有很多共性的地方,學(xué)習(xí)起來也比較快。就是記錄的時(shí)候比較費(fèi)時(shí)間。寫這篇博客的部分內(nèi)容用了下chatGPT工具,效果也挺好,確實(shí)提高了部分效率。文章來源地址http://www.zghlxwxcb.cn/news/detail-766005.html
到了這里,關(guān)于基于STM32CubeMX和keil采用STM32F407的基本定時(shí)器中斷實(shí)現(xiàn)LED閃爍的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!