STM32学习笔记(五)——通用定时器计数延时
STM32定時(shí)器概述
STM32F40x系列總共最多有14個(gè)定時(shí)器,定時(shí)器分為三類:基本定時(shí)器、通用定時(shí)器和高級(jí)定時(shí)器。它們的都是通過(guò)計(jì)數(shù)來(lái)達(dá)到定時(shí)的目的,和51的定時(shí)器差不多,基本原理都是一樣的,就是功能多了一些,這些計(jì)數(shù)器都是自動(dòng)重新裝載初值的,使用起來(lái)非常方便,而且計(jì)數(shù)時(shí)鐘頻率可以通過(guò)分頻系數(shù)來(lái)設(shè)置。本文章將介紹使用定時(shí)器中斷來(lái)控制LED間隔1s閃爍。
?
計(jì)數(shù)的時(shí)鐘來(lái)源主要有四個(gè):
- 內(nèi)部時(shí)鐘CK_INT
- 外部時(shí)鐘模式1:外部輸入腳TIx
- 外部時(shí)鐘模式2:外部觸發(fā)輸入ETR,僅適用于 TIM2、 TIM3、 TIM4
- 內(nèi)部觸發(fā)輸入ITRx:使用 A 定時(shí)器作為 B 定時(shí)器的預(yù)分頻器(A為B提供時(shí)鐘)
我們使用定時(shí)器內(nèi)部時(shí)鐘,即CK_INT作為計(jì)數(shù)器的時(shí)鐘源 = 168MHz / 2 = 84MHz
?
時(shí)鐘框圖如下:
?
?
定時(shí)器的配置
1.使能定時(shí)器時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //定時(shí)器3時(shí)鐘使能?
2.初始化定時(shí)器參數(shù),設(shè)置分頻系數(shù)和計(jì)數(shù)初值,計(jì)數(shù)模式設(shè)置等。如果要定時(shí)1s定時(shí)器溢出,那么可以設(shè)置分頻系數(shù)為8400 ,則分頻后的時(shí)鐘頻率為 : 84MHz / 8400 = 10KHz ?= 0。1ms ?,計(jì)數(shù)初值設(shè)置為1s / 0。1 ms = 10000即可。
/*初始化定時(shí)器參數(shù),設(shè)置自動(dòng)重裝值,分頻系數(shù),計(jì)數(shù)方式*/TIM_Init。TIM_ClockDivision= TIM_CKD_DIV1; //時(shí)鐘分頻因子TIM_Init。TIM_CounterMode=TIM_CounterMode_Up; //定時(shí)器模式TIM_Init。TIM_Period=Period; //自動(dòng)重裝值,0-65535TIM_Init。TIM_Prescaler= Prescaler; // TIM_Init。TIM_Prescaler= 8400; //分頻系數(shù)-0。1ms // TIM_Init。TIM_Prescaler= 42000; //分頻系數(shù)-0。5ms // TIM_Init。TIM_RepetitionCounter= TIM_TimeBaseInit(TIM3,&TIM_Init);?
TIM_RepetitionCounter是使用高級(jí)定時(shí)器要進(jìn)行設(shè)置的。我們使用的是定時(shí)器3,屬于通用定時(shí)器,計(jì)數(shù)模式設(shè)置為向上計(jì)數(shù),則計(jì)數(shù)器從0 開始計(jì)數(shù),當(dāng)計(jì)數(shù)到設(shè)置的初值時(shí),然后計(jì)數(shù)器重新從0開始計(jì)數(shù),并將溢出標(biāo)志位置1,如果設(shè)置了溢出中斷,則會(huì)產(chǎn)生計(jì)數(shù)器溢出中斷。
3.定時(shí)器3中斷設(shè)置,注意優(yōu)先級(jí)的設(shè)置,如果程序中開啟了多個(gè)中斷。就要考慮中斷優(yōu)先級(jí)的設(shè)置,本程序只使用了一個(gè)定時(shí)器中斷,則配置為任何優(yōu)先級(jí)都是可以的。
/*定時(shí)器3中斷優(yōu)先級(jí)設(shè)置*/NC_Init。NVIC_IRQChannel=TIM3_IRQn; //中斷通道指定定時(shí)器3NC_Init。NVIC_IRQChannelCmd= ENABLE; NC_Init。NVIC_IRQChannelPreemptionPriority=0; //設(shè)置搶占優(yōu)先級(jí)NC_Init。NVIC_IRQChannelSubPriority=0; //設(shè)置響應(yīng)優(yōu)先級(jí)NVIC_Init(&NC_Init);?
4.使能定時(shí)器,當(dāng)執(zhí)行完這一句后,定時(shí)器就開始從 0 開始計(jì)數(shù)了。我們可以通過(guò)使能定時(shí)器來(lái)暫停計(jì)數(shù)器,或者使能定時(shí)器來(lái)啟動(dòng)定時(shí)器,在開發(fā)時(shí)鐘時(shí)可以使用這個(gè)。
相當(dāng)于51中的TR1 = 1 / TR1 = 0
TIM_Cmd(TIM3,ENABLE);?
5.中斷服務(wù)函數(shù),本程序是讓LED1間隔1s閃爍,那么中斷服務(wù)函數(shù)的功能就是讓LED1的狀態(tài)反轉(zhuǎn)。
void TIM3_IRQHandler(void) {if(TIM_GetITStatus(TIM3,TIM_IT_Update)) //如果產(chǎn)生溢出中斷 {LED1=!LED1; //那么狀態(tài)反轉(zhuǎn) // LED0=!LED0; }TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清楚更新中斷標(biāo)志位 }?
這里檢測(cè)的是定時(shí)器溢出中斷,即計(jì)時(shí)1s時(shí)間到,則將LED1的狀態(tài)反轉(zhuǎn),然后將溢出標(biāo)志位清零。
主函數(shù)
int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(168);LED_Init(); //LED初始化熄滅Timer3_Config(2000,42000); //0.5ms*2000 = 1swhile(1){LED0=!LED0;delay_ms(1000); } }?
這里使用延時(shí)函數(shù)來(lái)延時(shí)1s控制LED0閃爍,實(shí)際運(yùn)行效果可以看出兩個(gè)LED的閃爍在一定的時(shí)間內(nèi)是同步的,但是時(shí)間一長(zhǎng)還是有點(diǎn)誤差。
總結(jié)
當(dāng)學(xué)完這一節(jié)定時(shí)器的時(shí)候,我就有一個(gè)想法了,那就是寫一個(gè)LCD電子時(shí)鐘的程序,通過(guò)定時(shí)器來(lái)達(dá)到準(zhǔn)確延時(shí)的目的,當(dāng)然還要學(xué)習(xí)一下LCD1602的驅(qū)動(dòng)方法,哈哈,想想就很有成就感。
參考資料:
?STM32F4_TIM基本延時(shí)(計(jì)數(shù)原理)
STM32-通用定時(shí)器基本定時(shí)功能
STM32F4xx中文參考手冊(cè)
?
以上是我學(xué)習(xí)過(guò)程的一些個(gè)人理解,有不對(duì)或不準(zhǔn)確的地方,歡迎各位大神指正。
?
2017年4月21日21:33:44
?
轉(zhuǎn)載于:https://www.cnblogs.com/whik/p/6746177.html
總結(jié)
以上是生活随笔為你收集整理的STM32学习笔记(五)——通用定时器计数延时的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ADO.NET高级应用
- 下一篇: .ai域名注册已经极具投资价值进入火爆期