STM32F10x之RCC
1 綜述
1.1 時鐘源
在STM32中,一共有5個時鐘源,分別是HSI、HSE、LSI、LSE、PLL。
- HSI:高速內部時鐘源,RC振蕩器,頻率為8MHz。
- HSE:高速外部時鐘源,可接石英/陶瓷諧振器或外部時鐘,頻率范圍為4~16MHz。
- LSI:低速內部時鐘源,RC振蕩器,頻率為40KHz。
- LSE:低速外部時鐘源,接頻率為32.768KHz的石英晶體。
- PLL:鎖相環倍頻輸出,嚴格來說它不是獨立時鐘源,需要外接時鐘源,輸入可接HSI/2,HSE或是HSE/2。PLL倍頻范圍為x2~x16,但最大輸出頻率不能超過72MHz。
其中,LSI供獨立看門狗IWDG使用,也可以被選為實時時鐘源,不過,實時時鐘源還可以選擇LSE或者是HSE的128分配。在STM32中,全速功能的USB模塊,其串行接口引擎需要一個48MHz的時鐘源,該時鐘源只能從PLL端獲取,可選擇分頻1分頻或1.5分頻,若使用USB模塊則必須先使能PLL并且時鐘配置為72MHz或48MHz。
此外,在STM32中,可以選擇一個時鐘信號從MCO(PA8)腳輸出,可以選擇時鐘源為PLL輸出的2分頻、HSI、HSE或系統時鐘。
系統時鐘SYSCLK,他提供STM32中絕大部分不見的工作時鐘,系統時鐘可以選擇PLL輸出、HSE和HSI、系統時鐘最大頻率為72MHz,通過AHB分配器分頻后送給各個模塊使用,AHB分配器可選1、2、4、8、·6、64、128、256、512分頻,AHB分配器輸出時鐘可以供5大模塊使用:
- 送給AHB總線、內核、內存和DMA使用的HCLK時鐘。
- 通過8分頻后送個Cortex的系統定時器時鐘STCLK。
- 直接送給Cortex的空閑運行時鐘FCLK。
- 送個低速外設總線APB1分配器,APB1分配器可以選擇1、2、4、8和16分頻,其輸出一路供APB1外設使用(PCLK1,最大頻率36MHz);另一路送個定時器(TIM2~TIM7)倍頻器使用,該定時器倍頻器根據APB1分頻值自動選擇x1或x2倍頻(APB1分頻值為1時,定時器倍頻器為1倍頻,APB1分頻值為其它值時,定時器倍頻器采用2倍頻)。
- 送給高速外設總線APB2分頻器,APB2分配器可選擇1、2、4、8和16分頻,其輸出一路供APB2外設使用(PLCK2,最大頻率為72MHz);一路送給定時器(TIM1&TIM8)使用,該定時器倍頻器根據APB2分頻值自動選擇x1或x2倍頻(APB2分頻值為1時,定時器倍頻器為1倍頻,APB2分頻值為其它值時,定時器倍頻器采用2倍頻);此外,APB2分配器輸出還有一路供給ADC分配器使用,ADC分配器分頻后供ADC模塊使用,ADC分頻可選2、4、6和8分頻,不過ADC模塊最大輸入時鐘不錯過14MHz。
1.2 時鐘樹
2. 時鐘源2.1 HSE時鐘
高速外部時鐘信號(HSE)可以有以下兩種時鐘源產生:
- HSE外部晶體/陶瓷諧振器
- HSE用戶外部時鐘
為了減少時鐘輸出的失真和縮短啟動穩定時間,晶體/陶瓷諧振器和負載電容器必須盡可能地靠近振蕩器引腳,負載電容值必須根據所選擇的振蕩器來調整。
外部時鐘源(HSE旁路)
在這個模式里,必須提供外部時鐘,它的頻率最高可達25MHz,用戶可通過設置在時鐘控制寄存器中的HSEBYP和HSEON位來選擇這一模式。外部時鐘信號(50%占空比的方波、正弦波或三角波)必須連到SOC_IN引腳,同時保證OSC_OUT引腳懸空,見圖2)。
外部晶體/陶瓷諧振器(HSE晶體)
4~16Mz外部振蕩器可為系統提供更為精確的主時鐘,相關的硬件配置可參考圖1,進一步信息可參考數據手冊的電氣特性部分。在時鐘控制寄存器RCC_CR中的HSERDY位用來指示高速外部振蕩器是否穩定,在啟動時,直到這一位被硬件置’1’,時鐘才被釋放出來。如果在時鐘中斷寄存器RCC_CIR中允許產生中斷,將會產生相應中斷,HSE晶體可以通過設置時鐘控制寄存器里RCC_CR中的HSEON位被啟動和關閉。
2.2 HSI時鐘
HSI時鐘信號由內部8MHz的RC振蕩器產生,可直接作為系統時鐘或在2分頻后作為PLL輸入。HSI RC振蕩器能夠在不需要任何外部器件的條件下提供系統時鐘,它的啟動時間比HSE晶體振蕩器短,然而,即使在校準之后它的時鐘頻率精度仍較差。
校準:制造工藝決定了不同芯片的RC振蕩器頻率會不同,這就是為什么每個芯片的HSI時鐘頻率在出廠前已經被ST校準到1%(25°C)的原因。系統復位時,工廠校準值被裝載到時鐘控制寄存器的HSICAL[7:0]位,如果用戶的應用基于不同的電壓或環境溫度,這將會影響RC振蕩器的精度,這時用戶可以通過時鐘控制寄存器里的HSITRIM[4:0]位來調整HSI頻率,時鐘控制寄存器中的HSIRDY位用來指示HSI RC振蕩器是否穩定,在時鐘啟動過程中,直到這一位被硬件置’1’, HSI RC輸出時鐘才被釋放。 HSI RC可由時鐘控制寄存器中的HSION位來啟動和關閉。如果HSE晶體振蕩器失效, HSI時鐘會被作為備用時鐘源。
2.3 PLL時鐘
內部PLL可以用來倍頻HSI RC的輸出時鐘或HSE晶體輸出時鐘。PLL的設置(選擇HSI振蕩器除2或HSE振蕩器為PLL的輸入時鐘、配置倍頻因子)必須在其被激活前完成,一旦PLL被激活,這些參數就不能被修改。如果PLL中斷在時鐘中斷寄存器里被允許,當PLL準備就緒時,可產生中斷申請。如果需要在應用中使用USB接口, PLL必須被設置為輸出48或72MHZ時鐘,用于提供48MHz的USBCLK時鐘。
2.4 LSE時鐘
LSE晶體是一個32.768kHz的低速外部晶體或陶瓷諧振器,它為實時時鐘或者其他定時功能提供一個低功耗且精確的時鐘源。LSE晶體通過在備份域控制寄存器(RCC_BDCR)里的LSEON位啟動和關閉,在備份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶體振蕩是否穩定,在啟動階段,直到這個位被硬件置’1’后, LSE時鐘信號才被釋放出來。如果在時鐘中斷寄存器里被允許,可產生中斷申請。
外部時鐘源(LSE旁路)
在這個模式里必須提供一個32.768kHz頻率的外部時鐘源。你可以通過設置在備份域控制寄存器(RCC_BDCR)里的LSEBYP和LSEON位來選擇這個模式。具有50%占空比的外部時鐘信號(方波、正弦波或三角波)必須連到OSC32_IN引腳,同時保證OSC32_OUT引腳懸空,見圖1。
2.5 LSI時鐘
LSI RC擔當一個低功耗時鐘源的角色,它可以在停機和待機模式下保持運行,為獨立看門狗和自動喚醒單元提供時鐘。 LSI時鐘頻率大約40kHz(在30kHz和60kHz之間)。LSI RC可以通過控制/狀態寄存器(RCC_CSR)里的LSION位來啟動或關閉,在控制/狀態寄存器(RCC_CSR)里的LSIRDY位指示低速內部振蕩器是否穩定,在啟動階段,直到這個位被硬件設置為’1’后,此時鐘才被釋放。如果在時鐘中斷寄存器(RCC_CIR)里被允許,將產生LSI中斷申請。
LSI校準
可以通過校準內部低速振蕩器LSI來補償其頻率偏移,從而獲得精度可接受的RTC時間基數,以及獨立看門狗(IWDG)的超時時間(當這些外設以LSI為時鐘源)。校準可以通過使用TIM5的輸入時鐘(TIM5_CLK)測量LSI時鐘頻率實現,測量以HSE的精度為保證,軟件可以通過調整RTC的20位預分頻器來獲得精確的RTC時鐘基數,以及通過計算得到精確的獨立看門狗(IWDG)的超時時間。
LSI校準步驟如下:
1.打開TIM5,設置通道4為輸入捕獲模式;
2.設置AFIO_MAPR的TIM5_CH4_IREMAP位為’1’,在內部把LSI連接到TIM5的通道4;
3.通過TIM5的捕獲/比較4事件或者中斷來測量LSI時鐘頻率;
4.根據測量結果和期望的RTC時間基數和獨立看門狗的超時時間,設置20位預分頻器。
2.6 系統時鐘
系統復位后, HSI振蕩器被選為系統時鐘,當時鐘源被直接或通過PLL間接作為系統時鐘時,它將不能被停止,只有當目標時鐘源準備就緒了(經過啟動穩定階段的延遲或PLL穩定),從一個時鐘源到另一個時鐘源的切換才會發生,在被選擇時鐘源沒有就緒時,系統時鐘的切換不會發生,直至目標時鐘源就緒,才發生切換。在時鐘控制寄存器(RCC_CR)里的狀態位指示哪個時鐘已經準備好了,哪個時鐘目前被用作系統時鐘。
2.7 RTC時鐘
通 過 設 置 備 份 域 控 制 寄 存 器 (RCC_BDCR) 里 的 RTCSEL[1:0] 位 , RTCCLK 時 鐘 源 可 以 由HSE/128、 LSE或LSI時鐘提供,除非備份域復位,此選擇不能被改變,LSE時鐘在備份域里,但HSE和LSI時鐘不是,因此:
- 如果LSE被選為RTC時鐘:只要VBAT維持供電,盡管VDD供電被切斷, RTC仍繼續工作。
- 如果LSI被選為自動喚醒單元(AWU)時鐘:如果VDD供電被切斷, AWU狀態不能被保證。
- 如果HSE時鐘128分頻后作為RTC時鐘:如果VDD供電被切斷或內部電壓調壓器被關閉(1.8V域的供電被切斷),則RTC狀態不確定。必須設置電源控制寄存器(PWR_CR)的DPB位為’1’(取消后備區域的寫保護)。
2.8 看門狗時鐘
如果獨立看門狗已經由硬件選擇或軟件啟動, LSI振蕩器將被強制在打開狀態,并且不能被關閉,在LSI振蕩器穩定后,時鐘供應給IWDG。
2.9 時鐘輸出
STM32允許輸出時鐘信號到外部MCO引腳,不過相應的GPIO端口寄存器必須被配置為相應功能。以下8個時鐘信號可被選作MCO時鐘:
- SYSCLK
- HSI
- HSE
- 除2的PLL時鐘
- PLL2時鐘
- PLL3時鐘除以2
- XT1外部3~25MHz振蕩器(用于以太網)
- PLL3時鐘(用于以太網)在MCO上輸出的時鐘必須小于50MHz(這是I/O端口的最大速度)。
時鐘的選擇由時鐘配置寄存器(RCC_CFGR)中的MCO[3:0]位控制。
3 外設時鐘系統
以下介紹不同總線上掛載各種外設,不同的芯片系列可能缺少某些外設,用戶應根據自己的芯片型號確定。
1.AHB總線外設:DMA1、DMA2、SRAM、FLASH、CRC、FSMC、SDIO、OTG(互聯型設備)、ETH(互聯型設備)。
2.APB1(低速外設總線):TIM2~TIM7、TIM12~TIM14、WWDG、SPI2~SPI3、USART2~USART3、UART4~UART5、I2C1~I2C2、USB、CAN1~CAN2、BKP、DAC、CEC。
3.APB2(高速外設總線):AFIO、GPIOA~GPIOG、ADC1~ADC2、TIM1、TIM8、SPI1、USART1、ADC3、TIM15~TIM17、TIM9~TIM11。
4 RCC庫函數
4.1 時鐘頻率
typedef struct {uint32_t SYSCLK_Frequency; /*!< 系統時鐘頻率,單位:Hz */uint32_t HCLK_Frequency; /*!< AHB總線時鐘頻率,單位:Hz */uint32_t PCLK1_Frequency; /*!< APB1總線時鐘頻率,單位:Hz */uint32_t PCLK2_Frequency; /*!< APB2總線時鐘頻率,單位:Hz */uint32_t ADCCLK_Frequency; /*!< ADC模塊輸入時鐘頻率,單位:Hz */ }RCC_ClocksTypeDef;4.2 RCC庫函數
RCC庫函數原型及實現請詳見stm32f10x_rcc模塊,以下僅介紹各接口的作用。
| RCC_DeInit | 將外設RCC寄存器重設為缺省值 |
| RCC_HSEConfig | 設置外部高速晶振( HSE) |
| RCC_WaitForHSEStartUp | 等待 HSE 起振 |
| RCC_AdjustHSICalibrationValue | 調整內部高速晶振( HSI)校準值 |
| RCC_HSICmd | 使能或者失能內部高速晶振( HSI) |
| RCC_PLLConfig | 設置 PLL 時鐘源及倍頻系數 |
| RCC_PLLCmd | 使能或者失能 |
| PLLRCC_SYSCLKConfig | 設置系統時鐘( SYSCLK) |
| RCC_GetSYSCLKSource | 返回用作系統時鐘的時鐘源 |
| RCC_HCLKConfig | 設置 AHB 時鐘( HCLK) |
| RCC_PCLK1Config | 設置低速 AHB 時鐘( PCLK1) |
| RCC_PCLK2Config | 設置高速 AHB 時鐘( PCLK2) |
| RCC_ITConfig | 使能或者失能指定的 RCC 中斷 |
| RCC_USBCLKConfig | 設置 USB 時鐘( USBCLK) |
| RCC_ADCCLKConfig | 設置 ADC 時鐘( ADCCLK) |
| RCC_LSEConfig | 設置外部低速晶振( LSE) |
| RCC_LSICmd | 使能或者失能內部低速晶振( LSI) |
| RCC_RTCCLKConfig | 設置 RTC 時鐘( RTCCLK) |
| RCC_RTCCLKCmd | 使能或者失能 RTC 時鐘 |
| RCC_GetClocksFreq | 返回不同片上時鐘的頻率 |
| RCC_AHBPeriphClockCmd | 使能或者失能 AHB 外設時鐘 |
| RCC_APB2PeriphClockCmd | 使能或者失能 APB2 外設時鐘 |
| RCC_APB1PeriphClockCmd | 使能或者失能 APB1 外設時鐘 |
| RCC_APB2PeriphResetCmd | 強制或者釋放高速 APB( APB2)外設復位 |
| RCC_APB1PeriphResetCmd | 強制或者釋放低速 APB( APB1)外設復位 |
| RCC_BackupResetCmd | 強制或者釋放后備域復位 |
| RCC_ClockSecuritySystemCmd | 使能或者失能時鐘安全系統 |
| RCC_MCOConfig | 選擇在 MCO 管腳上輸出的時鐘源 |
| RCC_GetFlagStatus | 檢查指定的 RCC 標志位設置與否 |
| RCC_ClearFlag | 清除 RCC 的復位標志位 |
| RCC_GetITStatus | 檢查指定的 RCC 中斷發生與否 |
| RCC_ClearITPendingBit | 清除 RCC 的中斷待處理位 |
5 時鐘系統初始化
假設采用外部提供晶振(HSE)頻率為8MHz,PLLCLK=SYSCLK=72MHz,PCLK2=72MHz,PCLK1=36MHz,則時鐘系統初始化代碼如下:
void RCC_config() { ErrorStatus HSEStartUpStatus; // 定義錯誤狀態變量/* 時鐘系統初始化 */RCC_DeInit();//將RCC寄存器重新設置為默認值RCC_HSEConfig(RCC_HSE_ON); //打開外部高速時鐘晶振HSEStartUpStatus = RCC_WaitForHSEStartUp();// 等待外部高速時鐘晶振工作if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1);//設置AHB不分頻,HCLK=SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1);//設置APB2不分頻,P2CLK=HCLKRCC_PCLK1Config(RCC_HCLK_Div2); //設置APB1 為2分頻,P1CLK=HCLK/2FLASH_SetLatency(FLASH_Latency_2);//設置FLASH代碼延時FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能預取指緩存RCC_PLLConfig(RCC_PLLSource_HSE_Div1, //設置PLL時鐘源,RCC_PLLMul_9);//外部時鐘不分頻,為HSE的9倍頻8MHz * 9 = 72MHzRCC_PLLCmd(ENABLE);//使能PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL準備就緒{RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//設置PLL為系統時鐘源while(RCC_GetSYSCLKSource() != 0x08)//判斷PLL是否是系統時鐘{} }}/* 以下示例部分外設時鐘初始化 *//* 使能DMA1時鐘*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/* 使能CAN1時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);/* 使能GPIOD時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); } 轉自 http://www.jianshu.com/p/52c12be9e18b總結
以上是生活随笔為你收集整理的STM32F10x之RCC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考中级——软件工程基础概念总结
- 下一篇: STM32F2系列系统时钟默认配置