STM32之時鐘頻率和定時器時鐘講解

2020-12-25 電子產品世界
********************************

本學習筆記基於STM32固件庫V3.0
使用晶片型號:STM32F103
開發環境:MDK
********************************

本文引用地址:http://www.eepw.com.cn/article/201611/316490.htm

第一課 時鐘頻率

STM32F103內部8M的內部震蕩,經過倍頻後最高可以達到72M。目前TI的M3系列晶片最高頻率可以達到80M。

在stm32固件庫3.0中對時鐘頻率的選擇進行了大大的簡化,原先的一大堆操作都在後臺進行。系統給出的函數為SystemInit()。但在調用前還需要進行一些宏定義的設置,具體的設置在system_stm32f10x.c文件中。

文件開頭就有一個這樣的定義:
//#define SYSCLK_FREQ_HSEHSE_Value
//#define SYSCLK_FREQ_20MHz 20000000
//#define SYSCLK_FREQ_36MHz 36000000
//#define SYSCLK_FREQ_48MHz 48000000
//#define SYSCLK_FREQ_56MHz 56000000
#define SYSCLK_FREQ_72MHz 72000000

ST 官方推薦的外接晶振是 8M,所以庫函數的設置都是假定你的硬體已經接了 8M 晶振來運算的.以上東西就是默認晶振 8M 的時候,推薦的 CPU 頻率選擇.在這裡選擇了:
#define SYSCLK_FREQ_72MHz 72000000
也就是103系列能跑到的最大值72M

然後這個 C文件繼續往下看
#elif defined SYSCLK_FREQ_72MHz
const uint32_t SystemFrequency= SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2);
const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz;

這就是在定義了CPU跑72M的時候,各個系統的速度了.他們分別是:硬體頻率,系統時鐘,AHB總線頻率,APB1總線頻率,APB2總線頻率.再往下看,看到這個了:
#elif defined SYSCLK_FREQ_72MHz
static void SetSysClockTo72(void);

這就是定義 72M 的時候,設置時鐘的函數.這個函數被 SetSysClock ()函數調用,而
SetSysClock ()函數則是被 SystemInit()函數調用.最後 SystemInit()函數,就是被你調用的了

所以設置系統時鐘的流程就是:
首先用戶程序調用 SystemInit()函數,這是一個庫函數,然後 SystemInit()函數裡面,進行了一些寄存器必要的初始化後,就調用 SetSysClock()函數. SetSysClock()函數根據那個#define SYSCLK_FREQ_72MHz 72000000 的宏定義,知道了要調用SetSysClockTo72()這個函數,於是,就一堆麻煩而複雜的設置~!@#$%^然後,CPU跑起來了,而且速度是 72M. 雖然說的有點累贅,但大家只需要知道,用戶要設置頻率,程序中就做的就兩個事情:
第一個: system_stm32f10x.c 中 #define SYSCLK_FREQ_72MHz 72000000
第二個:調用SystemInit()

STM32中定時器的時鐘源

STM32中有多達8個定時器,其中TIM1和TIM8是能夠產生三對PWM互補輸出的高級定時器,常用於三相電機的驅動,它們的時鐘由APB2的輸出產生。其它6個為普通定時器,時鐘由APB1的輸出產生。

下圖是STM32參考手冊上時鐘分配圖中,有關定時器時鐘部分的截圖:

從圖中可以看出,定時器的時鐘不是直接來自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的時鐘頻率。能夠使用更高的時鐘頻率,無疑提高了定時器的解析度,這也正是設計這個倍頻器的初衷。

相關焦點

  • STM32通用定時器(時鐘選擇,模式選擇)
    還有兩種模式控制功能:從模式控制和主模式控制。一、 框圖讓我們看下手冊,一開始是定時器的框圖,這裡面幾乎包含了所有定時器的信息,您要是能看明白,那麼接下來就不用再看別的了…為了方便的看圖,我對裡面出現的名詞和符號做個註解:TIMx_ETR:TIMER外部觸發引腳 ETR:外部觸發輸入ETRP:分頻後的外部觸發輸入 ETRF:濾波後的外部觸發輸入
  • 系統時鐘和定時器——PWM定時器
    時鐘控制邏輯給整個晶片提供3種時鐘:FCLK用於CPU核;HCLK用於AHB總線設備,比如CPU核、存儲器控制器、中斷控制器、DMA和USB主機模塊等;PCLK用於APB總線上的設備,比如WATCHDOG、IIS、IIC、PWM、MMC、ADC、RTC等等。
  • stm32定時器時間計算
    STM32定時器的工作原理   STM32之所以能夠實現定時,是單片機內部在計數脈衝(來自晶振)   T=1/F (F為頻率)   例如:我們以51單片機舉例,假設單片機搭配12MHz的晶振,由於51單片機是12分頻(即1個機器周期有12個時鐘周期),則單片機的最小定時時間為
  • STM32的時鐘學習
    ②、HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率範圍為4MHz~16MHz。③、LSI是低速內部時鐘,RC振蕩器,頻率為40kHz。④、LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。⑤、PLL為鎖相環倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。
  • STM32單片機的定時器和ADC的應用方法介紹
    主要的幾個函數 //tim_num=0對應 定時器2,tim_num=1對應 定時器3;tim_us:定時器uS數 void stm32_timer_start(uint16_t tim_num,uint16_t tim_us) {
  • stm32的定時器輸入捕獲與輸出比較
    明確一點對比AD的構造,stm32有3個AD,每個AD有很多通道,使用哪個通道就配置成哪個通道,這裡定時器也如此,有很多定時器TIMx,每個定時器有很多CHx(通道),可以配置為輸入捕捉-------測量頻率用,也可以配置為輸出比較----
  • stm32通用定時器用做外部脈衝計數器的例程
    最近幾天要用到stm32對外部輸入脈衝進行計數,很自然想到定時器,可是手上資料沒有講解stm32定時器如何用作外部計數器的,在網上找例程,也沒找到幾個正確的,自己硬著頭皮仔細研究參考手冊,終於知道如何配置了,並寫了一個例程,希望將來對一些網友有用。
  • stm32_timer基本定時器配置及實現燈閃爍
    STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。TIM1和TIM8是能夠產生3對PWM互補輸出的高級登時其,常用於三相電機的驅動,時鐘由APB2的輸出產生;TIM2-TIM5是普通定時器;TIM6和TIM7是基本定時器,其時鐘由APB1輸出產生;本文引用地址:http://www.eepw.com.cn/article/201611/317027.htm本實驗要實現的功能是:用普通定時器TIM2每一秒發生一次更新事件
  • 基於51單片機定時器的電子時鐘設計方案
    單片機定時器在目前的產品研發和設計過程中,其主要作用是進行精準的時間定值,因此在對時間控制要求較高的數控領域中,單片機定時器的身影隨處可見。
  • STM32的SysTick時鐘源來自哪裡?
    關注+星標公眾號,不錯過精彩內容作者
  • 時鐘晶體振蕩器作用是什麼 時鐘晶體振蕩器種類
    時鐘振蕩電路 時鐘振蕩簡單點說就是一個頻率產生電路,很多晶片都是以某種時序來運行的,這就需要有一個電路為時序提供基準,來協調晶片內各個部件有序運行。簡單點阻容震蕩就可以作為一個時鐘電路,需要精準頻率的話需要使用晶振作為基準源。 時鐘IC晶片 他主要起著放大頻率和縮小頻率的作用,他和晶振組合後才能在主板上起作用。
  • 可提高實時時鐘長期計時準確度時鐘程序算法
    1 引起計時誤差的因數  一個常規電子計時器的計時準確度,取決於晶振標稱頻率(fs)與實際頻率(fo)的頻率偏差和晶振頻率的時漂、溫漂等離散參數。普通晶振的實際頻率與標稱頻率有較大的偏差,可達萬分之五(5‰),折算到一天計時誤差就是43.2s。
  • stm32定時器觸發adc
    stm32的ADC特點   STM32的ADC有單次轉換和連續轉換2種模式,這兩種模式又可以選擇是否結合掃描模式。 如何使stm32定時器觸發adc      STM32 ADC的常規通道可以由以上圖6個信號觸發任何一個,我們以使用TIM2_CH2觸發ADC1,獨立模式
  • STM32時鐘選擇
    系統時鐘的選擇是在啟動時進行,復位時內部8MHz的RC振蕩器被選為默認的CPU時鐘,隨後可以選擇外部的、具失效監控的4~16MHz時鐘;當外部時鐘失效時,它將被隔離,同時會產生相應的中斷。
  • STM32定時器時間的計算方法
    STM32定時器定時時長計算公式 T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK 其中,TIMxCLK是其時鐘頻率,若是晶振為8MHz的,一般為72MHz
  • msp430系統時鐘詳解
    :   問題的提出:   1、高頻、以便能對系統硬體請求和事件作出快速響應   2、低頻率,以便將電流消耗降制至最少   3、穩定的頻率,以滿足定時器的應用。   4、低 Q值振蕩器,以保證開始或停止操作沒有延時   MSP430 採用了一個折衷的辦法:就是用一個低頻晶鎮振,將其倍頻在高頻的工作頻率上。一般採用這種技術的實用方法有兩種,一個是說、鎖相環、 一個是鎖頻環,而鎖相環採用模擬的控制容易引起「失鎖」和易引起電容量的改變。而TI 採用的是鎖頻環技術,它採用數字控制器DCO和頻率積分來產 生高頻的運行時鐘頻率。
  • NEC V850 之 系統時鐘及內部設備時鐘
    下圖是系統時鐘的框圖:(紅色的圈裡就是不理解的地方,不知道在哪個地方設置)本文引用地址:http://www.eepw.com.cn/article/201612/325099.htm下面我會把代碼和示波器測量的截圖發出來。
  • 一文搞定時鐘相關的概念(時鐘頻率、波特率、分頻因子、預分頻因子、倍頻)
    今天給小夥伴們整理了時鐘相關的概念,你理清了時鐘頻率、波特率、分頻因子、預分頻因子、倍頻之間的關係了嗎,希望對小夥伴們有所幫助哈,閱讀過程中如果有什麼問題,可以後臺留言哈,!    時鐘分為內部時鐘和外部時鐘,即提供時鐘的源是片上還是片外的問題。     晶振即為外部時鐘,晶片可以做內部時鐘,但一般不如內部時鐘穩定可靠。     時鐘振蕩的快慢頻次即為此時鐘的時鐘頻率,它就相當類似人的心臟,是一種計時基準,有了此基準,通過分頻等方式就可適配不同的外設。
  • 床長人工智慧教程免費分享——FreeRTOS的基礎時鐘
    提示在使用時,強烈建議將的基礎時鐘設置為非定時器。在前面的示例中,我們都是將的基礎時鐘設置為定時器,但並未詳細說明這麼做的原因。在前一節已經介紹了基礎時鐘的作用,以及使用定時器或定時器作為基礎時鐘時的工作原理。
  • 實時時鐘計時精度提高方案
    雖然非常適合電池供電應用的低功耗需求,但是在-40 ℃至+85 ℃的工業溫度範圍內,頻率變化很大。在極端溫度條件下,頻率誤差可能在-108 ppm至-177 ppm之間,如圖圖1所示。最終時鐘可能每天慢10秒至16秒。  因晶體內在特性而產生的頻率誤差曲線為拋物線,實時時鐘計時精度只能與其參考時鐘(晶體)相同。