這節主要講下STM32 通用定時器的定時功能。
一、TIMx的時鐘源問題:
STM32有8路寄存器,包括TIM1和TIM8兩個高級定時器,TIM6和TIM7兩個基本定時器,TIM2-TIM5四個通用定時器,定時器是完全獨立的,而且沒有互相共享任何資源,它們可以一起同步操作,所有TIMx定時器在內部相連,用于定時器同步或鏈接。當一個定時器處于主模式時,它可以對另一個處于從模式的定時器的計數器進行復位、啟動、停止或提供時鐘等操作。其中TIM1和TIM8掛在APB2總線上,而TIM2-TIM7則掛在APB1總線上。他們所在的APB2總線也比APB1總線要好。APB2可以工作在72MHz下,而APB1最大是36MHz。
1)定時器的時鐘:
計數器時鐘可由下列時鐘源提供:
1:內部時鐘(CK_INT)
2:外部時鐘模式1:外部輸入腳(TIx)
3:外部時鐘模式2:外部觸發輸入(ETR)
4:內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。
這些時鐘,具體選擇哪個可以通過TIMx_SMCR寄存器的相關位來設置。這里的CK_INT時鐘是從APB1倍頻的來的,除非APB1的時鐘分頻數設置為1,否則通用定時器TIMx的時鐘是APB1時鐘的2倍,當APB1的時鐘不分頻的時候,通用定時器TIMx的時鐘就等于APB1的時鐘。這里還要注意的就是高級定時器的時鐘不是來自APB1,而是來自APB2的。
2)定時器的核心:
說到定時器的核心,自然少不了兩個,一個是計數時鐘(每隔多長時間計一次),二是計多少次溢出,這兩個就共同決定了溢出時間。定時器的計數時鐘根據定時器的不同分別來自APB1或APB2,計數時鐘說白了就是要把一秒分成很多份,但由于總線時鐘一般在數十兆,經過分頻的APB也在數十兆,所以要把APB再分頻至更低的頻率,這就需要設置預分頻寄存器。例如當前APB1為36MHz,除非APB1的時鐘分頻數設置為1,否則通用定時器TIMx的時鐘是APB1時鐘的2倍,這時的TIMx時鐘為72MHz,因此分頻至10KHz需要設置預分頻器寄存器TIMx_PSC(如下圖)為7199,為什么是7199而不是7200呢?
下面寄存器介紹說明了這點:計數器時鐘CK_CNT等于TIMx時鐘/(PSC+1),所以只需設置寄存器值7199就行了。
這里10KHz的頻率相當于把一秒分為10000份,即0.0001秒,定時器每隔0.0001秒漲一次。
注:因為PSC是16位寄存器,所以值范圍為0-65535。
計數器自動重裝載寄存器TIMx_ARR,該寄存器存放的就是計數器要增加的次數(計多少次溢出)。
注:因為ARR也是16位寄存器,所以值范圍為0-65535。
這樣這兩個寄存器決定了溢出時間,接著上面的例子,如果設置ARR寄存器值為5000,那就是說定時器每隔0.0001秒漲一次,總共漲5000次,這樣就是0.5秒溢出一次。
總結下來,定時器的溢出公式為:溢出時間(秒)= ((ARR+1)*(PSC+1))/ TIMx時鐘CK_INT(MHz)
定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器。
下面以定時器2~7的時鐘說明這個倍頻器的作用:當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;
當APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍。
假定AHB=36MHz,因為APB1允許的最大頻率為36MHz,所以APB1的預分頻系數可以取任意數值;
當預分頻系數=1時,APB1=36MHz,TIM2~7的時鐘頻率=36MHz(倍頻器不起作用);
當預分頻系數=2時,APB1=18MHz,在倍頻器的作用下,TIM2~7的時鐘頻率=36MHz。
有人會問,既然需要TIM2~7的時鐘頻率=36MHz,為什么不直接取APB1的預分頻系數=1?
答案是:APB1不但要為TIM2~7提供時鐘,而且還要為其它外設提供時鐘;
設置這個倍頻器可以在保證其它外設使用較低時鐘頻率時,TIM2~7仍能得到較高的時鐘頻率。
再舉個例子:當AHB=72MHz時,APB1的預分頻系數必須大于2,因為APB1的最大頻率只能為36MHz。
如果APB1的預分頻系數=2,則因為這個倍頻器,TIM2~7仍然能夠得到72MHz的時鐘頻率。能夠使用更高的時鐘頻率,無疑提高了定時器的分辨率,這也正是設計這個倍頻器的初衷。
二、TIM通用定時器配置步驟:
1.配置TIM時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
2.定時器基本配置
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM2); //復位TIM2定時器
TIM_TimeBaseStructure.TIM_Period = 5-1; // 2.5ms
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; // 分頻36000
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 時鐘分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 計數方向向上計數
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
TIM_Period設置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。
TIM_Prescaler設置了用來作為TIMx時鐘頻率除數的預分頻值。它的取值必須在0x0000和0xFFFF之間。
TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到,可不關心。
TIM_CounterMode選擇了計數器模式:
TIM_CounterMode_Up //TIM向上計數模式
TIM_CounterMode_Down //TIM向下計數模式
TIM_CounterMode_CenterAligned1 //TIM中央對齊模式1計數模式
TIM_CounterMode_CenterAligned2 //TIM中央對齊模式2計數模式
TIM_CounterMode_CenterAligned3 //TIM中央對齊模式3計數模式
單片機時鐘頻率72MHz,APB1 二分頻36MHz,故TIM2自動2倍頻至72MHz,故定時器中斷頻率為72000000/36000/5=400Hz
3.使能定時器中斷TIM_Cmd(TIM2, ENABLE);
4.配置NVIC。
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
5.寫中斷函數
void TIM2_IRQHandler(void)
{
......//中斷處理
}
---------------------
作者:LIUYONG19
來源:CSDN
原文:https://blog.csdn.net/LIUYONG19/article/details/75383854
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
上一篇:STM32 通用定時器的輸出PWM功能 學習筆記
下一篇:stm32 USART_IT_IDLE中斷 一幀數據
推薦閱讀
史海拾趣
FLIR公司成立于1978年,總部位于美國俄勒岡州波特蘭市。起初,公司專注于高性能、低成本機載應用紅外熱成像系統的研發與生產。在那個時代,紅外熱成像技術主要應用于軍事領域,成本高昂且難以普及。然而,FLIR憑借其技術創新,成功打破了這一局面,推出了性價比極高的機載紅外熱成像系統。這些系統能夠在完全漆黑的環境或惡劣天氣條件下,透過煙霧和陰霾等空氣污染物清晰成像,極大地提升了軍事偵察和夜間作戰的能力。這一突破不僅讓FLIR在軍事領域嶄露頭角,也為后續的商業應用奠定了堅實基礎。
在電子行業中,產品質量和客戶服務是企業生存和發展的關鍵。CCS公司始終堅持質量第一的原則,建立了嚴格的質量管理體系和客戶服務體系。公司從原材料采購到產品生產、銷售等各個環節都進行嚴格的質量控制,確保產品的質量和性能達到客戶的期望。同時,CCS公司還提供了全方位的客戶服務,包括售前咨詢、售后服務和技術支持等,為客戶提供了全方位的支持和幫助。
在2010年代初,隨著科技的飛速發展,電子行業正迎來新一輪的創新浪潮。這時,一群充滿激情和夢想的工程師在硅谷創立了Facon公司,他們懷揣著改變世界的愿景,立志在電子行業中留下自己的印記。初始階段,Facon主要專注于研發高性能的半導體芯片,為智能手機、平板電腦等電子產品提供強大的計算能力。通過不懈努力和持續創新,Facon逐漸在市場中樹立了良好的口碑。
在電子行業發展日新月異的背景下,ABECO始終保持著對技術創新的熱情。公司投入大量資源進行研發,推出了一系列具有創新性的產品,如智能剝線工具、高精度切割機等。這些產品不僅提高了生產效率,也降低了操作難度,贏得了客戶的廣泛好評。同時,ABECO還積極與高校和研究機構合作,引進新技術和人才,推動公司的技術創新不斷向前發展。
在電子行業發展日新月異的背景下,ABECO始終保持著對技術創新的熱情。公司投入大量資源進行研發,推出了一系列具有創新性的產品,如智能剝線工具、高精度切割機等。這些產品不僅提高了生產效率,也降低了操作難度,贏得了客戶的廣泛好評。同時,ABECO還積極與高校和研究機構合作,引進新技術和人才,推動公司的技術創新不斷向前發展。
在電子行業的早期,Bias Power公司憑借其創新的基于開關技術的低功率隔離式AC/DC電源設計,迅速在市場中脫穎而出。當時,傳統的電源設計方案效率低下,成本高昂,難以滿足市場的迫切需求。Bias Power公司憑借其專有設計,實現了電源的高效率、高密度和成本效益,贏得了眾多客戶的青睞。
隨著技術的不斷進步,Bias Power公司不斷推出新產品,滿足市場的多樣化需求。其偏置電源產品線日益豐富,包括提供低于5W功率的AC/DC電源模塊,這些模塊成為分立電源設計的理想替代方案,幫助設計工程師節省時間和金錢。
各位大蝦,小弟最近遇到一個關于cpu寄存器讀寫的問題,望不吝賜教 我在bootloader里面,對cpu里面的控制寄存器進行,但是無法寫成功。比如:*(UINT32 *)(CAP_Reg_Addr_Base+0x0008)=0x10000000;進行寫時,會死在這里。對其他的寄存器也是這樣。這 ...… 查看全部問答∨ |
|
我的平臺是S3C2410(ucos-ii)+MC35I,在UCOS上移植了LWIP1.3.1 ,但是我不知道該怎樣應用LWIP1.3.1里面給定的函數實現GPRS通信,有人有相關方面的代碼或者實例嗎?謝謝,急… 查看全部問答∨ |
我用的是WinCE5.0, HPC部分在explorerbase.rc增加自己的圖片 a. 如果是sysgen或build sysgen生成的image,執行LoadImage自己的圖片時,失敗,GetLastError()返回1814 b. 如果是sysgen或build sysgen HPC,然后再make run-time im ...… 查看全部問答∨ |
1.硬件工程師(急) 職位要求: 1.本科或以上學歷,通信,電子,計算機相關專業,1年以上硬件開發工作經驗。大專學歷,2年以上經驗; 2.熟悉嵌入式系統硬件開發,有32位嵌入式系統硬件電路設計經驗(熟練使用Protel、ORCAD等,能獨 ...… 查看全部問答∨ |
|
前邊,我講完了 51單片機 的 尋址方式 和 指令系統,以及幾個傳統8051都有的基本內部資源(所謂傳統8051,或者51單片機,在大多數情況下,請當它們是一回事。)現在我們來講一下,我們實際如何寫程序,因為只是舉例,而且篇幅關系,我們只寫一個很 ...… 查看全部問答∨ |
|
剛開始的工作時,有次去電子市場買東西,有個先生問我,會不會430,當時壓根就沒聽說過,因為只會51了,也沒在意。后來進了公司,正好遇到在做項目,基于PIC的,程序別人已經寫好了,只是要修改,我略懂一點,也就 ...… 查看全部問答∨ |
前期問了ADC的實驗問題,但一直沒得到解答,現在終于做出來了,分享給大家 實驗效果是:采樣電壓大于1.5v燈就亮,反之燈暗。。 注意:每次調整完滑動變阻器都要重新仿真 后期會改進,用1602或UART顯示電壓數字和實時采樣 [ 本帖最后由 shmily53 ...… 查看全部問答∨ |