解析stm32的时钟
?
STM32 時鐘系統??http://blog.chinaunix.net/uid-24219701-id-4081961.html
STM32的時鐘系統?*** ??http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/12/24/2831535.html ? ?
高速時鐘提供給芯片主體的主時鐘.低速時鐘只是提供給芯片中的RTC(實時時鐘)及獨立看門狗使用。內部時鐘是在芯片內部RC振蕩器產生的,起振較快,所以時鐘在芯片剛上電的時候,默認使用內部高速時鐘。而外部時鐘信號是由外部的晶振輸入的,在精度和穩定性上都有很大優勢,所以上電之后我們再通過軟件配置,轉而采用外部時鐘信號.
STM32有以下4個時鐘源:?
??? 高速外部時鐘(HSE):以外部晶振作時鐘源,晶振頻率可取范圍為4~16MHz,我們一般采用8MHz的晶振。?
??? 高速內部時鐘(HSI): 由內部RC振蕩器產生,頻率為8MHz,但不穩定。??
????低速外部時鐘(LSE):以外部晶振作時鐘源,主要提供給實時時鐘模塊,所以一般采用32.768KHz。?
??? 低速內部時鐘(LSI):由內部RC振蕩器產生,也主要提供給實時時鐘模塊,頻率大約為40KHz。
??? OSC_OUT和OSC_IN開始,這兩個引腳分別接到外部晶振8MHz,第一個分頻器PLLXTPRE,遇到開關PLLSRC(PLL entry clock source),我們可以選擇其輸出,輸出為外部高速時鐘(HSE)或是內部高速時鐘(HSI)。這里選擇輸出為HSE,接著遇到鎖相環PLL,具有倍頻作用,在這里我們可以輸入倍頻因子PLLMUL,要是想超頻,就得在這個寄存器上做手腳啦。經過PLL的時鐘稱為PLLCLK。倍頻因子我們設定為9倍頻,也就是說,經過PLL之后,我們的時鐘從原來8MHz的 HSE變為72MHz的PLLCLK。緊接著又遇到了一個開關SW,經過這個開關之后就是STM32的系統時鐘(SYSCLK)了。通過這個開關,可以切換SYSCLK的時鐘源,可以
選擇為HSI、PLLCLK、HSE。我們選擇為PLLCLK時鐘,所以SYSCLK就為72MHz了。PLLCLK在輸入到SW前,還流向了USB預分頻器,這個分頻器輸出為USB外設的時鐘(USBCLK)。回到SYSCLK,SYSCLK經過AHB預分頻器,分頻后再輸入到其它外設。如輸出到稱為HCLK、FCLK的時鐘,還直接輸出到SDIO外設的
SDIOCLK時鐘、存儲器控制器FSMC的FSMCCLK時鐘,和作為APB1、APB2的預分頻器的輸入端。GPIO外設是掛載在APB2總線上的, APB2的時鐘是APB2預分頻器的輸出,而APB2預分頻器的時鐘來源是AHB預分頻器。因此,把APB2預分頻器設置為不分頻,那么我們就可以得到GPIO外設的時鐘也等于HCLK,為72MHz了。
??????? SYSCLK:系統時鐘,STM32大部分器件的時鐘來源。主要由AHB預分頻器分配到各個部件。?
??????? HCLK:由AHB預分頻器直接輸出得到,它是高速總線AHB的時鐘信號,提供給存儲器,DMA及cortex內核,是cortex內核運行的時鐘,cpu主頻就是這個信號,它的大小與STM32運算速度,數據存取速度密切相關。?
??????? FCLK:同樣由AHB預分頻器輸出得到,是內核的“自由運行時鐘”?!白杂伞北憩F在它不來自時鐘 HCLK,因此在HCLK時鐘停止時 FCLK 也繼續運行。它的存在,可以保證在處理器休眠時,也能夠采樣和到中斷和跟蹤休眠事件 ,它與HCLK互相同步。
?????? PCLK1:外設時鐘,由APB1預分頻器輸出得到,最大頻率為36MHz,提供給掛載在APB1總線上的外設。?
?????? PCLK2:外設時鐘,由APB2預分頻器輸出得到,最大頻率可為72MHz,提供給掛載在APB2總線上的外設。
?
//1. 實測程序表述不正確的的延時函數++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// sys clk = 72Mhz, Fsys = 1/72Mhz // 1000循環里面主要是 cmp, bcc, add三條指令。1000循環完以后,有個位數條數的裝載Time值的指令,精度要求不高以及時間不參與累計時,誤差可以忽略不計。 // T_Delay_ms = 1000* 3 * Fsys = 3*1000/72 us = 3*14us = 42us // if(Time = 72000), delay = 3*1s; // 實測結果: 6s //推斷錯誤,差了兩倍 void Delay_ms(unsigned int Time) {unsigned int n;while(Time--)for(n=0;n<1000;n++); }// sys clk = 72Mhz, Fsys = 1/72Mhz // 主要是sub, bne兩條指令。 // T_Delay_us = 2 * Fsys = 2/72 us = 27ns // if(nTime = 36) delay = 1us // if(nTime = 200) delay = 400/72 us = 5.55us //推斷錯誤, 差了5倍 void Delay_us(unsigned int nTime) {while(nTime--); }Delay_ms(10); //840us Delay_ms實際的效果是84us Delay_ms(500);//42ms Delay_ms(1000);//84ms Delay_ms(10000);//840ms Delay_ms(72000);//6s Delay_us(1);// 625ns Delay_us(100);//13us Delay_us(200);//25.6us Delay_us(800);//100.4us Delay_us(1600);//200us Delay_us(3200);//400us//2. 通過ndelay()解析系統的時鐘++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void ndelay(void) {__asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP");__asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); __asm("NOP"); }//ndelay()實測 1us,說明系統時鐘: 36 * T_sys = 1us ; T_sys = 1/36 us; F_sys = 36Mhz, 這里和Delay_ms的推論有聯系。 //STM32有三級流水線,指令周期不定的,arm給出的是1.25MIPS/Mhz,一個平均執行速度, 就是1Mhz的頻率,每秒鐘可以執行1.25M指令 //HCLK:由AHB預分頻器直接輸出得到,它是高速總線AHB的時鐘信號,提供給存儲器,DMA及cortex內核,是cortex內核運行的時鐘,cpu主頻就是這個信號,它的大小與STM32運算速度,數據存取速度密切相關。 //根據代碼的注釋看, /* Select PLL as system clock source */ /* PLLCLK = 8MHz * 9 = 72 MHz */ /* HCLK = SYSCLK */ ,程序運行的時鐘應該是 72 MHz。?
轉載于:https://www.cnblogs.com/mylinux/p/5306154.html
總結
以上是生活随笔為你收集整理的解析stm32的时钟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dataframe常用操作_Pandas
- 下一篇: ssm三个框架分别用来干什么_SSM三大