1 綜述
1.1 時鐘源
在STM32中症杏,一共有5個時鐘源厉颤,分別是HSI喧伞、HSE、LSI翁逞、LSE溉仑、PLL浊竟。
- HSI:高速內(nèi)部時鐘源,RC振蕩器必怜,頻率為8MHz后频。
- HSE:高速外部時鐘源暖途,可接石英/陶瓷諧振器或外部時鐘驻售,頻率范圍為4~16MHz更米。
- LSI:低速內(nèi)部時鐘源,RC振蕩器迟几,頻率為40KHz眶痰。
- LSE:低速外部時鐘源竖伯,接頻率為32.768KHz的石英晶體因宇。
- PLL:鎖相環(huán)倍頻輸出察滑,嚴格來說它不是獨立時鐘源,需要外接時鐘源户盯,輸入可接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或系統(tǒng)時鐘扁达。
系統(tǒng)時鐘SYSCLK罩驻,他提供STM32中絕大部分不見的工作時鐘,系統(tǒng)時鐘可以選擇PLL輸出砾跃、HSE和HSI节吮、系統(tǒng)時鐘最大頻率為72MHz透绩,通過AHB分配器分頻后送給各個模塊使用壁熄,AHB分配器可選1草丧、2莹桅、4、8懂拾、·6铐达、64瓮孙、128、256栗涂、512分頻祈争,AHB分配器輸出時鐘可以供5大模塊使用:
- 送給AHB總線菩混、內(nèi)核扁藕、內(nèi)存和DMA使用的HCLK時鐘亿柑。
- 通過8分頻后送個Cortex的系統(tǒng)定時器時鐘STCLK。
- 直接送給Cortex的空閑運行時鐘FCLK疟游。
- 送個低速外設總線APB1分配器颁虐,APB1分配器可以選擇1卧须、2儒陨、4蹦漠、8和16分頻车海,其輸出一路供APB1外設使用(PCLK1容劳,最大頻率36MHz);另一路送個定時器(TIM2~TIM7)倍頻器使用蚜印,該定時器倍頻器根據(jù)APB1分頻值自動選擇x1或x2倍頻(APB1分頻值為1時留量,定時器倍頻器為1倍頻楼熄,APB1分頻值為其它值時,定時器倍頻器采用2倍頻)错敢。
- 送給高速外設總線APB2分頻器稚茅,APB2分配器可選擇1平斩、2绘面、4、8和16分頻晚凿,其輸出一路供APB2外設使用(PLCK2塘辅,最大頻率為72MHz)扣墩;一路送給定時器(TIM1&TIM8)使用扛吞,該定時器倍頻器根據(jù)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)可以有以下兩種時鐘源產(chǎn)生:
- HSE外部晶體/陶瓷諧振器
- HSE用戶外部時鐘
為了減少時鐘輸出的失真和縮短啟動穩(wěn)定時間,晶體/陶瓷諧振器和負載電容器必須盡可能地靠近振蕩器引腳蝎土,負載電容值必須根據(jù)所選擇的振蕩器來調(diào)整誊涯。
外部時鐘源(HSE旁路)
在這個模式里暴构,必須提供外部時鐘段磨,它的頻率最高可達25MHz苹支,用戶可通過設置在時鐘控制寄存器中的HSEBYP和HSEON位來選擇這一模式债蜜。外部時鐘信號(50%占空比的方波究反、正弦波或三角波)必須連到SOC_IN引腳精耐,同時保證OSC_OUT引腳懸空,見圖2)唐含。
外部晶體/陶瓷諧振器(HSE晶體)
4~16Mz外部振蕩器可為系統(tǒng)提供更為精確的主時鐘捷枯,相關的硬件配置可參考圖1专执,進一步信息可參考數(shù)據(jù)手冊的電氣特性部分本股。在時鐘控制寄存器RCC_CR中的HSERDY位用來指示高速外部振蕩器是否穩(wěn)定,在啟動時苟径,直到這一位被硬件置’1’棘街,時鐘才被釋放出來承边。如果在時鐘中斷寄存器RCC_CIR中允許產(chǎn)生中斷博助,將會產(chǎn)生相應中斷,HSE晶體可以通過設置時鐘控制寄存器里RCC_CR中的HSEON位被啟動和關閉蛔糯。
2.2 HSI時鐘
HSI時鐘信號由內(nèi)部8MHz的RC振蕩器產(chǎn)生渤闷,可直接作為系統(tǒng)時鐘或在2分頻后作為PLL輸入。HSI RC振蕩器能夠在不需要任何外部器件的條件下提供系統(tǒng)時鐘狼电,它的啟動時間比HSE晶體振蕩器短肩碟,然而凸椿,即使在校準之后它的時鐘頻率精度仍較差脑漫。
校準:制造工藝決定了不同芯片的RC振蕩器頻率會不同,這就是為什么每個芯片的HSI時鐘頻率在出廠前已經(jīng)被ST校準到1%(25°C)的原因吨拍。系統(tǒng)復位時羹饰,工廠校準值被裝載到時鐘控制寄存器的HSICAL[7:0]位碳却,如果用戶的應用基于不同的電壓或環(huán)境溫度昼浦,這將會影響RC振蕩器的精度座柱,這時用戶可以通過時鐘控制寄存器里的HSITRIM[4:0]位來調(diào)整HSI頻率,時鐘控制寄存器中的HSIRDY位用來指示HSI RC振蕩器是否穩(wěn)定,在時鐘啟動過程中火诸,直到這一位被硬件置’1’置蜀, HSI RC輸出時鐘才被釋放。 HSI RC可由時鐘控制寄存器中的HSION位來啟動和關閉馋吗。如果HSE晶體振蕩器失效宏粤, HSI時鐘會被作為備用時鐘源灼卢。
2.3 PLL時鐘
內(nèi)部PLL可以用來倍頻HSI RC的輸出時鐘或HSE晶體輸出時鐘鞋真。PLL的設置(選擇HSI振蕩器除2或HSE振蕩器為PLL的輸入時鐘涩咖、配置倍頻因子)必須在其被激活前完成,一旦PLL被激活特幔,這些參數(shù)就不能被修改敬辣。如果PLL中斷在時鐘中斷寄存器里被允許溉跃,當PLL準備就緒時告抄,可產(chǎn)生中斷申請打洼。如果需要在應用中使用USB接口募疮, PLL必須被設置為輸出48或72MHZ時鐘,用于提供48MHz的USBCLK時鐘他嚷。
2.4 LSE時鐘
LSE晶體是一個32.768kHz的低速外部晶體或陶瓷諧振器筋蓖,它為實時時鐘或者其他定時功能提供一個低功耗且精確的時鐘源。LSE晶體通過在備份域控制寄存器(RCC_BDCR)里的LSEON位啟動和關閉蚣抗,在備份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶體振蕩是否穩(wěn)定翰铡,在啟動階段两蟀,直到這個位被硬件置’1’后赂毯, LSE時鐘信號才被釋放出來拣宰。如果在時鐘中斷寄存器里被允許,可產(chǎn)生中斷申請巡社。
外部時鐘源(LSE旁路)
在這個模式里必須提供一個32.768kHz頻率的外部時鐘源膛堤。你可以通過設置在備份域控制寄存器(RCC_BDCR)里的LSEBYP和LSEON位來選擇這個模式。具有50%占空比的外部時鐘信號(方波晌该、正弦波或三角波)必須連到OSC32_IN引腳肥荔,同時保證OSC32_OUT引腳懸空,見圖1朝群。
2.5 LSI時鐘
LSI RC擔當一個低功耗時鐘源的角色燕耿,它可以在停機和待機模式下保持運行,為獨立看門狗和自動喚醒單元提供時鐘姜胖。 LSI時鐘頻率大約40kHz(在30kHz和60kHz之間)。LSI RC可以通過控制/狀態(tài)寄存器(RCC_CSR)里的LSION位來啟動或關閉右莱,在控制/狀態(tài)寄存器(RCC_CSR)里的LSIRDY位指示低速內(nèi)部振蕩器是否穩(wěn)定蚜锨,在啟動階段,直到這個位被硬件設置為’1’后慢蜓,此時鐘才被釋放亚再。如果在時鐘中斷寄存器(RCC_CIR)里被允許,將產(chǎn)生LSI中斷申請晨抡。
LSI校準
可以通過校準內(nèi)部低速振蕩器LSI來補償其頻率偏移针余,從而獲得精度可接受的RTC時間基數(shù)饲鄙,以及獨立看門狗(IWDG)的超時時間(當這些外設以LSI為時鐘源)凄诞。校準可以通過使用TIM5的輸入時鐘(TIM5_CLK)測量LSI時鐘頻率實現(xiàn)圆雁,測量以HSE的精度為保證,軟件可以通過調(diào)整RTC的20位預分頻器來獲得精確的RTC時鐘基數(shù)帆谍,以及通過計算得到精確的獨立看門狗(IWDG)的超時時間伪朽。
LSI校準步驟如下:
1.打開TIM5,設置通道4為輸入捕獲模式汛蝙;
2.設置AFIO_MAPR的TIM5_CH4_IREMAP位為’1’烈涮,在內(nèi)部把LSI連接到TIM5的通道4;
3.通過TIM5的捕獲/比較4事件或者中斷來測量LSI時鐘頻率窖剑;
4.根據(jù)測量結果和期望的RTC時間基數(shù)和獨立看門狗的超時時間坚洽,設置20位預分頻器。
2.6 系統(tǒng)時鐘
系統(tǒng)復位后西土, HSI振蕩器被選為系統(tǒng)時鐘讶舰,當時鐘源被直接或通過PLL間接作為系統(tǒng)時鐘時,它將不能被停止需了,只有當目標時鐘源準備就緒了(經(jīng)過啟動穩(wěn)定階段的延遲或PLL穩(wěn)定)跳昼,從一個時鐘源到另一個時鐘源的切換才會發(fā)生,在被選擇時鐘源沒有就緒時肋乍,系統(tǒng)時鐘的切換不會發(fā)生鹅颊,直至目標時鐘源就緒,才發(fā)生切換墓造。在時鐘控制寄存器(RCC_CR)里的狀態(tài)位指示哪個時鐘已經(jīng)準備好了堪伍,哪個時鐘目前被用作系統(tǒng)時鐘。
2.7 RTC時鐘
通 過 設 置 備 份 域 控 制 寄 存 器 (RCC_BDCR) 里 的 RTCSEL[1:0] 位 觅闽, RTCCLK 時 鐘 源 可 以 由HSE/128帝雇、 LSE或LSI時鐘提供,除非備份域復位谱煤,此選擇不能被改變摊求,LSE時鐘在備份域里,但HSE和LSI時鐘不是刘离,因此:
- 如果LSE被選為RTC時鐘:只要VBAT維持供電室叉,盡管VDD供電被切斷, RTC仍繼續(xù)工作硫惕。
- 如果LSI被選為自動喚醒單元(AWU)時鐘:如果VDD供電被切斷茧痕, AWU狀態(tài)不能被保證。
- 如果HSE時鐘128分頻后作為RTC時鐘:如果VDD供電被切斷或內(nèi)部電壓調(diào)壓器被關閉(1.8V域的供電被切斷)恼除,則RTC狀態(tài)不確定踪旷。必須設置電源控制寄存器(PWR_CR)的DPB位為’1’(取消后備區(qū)域的寫保護)曼氛。
2.8 看門狗時鐘
如果獨立看門狗已經(jīng)由硬件選擇或軟件啟動, LSI振蕩器將被強制在打開狀態(tài)令野,并且不能被關閉舀患,在LSI振蕩器穩(wěn)定后,時鐘供應給IWDG气破。
2.9 時鐘輸出
STM32允許輸出時鐘信號到外部MCO引腳聊浅,不過相應的GPIO端口寄存器必須被配置為相應功能。以下8個時鐘信號可被選作MCO時鐘:
- SYSCLK
- HSI
- HSE
- 除2的PLL時鐘
- PLL2時鐘
- PLL3時鐘除以2
- XT1外部3~25MHz振蕩器(用于以太網(wǎng))
- PLL3時鐘(用于以太網(wǎng))在MCO上輸出的時鐘必須小于50MHz(這是I/O端口的最大速度)现使。
時鐘的選擇由時鐘配置寄存器(RCC_CFGR)中的MCO[3:0]位控制低匙。
3 外設時鐘系統(tǒng)
以下介紹不同總線上掛載各種外設,不同的芯片系列可能缺少某些外設碳锈,用戶應根據(jù)自己的芯片型號確定顽冶。
1.AHB總線外設:DMA1、DMA2售碳、SRAM强重、FLASH、CRC团滥、FSMC竿屹、SDIO、OTG(互聯(lián)型設備)灸姊、ETH(互聯(lián)型設備)拱燃。
2.APB1(低速外設總線):TIM2TIM7、TIM12TIM14力惯、WWDG碗誉、SPI2SPI3、USART2USART3父晶、UART4UART5哮缺、I2C1I2C2、USB甲喝、CAN1~CAN2尝苇、BKP、DAC埠胖、CEC糠溜。
3.APB2(高速外設總線):AFIO、GPIOAGPIOG直撤、ADC1ADC2非竿、TIM1、TIM8谋竖、SPI1红柱、USART1承匣、ADC3、TIM15TIM17锤悄、TIM9TIM11韧骗。
4 RCC庫函數(shù)
4.1 時鐘頻率
typedef struct
{
uint32_t SYSCLK_Frequency; /*!< 系統(tǒng)時鐘頻率,單位: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庫函數(shù)
RCC庫函數(shù)原型及實現(xiàn)請詳見stm32f10x_rcc模塊,以下僅介紹各接口的作用娩梨。
函數(shù)名 | 描述 |
---|---|
RCC_DeInit | 將外設RCC寄存器重設為缺省值 |
RCC_HSEConfig | 設置外部高速晶振( HSE) |
RCC_WaitForHSEStartUp | 等待 HSE 起振 |
RCC_AdjustHSICalibrationValue | 調(diào)整內(nèi)部高速晶振( HSI)校準值 |
RCC_HSICmd | 使能或者失能內(nèi)部高速晶振( HSI) |
RCC_PLLConfig | 設置 PLL 時鐘源及倍頻系數(shù) |
RCC_PLLCmd | 使能或者失能 |
PLLRCC_SYSCLKConfig | 設置系統(tǒng)時鐘( SYSCLK) |
RCC_GetSYSCLKSource | 返回用作系統(tǒng)時鐘的時鐘源 |
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 | 使能或者失能內(nèi)部低速晶振( 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 | 使能或者失能時鐘安全系統(tǒng) |
RCC_MCOConfig | 選擇在 MCO 管腳上輸出的時鐘源 |
RCC_GetFlagStatus | 檢查指定的 RCC 標志位設置與否 |
RCC_ClearFlag | 清除 RCC 的復位標志位 |
RCC_GetITStatus | 檢查指定的 RCC 中斷發(fā)生與否 |
RCC_ClearITPendingBit | 清除 RCC 的中斷待處理位 |
5 時鐘系統(tǒng)初始化
假設采用外部提供晶振(HSE)頻率為8MHz沿腰,PLLCLK=SYSCLK=72MHz,PCLK2=72MHz狈定,PCLK1=36MHz颂龙,則時鐘系統(tǒng)初始化代碼如下:
void RCC_config()
{
ErrorStatus HSEStartUpStatus; // 定義錯誤狀態(tài)變量
/* 時鐘系統(tǒng)初始化 */
RCC_DeInit();//將RCC寄存器重新設置為默認值
RCC_HSEConfig(RCC_HSE_ON); //打開外部高速時鐘晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();// 等待外部高速時鐘晶振工作
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//設置AHB不分頻,HCLK=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);//設置APB2不分頻纽什,P2CLK=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //設置APB1 為2分頻措嵌,P1CLK=HCLK/2
FLASH_SetLatency(FLASH_Latency_2);//設置FLASH代碼延時
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能預取指緩存
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, //設置PLL時鐘源,
RCC_PLLMul_9);//外部時鐘不分頻芦缰,為HSE的9倍頻8MHz * 9 = 72MHz
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL準備就緒
{
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//設置PLL為系統(tǒng)時鐘源
while(RCC_GetSYSCLKSource() != 0x08)//判斷PLL是否是系統(tǒng)時鐘
{
}
}
}
/* 以下示例部分外設時鐘初始化 */
/* 使能DMA1時鐘*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* 使能CAN1時鐘*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* 使能GPIOD時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
}