1、TIM簡介
1.1 基本定時(shí)器
時(shí)基單元:由自動(dòng)重裝載寄存器、預(yù)分頻器、計(jì)數(shù)器組成。
來自RCC的TIMxCLK:一般是系統(tǒng)的主頻,72MHz。
預(yù)分頻器(16位):對(duì)進(jìn)來的頻率進(jìn)行分頻,寫0,不分頻,輸出72MHz。寫1,2分頻,輸出36MHz。以此類推。
計(jì)數(shù)器(16位):對(duì)預(yù)分頻器后的計(jì)數(shù)時(shí)鐘進(jìn)行計(jì)數(shù)。
自動(dòng)重裝載寄存器(16位):寫入的計(jì)數(shù)目標(biāo)。
向上的箭頭(UI):表示這里會(huì)產(chǎn)生中斷信號(hào)。計(jì)數(shù)值等于自動(dòng)重裝值產(chǎn)生的中斷,一般叫做“更新中斷”,更新中斷之后會(huì)通往NVIC,再配置好NVIC的定時(shí)器通道,那定時(shí)器的更新中斷就可以得到CPU的響應(yīng)。
向下的箭頭(U):表示這里會(huì)產(chǎn)生一個(gè)事件。對(duì)應(yīng)的事件叫做“更新事件”,更新事件不會(huì)觸發(fā)中斷,但會(huì)觸發(fā)內(nèi)部的其他電路的工作。
主模式觸發(fā)DAC功能:定時(shí)器設(shè)計(jì)了一個(gè)主模式,使用主模式可以把定時(shí)器的更新事件映射到觸發(fā)輸出TRGO(Trigger Out)的位置,TRGO直接接到DAC的觸發(fā)轉(zhuǎn)換引腳上。定時(shí)器的更新就不需要通過中斷來觸發(fā)DAC轉(zhuǎn)換了。
基本定時(shí)器僅支持向上計(jì)數(shù)模式。
1.2 通用定時(shí)器
基本定時(shí)器支持向上計(jì)數(shù)、向下計(jì)數(shù)、中央對(duì)齊的計(jì)數(shù)模式。
時(shí)鐘源選擇:可以選擇內(nèi)部時(shí)鐘,也可以選擇外部時(shí)鐘。外部時(shí)鐘:TIMx_ETR(Externala)引腳上的外部時(shí)鐘。
外部時(shí)鐘模式2。ETRF:經(jīng)過ETRF進(jìn)入觸發(fā)控制器,就可以選擇作為時(shí)基單元的時(shí)鐘了。這一路叫做“外部時(shí)鐘模式2”。
外部時(shí)鐘模式1。TRGI:主要用作觸發(fā)輸入。當(dāng)TRGI當(dāng)作外部時(shí)鐘來使用時(shí),這一路叫做“外部時(shí)鐘模式1”。通過這一路的時(shí)鐘有:①ETR的引腳信號(hào),②ITR信號(hào),ITR0-ITR3分別來自其他4個(gè)定時(shí)器的TRGO輸出。可以用作定時(shí)器的級(jí)聯(lián)。③TI1F_ED(Edge,邊沿)信號(hào):連接的是輸入捕獲單元的CH1引腳。④TI1FP1信號(hào):連接到CH1引腳的時(shí)鐘。TI2FP2信號(hào):連接到CH2引腳的時(shí)鐘。
ITR信號(hào):
編碼器接口:可以讀取正交編碼器的輸出波形。
TRGO:定時(shí)器的主模式輸出,可以把內(nèi)部的一些事件映射到TRGO引腳上。
輸出比較電路:圖右下角,有四個(gè)通道,CH1--CH4??梢杂糜谳敵鯬WM波形,驅(qū)動(dòng)電機(jī)等。
輸入捕獲電路:圖左下角,有四個(gè)通道,CH1--CH4??梢杂糜跍y(cè)量輸入方波信號(hào)的頻率等。
捕獲/比較寄存器:是輸入捕獲和輸出比較電路共用的。輸入捕獲和輸出比較不能共用,因此寄存器和引腳也是共用的。
輸入濾波器原理:可以濾掉信號(hào)的抖動(dòng)干擾。在一個(gè)固定的時(shí)鐘頻率f下進(jìn)行采樣,如果連續(xù)N個(gè)采樣點(diǎn)都為相同的電平,代表輸入信號(hào)穩(wěn)定,即可輸出采樣值。如果N個(gè)采樣值不全都相同,說明信號(hào)有抖動(dòng),此時(shí)保持上一次的輸出或者直接輸出低電平。采樣頻率f和采樣點(diǎn)數(shù)N都是濾波器的參數(shù)。采樣頻率f可以是由①內(nèi)部時(shí)鐘直接而來,也可以是②內(nèi)部時(shí)鐘+分頻而來,分配多少,由參數(shù)TIM_ClockDivision 決定。TIM_ClockDivision 見5.3配置時(shí)基單元代碼。
1.3 高級(jí)定時(shí)器
重復(fù)次數(shù)計(jì)數(shù)器:可以實(shí)現(xiàn)每隔幾個(gè)周期,才發(fā)生一次更新事件和更新中斷。
DTG(Dead Time Generate):死區(qū)生產(chǎn)電路。右邊輸出控制有兩個(gè)互補(bǔ)的信號(hào),可以輸出一對(duì)互補(bǔ)的PWM波,可以用于驅(qū)動(dòng)三相無刷電機(jī)。如:四軸飛行器、電動(dòng)車的后輪、電鉆等。
BRK:剎車輸入功能,為了給電機(jī)驅(qū)動(dòng)提供安全保障。如果外部引腳BKIN(Break IN)產(chǎn)生了剎車信號(hào),或者內(nèi)部時(shí)鐘失效,產(chǎn)生了故障,控制電路會(huì)自動(dòng)切斷電機(jī)的輸出。
2、定時(shí)中斷基本結(jié)構(gòu)
PSC(Prescaler):預(yù)分頻器
CNT(Counter):計(jì)數(shù)器
ARR(Auto Reload Register):自動(dòng)重裝載寄存器
運(yùn)行控制:控制寄存器的一些位。如啟動(dòng)停止、向上或向下計(jì)數(shù)等。
計(jì)時(shí)時(shí)間到產(chǎn)生中斷的去向:中斷信號(hào)會(huì)先在狀態(tài)寄存器里置一個(gè)中斷標(biāo)志位,這個(gè)標(biāo)志位會(huì)通過中斷輸出控制,到NVIC申請(qǐng)中斷。
中斷輸出控制:因?yàn)槎〞r(shí)器很多地方需要申請(qǐng)中斷,如:更新申請(qǐng)中斷,觸發(fā)信號(hào)也會(huì)申請(qǐng)中斷,輸入捕獲和輸出比較匹配時(shí)也會(huì)申請(qǐng)中斷。就是中斷輸出的允許位,需要某個(gè)中斷,就允許一下。
3、時(shí)序圖
3.1 預(yù)分頻器時(shí)序圖
CK_PSC:預(yù)分頻器的輸入時(shí)鐘,內(nèi)部時(shí)鐘一般是72MHz。
CNT_EN:計(jì)數(shù)器使能,高電平計(jì)數(shù)器正常運(yùn)行,低電平計(jì)數(shù)器停止。
CK_CNT:預(yù)分頻器的時(shí)鐘輸出,也是計(jì)數(shù)器時(shí)鐘的輸入。
一個(gè)計(jì)數(shù)周期的工作流程:開始時(shí),計(jì)數(shù)器不使能,定時(shí)器時(shí)鐘不運(yùn)行。計(jì)數(shù)器使能后,前半段,預(yù)分頻器系數(shù)為1,定時(shí)器時(shí)鐘等于預(yù)分頻前的時(shí)鐘;后半段,預(yù)分頻器系數(shù)為2,定時(shí)器時(shí)鐘等于預(yù)分頻前時(shí)鐘的一半。在定時(shí)器時(shí)鐘的驅(qū)動(dòng)下,計(jì)數(shù)器寄存器跟隨時(shí)鐘的上升沿不斷自增,ARR自動(dòng)重裝值為FC。當(dāng)計(jì)數(shù)值計(jì)到和重裝值相等,并且下一個(gè)時(shí)鐘來臨時(shí),計(jì)數(shù)器寄存器的值才清0。同時(shí)產(chǎn)生一個(gè)更新事件(UEV)。
下三行時(shí)序:預(yù)分頻控制寄存器,供我們讀寫用的,并不直接決定分頻系數(shù)。預(yù)分頻緩沖器或者影子寄存器:真正起作用的寄存器。當(dāng)在計(jì)數(shù)中間改變預(yù)分頻器的值(預(yù)分頻控制寄存器),不會(huì)馬上更新,要等到計(jì)數(shù)到自動(dòng)重裝值,并產(chǎn)生更新事件后,才會(huì)更改預(yù)分頻器的值(預(yù)分頻緩沖器)。
3.2 計(jì)數(shù)器時(shí)序
?
CK_INT:內(nèi)部時(shí)鐘72MHz。
計(jì)數(shù)器無預(yù)裝時(shí)序:沒有緩沖寄存器的情況。
計(jì)數(shù)器有預(yù)裝時(shí)序:有緩沖寄存器的情況。
通過設(shè)置ARPE位,可以選擇是否使用預(yù)裝功能。
4、 RCC時(shí)鐘樹
左邊是時(shí)鐘的產(chǎn)生電路,右邊是時(shí)鐘的分配電路。
4.1 時(shí)鐘產(chǎn)生電路
有四個(gè)震蕩源:
????????①內(nèi)部的8MHz高速RC振蕩器;
????????②OSC_OUT,OSC_IN:外部的4-16MHz高速石英晶體振蕩器,也就是晶振,一般都是接8MHz;外部的石英振蕩器比內(nèi)部的RC振蕩器更加穩(wěn)定。一般使用外部晶振。
????????③OSC32_IN,OSC32_OUT:外部的32.768KHz低速晶振,一般給RTC提供時(shí)鐘。
????????④LSI RC:內(nèi)部的40KHz低速RC振蕩器,可以給看門狗提供時(shí)鐘。
? ? ? ? 高速時(shí)鐘晶振用于提供系統(tǒng)時(shí)鐘,如AHB、APB2、APB1都是來源于這兩個(gè)高速晶振。
在SystemInit函數(shù)里,ST配置時(shí)鐘:①首先啟動(dòng)內(nèi)部時(shí)鐘,選擇內(nèi)部8MHz為系統(tǒng)時(shí)鐘,暫時(shí)以內(nèi)部8MHz的時(shí)鐘運(yùn)行。②然后再啟動(dòng)外部時(shí)鐘,經(jīng)過PLLXTPRE、PLLSRC,進(jìn)入PLLMUL(PLL鎖相環(huán))進(jìn)行倍頻,8MHz倍頻9倍,得到72MHz。等到鎖相環(huán)輸出穩(wěn)定后,選擇鎖相環(huán)輸出為系統(tǒng)時(shí)鐘。系統(tǒng)時(shí)鐘就從8MHz切換成了72MHz。
CSS(Clock Security System):時(shí)鐘安全系統(tǒng),負(fù)責(zé)切換時(shí)鐘??梢员O(jiān)測(cè)外部時(shí)鐘的運(yùn)行狀態(tài),一但外部時(shí)鐘失效,就會(huì)自動(dòng)把外部時(shí)鐘切換回內(nèi)部時(shí)鐘,保證系統(tǒng)時(shí)鐘的運(yùn)行,防止程序卡死造成事故。
4.2 時(shí)鐘分配電路
①AHB總線有個(gè)預(yù)分頻器,在SystemInit里配置的分頻系數(shù)為1,故AHB總線的時(shí)鐘為72MHz。
②然后進(jìn)入APB1總線,這里配置的分頻系數(shù)為2,故APB1總線的時(shí)鐘為36MHz。
故基本定時(shí)器、通用定時(shí)器的時(shí)鐘都為72MHz。
③APB2總線,在這里配置的分頻系數(shù)為1,故APB1總線的時(shí)鐘為72MHz。
故高級(jí)定時(shí)器的時(shí)鐘都為72MHz。
④外設(shè)時(shí)鐘使能,就是程序中RCC_APB2/1PeriphClockCmd的地方。
5、TIM中斷初始化代碼
根據(jù)定時(shí)中斷基本結(jié)構(gòu)來一步一步初始化定時(shí)器中斷代碼:
(1)開啟外部時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
(2)選擇時(shí)基單元的時(shí)鐘
①選擇內(nèi)部時(shí)鐘作為時(shí)基單元時(shí)鐘
TIM_InternalClockConfig(TIM2);
定時(shí)器上電后默認(rèn)使用的就是內(nèi)部時(shí)鐘,可以省略。
②選擇ETR外部時(shí)鐘作為時(shí)基單元時(shí)鐘
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);
選擇外部時(shí)鐘作為時(shí)基單元時(shí)鐘,可能需要配置GPIO,視情況而定。配置GPIO就需要開啟外部時(shí)鐘以及引腳等配置。
(3)配置時(shí)基單元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_Period ,ARR自動(dòng)重裝器的值
TIM_Prescaler ,PSC預(yù)分頻器的值
TIM_RepetitionCounter ,重復(fù)計(jì)數(shù)器的值
因?yàn)門imeBaseInit里面有上述那句話,為啥要上述那句?
因?yàn)轭A(yù)分頻器是有緩沖寄存器的,寫的值只有在更新事件時(shí),才會(huì)真正起作用,這里為了讓值立刻起作用,手動(dòng)生成了一個(gè)更新事件,這樣預(yù)分頻器的值就有效了。但同時(shí)帶來了副作用:更新事件和更新中斷是同時(shí)發(fā)生的,更新中斷會(huì)置更新中斷標(biāo)志位,一旦程序初始化完,更新中斷就會(huì)立刻進(jìn)入,會(huì)導(dǎo)致剛一上電,就立刻進(jìn)中斷。
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
因此需要增加上述手動(dòng)清除更新中斷標(biāo)志位代碼。
(4)使能更新中斷
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
(5)配置NVIC文章來源:http://www.zghlxwxcb.cn/news/detail-813610.html
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
(6)啟動(dòng)定時(shí)器文章來源地址http://www.zghlxwxcb.cn/news/detail-813610.html
TIM_Cmd(TIM2, ENABLE);
到了這里,關(guān)于STM32筆記----5、TIM定時(shí)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!